非旋FHQ Treap复杂度证明(类比快排)

a,b都是sort之后的排列(从小到大)

由一个排列a构造一颗BST,由于我们只确定了中序遍历=a,但这显然是不能确定一棵树的形态的。

由一个排列b构造一颗Heap(大根),由于没有重复元素,然后人为钦定左儿子<右儿子,那么他的后序遍历=b。

但是一棵树,如果中序遍历和后续遍历确定了,那么他的形态也就确定了。证明考虑构造一种由中序和后序遍历的序列还原一颗确定的树的算法

  • 考虑对于一个后序遍历,最后那个数\(u\)一定是根。

  • 那么确定\(u\)在中序遍历中的位置x,可以发现在x左边的都是左子树,右边的都是右子树。而x自己是根。
  • 根据左右子树的情况把左右子树的后序遍历按顺序抠出来
  • 由于我们得到了左右两颗子树的中序后序遍历,就划分成子问题了。由于每次我们都确定了一个子树的根,那么整棵树都是确定的。

考虑这棵树的深度是多少,不难发现上述算法递归多少层那么树的深度就是多少。

由于中序遍历a是出题人随意构造的。所以我们只能改变后序遍历。

后序遍历是一个排列b[],排列中每个数有一个对应在中序遍历的位置pos[i],其中a[pos[i]]=b[i],我们random_shuffle(b[])就相当于random_shuffle(pos[])。

现在有一个随机排列pos[],考虑我们的算法就变成了 : 选择最后的那个位置上的值pos[n], 然后把排列中\(<pos[n]\)和\(>pos[n]\)的弄出去继续递归。

由于我们是random_shuffle(pos[])的,相当于pos[n]的值是我们随机出来的,所以这个问题等价于快速排序算法。

而快排算法递归深度是\(O(\log n)\) 的。回到原问题我们就证明FHQ Treap的深度是期望\(O(\log n)\)的。

而关于这个算法在各种特定构造数据下的表现,显然和快排算法的表现是等价的。

是不是感觉FHQ Treap突然一下子没有那么玄乎了?

关于非旋FHQ Treap的复杂度证明的更多相关文章

  1. 非旋(fhq)Treap小记

    前置知识:二叉搜索树 以下摘自 ↑: 二叉搜索树每次操作访问O(深度)个节点. 在刻意构造的数据中,树的形态会被卡成一条链,于是复杂度爆炸 它的复杂度与直接暴力删除类似. 但二叉搜索树扩展性强.更复杂 ...

  2. 非旋treap (fhq treap) 指针版

    传送门 看了一圈,好像真的没什么用指针的呢.. 明明觉得指针很好看(什么??你说RE???听不见听不见) 其实我觉得用数组的话不RE直接WA调起来不是更困难嘛,毕竟通过gdb还可以知道哪里RE,WA就 ...

  3. [模板] 平衡树: Splay, 非旋Treap, 替罪羊树

    简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...

  4. 非旋 treap 结构体数组版(无指针)详解,有图有真相

    非旋  $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ  ...

  5. 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)

    原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...

  6. 非旋Treap总结 : 快过Splay 好用过传统Treap

    非旋$Treap$ 其高级名字叫$Fhq\ Treap$,既然叫$Treap$,它一定满足了$Treap$的性质(虽然可能来看这篇的人一定知道$Treap$,但我还是多说几句:$Fhp\ Treap$ ...

  7. 非旋Treap及其可持久化

    平衡树这种东西,我只会splay.splay比较好理解,并且好打,操作方便. 我以前学过SBT,但并不是很理解,所以就忘了怎么打了. 许多用平衡树的问题其实可以用线段树来解决,我们真正打平衡树的时候一 ...

  8. 2827: 千山鸟飞绝 非旋treap

    国际惯例的题面:看起来很不可做的样子,我们先来整理一下题意吧.就是,维护每个点曾经拥有过的最大的两个属性值,支持把点的位置移动.我们用map对每个位置进行离散化,对每个位置建立一个平衡树.为了方便分离 ...

  9. 2081.09.22 Kuma(非旋treap)

    描述 有N张卡片,编号从0到n-1, 刚开始从0到n-1按顺序排好. 现有一个操作, 对于p. l,表示从第p张卡片之后的l张卡片拿到 最前面. 例如n=7的时候, 刚开始卡片序列为0 1 2 3 4 ...

随机推荐

  1. 修改Mariadb存储路径

    大部分基于此文章操作:http://lddyw.blog.51cto.com/4151746/1684364 找个好久的资料,都打算源码安装了,最后终于更改成功了. 环境:CentOS6.6 64位虚 ...

  2. Top 10 Free IT Certification Training Resources

    1. Cybrary Cybrary takes the open source concept and applies it to IT training. Many of the courses ...

  3. Android 错误:IllegalStateException: Can not perform this action after onSaveInstanceState

    今天做Fragment切换.状态保存功能的时候,出现了这个错误: E/AndroidRuntime(12747): Caused by: java.lang.IllegalStateException ...

  4. 1、Ubuntu 16.04 安装.net core

    Register the Microsoft key register the product repository Install required dependencies 参考网址:https: ...

  5. oracle计算记录条数

    和一般的观点相反, count(*) 比count(1)稍快 , 当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO)

  6. 通过git从码云克隆项目到本地

    1.下载安装Git,傻瓜式下一步下一步即可... 2.配置Git: 2.1.选择你要clone到本地的路径:右键--->$ Git Bash Here,弹出Linux命令窗口:$ cd ~直接回 ...

  7. Python--day70--ORM多对多的三种方式

  8. PHP 面试题 一

    1.用PHP打印出前一天的时间格式是2017-5-10 22:21:21(2分) 月,日没有前导零:2017-5-1 22:21:21echo date("Y-n-j H:i:s" ...

  9. Python--day28--面试题

  10. .NET 创建 WebService

    服务器端代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...