其他分享
首页 > 其他分享> > 可持久/可回退化数据结构

可持久/可回退化数据结构

作者:互联网

可持久化数据结构用来解决这个问题:
1.在某个版本的基础上修改,同时生成新的版本
2.查询某个版本的值。
直接复制版本十分浪费。
为了查询以前的信息,可以不动以前的节点,只建新节点。
这就是可持久化数据结构的思想。
可回退化数据结构比上面的更弱。它用来解决这个问题:
1.在当前版本上进行修改
2.回退一步
这个数据结构的要求比普通数据结构更强,但是比可持久化数据结构更弱。
可以使用一个栈,存储被修改的位置,回退的时候再撤销。
但是很多时候,不能直接这么做。
比如可回退化单调栈,上面这么做时间复杂度是错的。
因为每次插入以后可能删除很多元素。
可以使用二分。由于栈中的元素是单调的,可以二分到需要弹栈的位置,然后把栈顶设为这个位置。
这样子时间复杂度就是正确的。
此外,上面两个数据结构都需要保证无论输入数据怎么样,操作时间复杂度都是一个较低的值val。
可持久化数据结构有这么一个转化:
如果把这个点向生成它的版本连边,则形成一颗树。
这棵树从某节点到根经过的操作就是这个版本经过的修改操作。
dfs整颗树,在到一个节点时插入,离开一个节点的时候删除。
则可持久化问题转化为更弱的可回退化问题。
例题:
可持久化数组
可持久化并查集(没做)
可持久化平衡树(没做)
codechef WEASELSC(想出来了,没做)
集训队互测 unknown
动态半平面交
七彩树(没做,上面一道题弱化版)
异或粽子
购票
bzoj二分图
bzoj城市建设
(其实线段树分治,回滚莫队都需要可回退化数据结构,并且要求时间复杂度严格正确)

标签:持久,复杂度,可回,退化,版本,数据结构,节点
来源: https://www.cnblogs.com/ctmlpfs/p/13657045.html