fhq-treap
本质是利用合并、分裂实现增、删、查。
根据用途分为两类分裂:
第一类:当作 set
一样使用,就是中序遍历就把数字排序了。分裂操作按照权值分裂。
如果
-
根
,那么左边都要归入 ,递归右边, 换成右边(看还能接上去多少) -
同理,最后pushup
一下。
第二类:维护序列,要对序列操作的话就按照 size
分裂,基本和上面一样,需要注意如果是情况1,进入右子树需要减去已经划入左边的 size
(即 size
个节点啊,就去右边找剩下的)。
合并方法:
- 有一个为空,根返回另一个。
- 按照节点生成时的优先级合并,记小的树为
,大的树为 (这是按照分裂时的顺序或者权值大小区分的)。 合到 的右边,或者 合到 的左边。对合到的点pushup
,返回。
接下来就是针对上面的操作的应用:(以第一类为例)
-
插入
(建立一个单独树,记为 ),分裂得到 (记为 ),合并 ,再跟 合并。 -
删除,先分裂得到
(记为 ),再分裂 得到 (记为 ),把 的两个儿子合并删去根,,合并 ,再跟 合并。 -
排名查询:分裂利用size
-
查询排名对应的数:从根开始每次考虑往左还是往右找
-
前驱:分裂然后小的里一直往大的走
-
后继:分裂然后大的里一直往小的走
第二类类比一下。
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/18169498
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步