首页 > 其他分享 >fhq-treap

fhq-treap

时间:2024-05-01 17:44:42浏览次数:24  
标签:右边 le 左边 合并 treap 分裂 fhq size

一些细节

本质是利用合并、分裂实现增、删、查。

根据用途分为两类分裂:

第一类:当作 set 一样使用,就是中序遍历就把数字排序了。分裂操作按照权值分裂。

如果

  1. 根 \(\le k\),那么左边都要归入 \(x\),递归右边,\(x\) 换成右边(看还能接上去多少)

  2. \(>k\) 同理,最后 pushup 一下。

第二类:维护序列,要对序列操作的话就按照 size 分裂,基本和上面一样,需要注意如果是情况1,进入右子树需要减去已经划入左边的 size (即 \(l_{sz}+1\),因为你要保证左边子树是 size 个节点啊,就去右边找剩下的)。

合并方法:

  1. 有一个为空,根返回另一个。
  2. 按照节点生成时的优先级合并,记小的树为 \(x\),大的树为 \(y\)(这是按照分裂时的顺序或者权值大小区分的)。 \(y\) 合到 \(x\) 的右边,或者 \(x\) 合到 \(y\) 的左边。对合到的点 pushup,返回。

接下来就是针对上面的操作的应用:(以第一类为例)

  1. 插入 \(k\)(建立一个单独树,记为 \(a\)),分裂得到 \(<k,\ge k\)(记为 \(b,c\)),合并 \(b,a\),再跟 \(c\) 合并。

  2. 删除,先分裂得到 \(\le k,>k\)(记为 \(a,b\)),再分裂 \(a\) 得到 \(\le k-1,=k\)(记为 \(a,c\)),把 \(c\) 的两个儿子合并删去根,,合并 \(a,c\),再跟 \(b\) 合并。

  3. 排名查询:分裂利用size

  4. 查询排名对应的数:从根开始每次考虑往左还是往右找

  5. 前驱:分裂然后小的里一直往大的走

  6. 后继:分裂然后大的里一直往小的走

第二类类比一下。

标签:右边,le,左边,合并,treap,分裂,fhq,size
From: https://www.cnblogs.com/wscqwq/p/18169498

相关文章

  • FHQ Treap
    P3369【模板】普通平衡树前言:平衡树是一种二叉搜索树,通过一些方法来做到快速维护单点或区间信息和快速查询单点或区间信息,其中包括排名、前驱等等。在\(\rmSTL\)库中虽有实现,但是由于封装的太好以及是可持久化数据结构的基础,还是需要学习的。FHQTreap:FHQTreap是一种不......
  • FHQ
    FHQ平衡树实质:FHQ平衡树又称无旋Treap。(即通过\(Split与Merge\)来替代旋转。)本质上还是一颗二分查找树,再利用随机数来维护相对平衡的树形结构。实现:\(Node\):对于每个节点维护\(siz,pri,key,ls,rs\)。structnode{intls,rs,pri,siz,key;}\(Split\):voidsplit(inti,......
  • 二叉查找树/堆 /Treap/Spaly树串联分析
    二叉查找树(BST)二叉查找树:中序遍历是一个递增的序列。父节点的左子树的所有结点都比父节点小,父节点右子树的结点比父节点都大。在一颗随机构造的BST上,查找一个元素的时间复杂度位O(logn),但是如果我们有序的插入结点,那么BST的高度将位N,时间复杂度位O(n)。importjava.util.Sc......
  • FHQ-treap学习笔记
    平衡树,即平衡二叉搜索树。二叉搜索树(BST),它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。(from百度百科)而在使用这种......
  • Treap 树
    1.概念Treap树是维护二叉查找树平衡的一种方法。它的核心思想是给每个结点设置一个随机的优先级,使它成为一个堆,即父亲的优先级一定小于(或大于)孩子的优先级。大于则为大根堆,小于则为小根堆。本节使用的是小根堆。这样就可以实现概率上的平衡。下图是一棵Treap树的建树方法。......
  • Treap(平衡树)
    Treap前置芝士二叉搜索树(BST),见BST。平衡二叉树(AVL)。先来介绍一下平衡二叉树。背景BST出现以后,人们很快发现一个问题,当其维护一个有序序列时,很可能会退化成链。如图:这样的话,原来\(O(\log{n})\)的复杂度就退化为\(O(n)\),这是我们无法接受的,于是平衡二叉树横空出世......
  • Treap
    前置:BST\(Treap=BST+heap\),通过额外维护堆的性质来避免退化成链的问题。与\(BST\)中结构释义相同的部分不做解释。\(priority\)表示优先级,即该节点在小根堆中的值,\(child[0]\)表示左孩子,\(child[1]\)表示右孩子。\(public\)中,\(empty\):时间复杂度\(O(1)\)。其余操作时间复杂......
  • 平衡树(无旋Treap,范浩强树)学习笔记
    平衡树:YYDS以下是常见的平衡树/要用平衡树实现的算法:Treap(有旋/无旋)Splay树WBLT(WeightBalancedLeafyTree,重量平衡线段树)SBT(SizeBalancedTree,陈启峰树)AVL树B树、B+树笛卡尔树红黑树、左偏红黑树、AA树替罪羊树\(\to\)K-DTree(k-DimensionTree)LT(LeafyTree,平......
  • Treap 学习笔记
    二叉查找树二叉查找树是一棵有点权的二叉树,具有以下几个特征:左孩子的权值小于父亲的权值右孩子的权值大于父亲的权值中序遍历及从小到大排序二叉查找树支持以下几个操作:插入一个数删除一个数找一个数的前驱找一个数的后继询问一个数的排名询问排第几名的数二叉查......
  • Treap
    概述FHQTreap基于Treap发明的“无旋Treap”,代码短,易理解且速度快(在OI算是很优秀的算法了)。FHQTreap核心函数只有两个,分别是分裂和合并。字面意思,就是将某一棵二叉查找树按某种要求分裂成两个或将两个合并成一个。实现变量维护变量名功能root记录所维护......