可持久化线段树为什么被叫做主席树 附主席树讲解

可持久化线段树讲解

它可以记录线段树历史状态,对历史状态进行查询。

又名主席树。

因为线段树是从叶节点往上修改,而这个过程中只有修改一些节点,所以,别的节点可以不动。

可持久化线段树就是只对修改过的节点进行复制。别的节点保留不动。这样空间就不会炸。

如果复制一整棵树的话,空间复杂度是 O ( n ∗ m ) O(n*m) Onm)

图解:

图是我自己画的,可能丑了点。

在这里插入图片描述

红色表示原来的树的部分,黄色是第一次修改,蓝色是第二次修改。可以发现,蓝色是在黄色的基础上进行修改的。

这样子的好处就是空间的优化。

其余操作与线段树一样。

---------------------------以上内容摘自本人的CSDN博客

例题代码: 结合图就非常容易理解了,对吧。

鄙人的博客

名称由来

有一个人,他叫做 黄嘉泰 ,他发明了可持久化线段树。

他的姓名拼音:hjt

而某位伟大的提倡科学强国的主席先生的姓名拼音:hjt

所以,主席树来了。

总有些人说是因为持久才叫做主席树…

谢谢阅读。

### 可持久化线段树的空间复杂度分析 对于每次更新操作,在最坏情况下只会改变从根到某个叶子节点路径上的所有节点。由于线段树的高度为 \(O(\log n)\),因此一次修改最多会创建新的节点数量也是 \(O(\log n)\)[^4]。 当执行多次更新时,假设进行了\(m\)次单点修改,则理论上新增加的总节点数不会超过\(m \times O(\log n)\)。这意味着相比于直接构建多棵独立完整的线段树所需的\(O(mn)\)级别空间开销而言,采用可持久化的策略能够显著减少内存占用量[^1]。 另外值得注意的是,并不是每一次查询都会导致新节点的产生;只有写入(即修改)才会触发复制并新建部分结构的操作。读取任意旧版本的数据依然高效快捷,因为这些操作仅仅是沿着已存在的分支遍历而已。 综上所述,可持久化线段树的整体空间复杂度大约为初始建立一棵线段树所需的空间加上所有修改所带来的额外消耗之和,即约为\(O(n + m\log n)\),其中\(n\)代表数组大小而\(m\)表示总的更新次数。 ```python # Python伪代码展示如何估算空间需求 def estimate_space_usage(array_size, update_times): base_tree_cost = array_size * 4 # 初始线段树成本 extra_node_per_update = math.log2(array_size) # 每次更新可能增加的新节点数目 total_extra_nodes = update_times * extra_node_per_update return base_tree_cost + int(total_extra_nodes) print(f"Estimated space usage: {estimate_space_usage(10**5, 10**4)} nodes") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值