AcWing 算法提高课 可持久化
可持久化的前提:数据结构本身的拓扑结构不变
trie、线段树、树状数组、堆等都可持久化
平衡树(一般)需要左旋和右旋,不可持久化
可持久化希望将数据结构的全部修改记录下来(历史版本)
核心思想:只记录每一个版本与前一个版本不一样的地方
1、可持久化Trie
可以发现,绿线表示同一个点,但是下方的子树有修改(需要裂开),跨版本的蓝线,可以连到没有修改的子树。
每一个版本,只对比和上一个版本不一样的地方
算法流程
开辟一个新的根,然后向下遍历时,如果上一个版本已经存在则复制(连出全部跨版本的蓝线)。
tr[q][si]相当于有变化的位置裂开一个新的节点(绿线对应的右侧位置),或者新开辟一个节点 。
例题:https://www.acwing.com/problem/content/258/
可持久化trie维护数字的前缀异或和
2、可持久化线段树(主席树)
不能用堆的方式存,要用指针的方式存
注意:可持久化线段树(一般)难以处理懒标记,故难以进行区间修改操作
可持久化线段树由于不用新添加点,(每一个节点在上一个版本已经存在了),比trie好写?
例题:区间第k小数
求数组下标区间内的第k小数
https://www.acwing.com/problem/content/description/257/
线段树表示数值区间中存在的数的个数。
每个版本表示插入第i个数字后的线段树。
然后在线段树上二分,如果在左边可以查到k个以上的数就去左边,否则去右边。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人