非旋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. 1176. Two Ends

    题目链接地址:http://soj.me/1176 题目大意:两头取数.第一个人随机取,第二个人用贪婪算法(每次都取大的),求两人取数在第一个人赢的情况下的最大分差.使用贪婪算法时,如果左右两边相等, ...

  2. 异常处理之多重catch

    package com.sxt.exception.test1; import java.util.InputMismatchException; import java.util.Scanner; ...

  3. Python深入:修改Python搜索路径

    当Python执行import语句时,它会在一些路径中搜索Python模块和扩展模块.可以通过sys.path查看这些路径,比如: >>> import sys >>&g ...

  4. JS遍历数组

    for 如果用var会造成变量声明提前等问题for(var i = 1; i <= arr.length; i++){ console.log(arr[i - 1]);} for(let i = ...

  5. 学习PHP好,还是Python好呢?

    首先简单介绍一下Python. Python在出现以来,已经有数以千计基于这项技术的网站和软件项目,Python因其独有的特点从众多开发语言中脱颖而出,深受世界各地的开发者喜爱. 下面,我们列举了Py ...

  6. DOMjudge配置

    DOMjudge配置补充 系统环境为 Debbian GNU/Linux 9 (stretch) 64-bit 在Web server configuration中, ln -s etc/apache ...

  7. 2013年NOIP普及组复赛题解

    题目涉及算法: 计数问题:枚举: 表达式求值:栈: 小朋友的数字:动态规划: 车站分级:最长路. 计数问题 题目链接:https://www.luogu.org/problem/P1980 因为数据量 ...

  8. H3C CHAP验证

  9. 深入java面向对象四:Java 内部类种类及使用解析(转)

    内部类Inner Class 将相关的类组织在一起,从而降低了命名空间的混乱. 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分. Java中的内部类共分为四种: 静态 ...

  10. python的if判断

    if 判断条件的时候,如果是多个条件一起进行判断,那么就需要逻辑运算符   并且-----------and 或者-----------or 非(取反)----not   if 条件1 and 条件2 ...