线段树合并与分裂

合并 的时间复杂度证明

image

——引自《算法竞赛进阶指南》

一开始有 m 棵树,只有一个位置有权值,所以一棵树上结点数量为 O(logn)m 棵树的结点总数也就是 O(mlogn)

分析上面的代码,发现每一次进入 merge 函数,要么停止递归,要么继续递归并有一个点被垃圾回收。显然停止递归的 merge 次数与继续递归的 merge 次数同阶(不继续递归的情况是从递归的情况出来的,不会超过其两倍的数量)。

因此整个过程的复杂度就等于继续递归的 merge 函数进入次数的复杂度(每一次执行 merge 在不考虑递归时复杂度 O(1)),也就等同于被删除的结点个数,是不超过 O(mlogn) 的(有点像势能分析?)。

注意复杂度本身和是否回收结点没有关系,只是借以分析而已。

所以整个过程的复杂度也就是 O(mlogn)

——引自 @ix35 的博客

有分裂操作的时间复杂度:每次分裂至多增加 logn 个节点,故此最多存在 2mlogn 个节点,同理可均摊得时间复杂度。


本质

线段树的合并与分裂多半是在权值线段树合并上进行的。因此,合并与分裂在题目当中,大多是用来 快速合并、分裂若干有序序列的

反比同样支持合并操作的 FHQ_Treap,它只能合并大小关系绝对确定的两棵树。

比如,序列 1,3,5,72,4,6,8 合并时,线段树合并得到的结果是 1,2,3,4,5,6,7,8,而 FHQ_Treap 得到的结果为 1,3,5,7,2,4,6,8

posted @   David_Mercury  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示