今天学习了左偏树,这是一个好理解而且好写的数据结构,和二叉堆一样可以在O(1)时间内取出优先级最高的值,O(logn)时间内删除优先级最高的值,不同的是如果要合并两个堆那么二叉堆就只能跪了。而左偏树能在O(logn)的时间内实现两个堆的合并。
左偏树有两个重要的性质,
1、树中每个元素小于或大于其父亲节点的值(堆性质)
2、定义节点的距离为当前节点向下到叶子节点最少所需的边数,叶子节点的距离为0,空节点的距离是-1,令dist[i]表示i节点的距离,那么dist[i]=dist[right[i]]+1;dist[left[i]]>=dist[right[i]],所以左偏树的左右子树都是左偏树。
如下图就是一颗左偏树
左偏树最核心操作就是【合并】。删除最大,插入都可由合并得到
假如我们要构造最小堆
Merge(A,B)表示合并A和B
假如A或B中的一个为空返回另一棵树即可
否则,若A根节点小于B的根节点(否则把A和B交换),把A的根作为新的树的根然后Merge(right(A),B)即可
由于Merge过程中性

左偏树是一种数据结构,具备类似二叉堆的特性,能在O(1)时间内获取最大值,O(logn)时间内删除最大值。其优势在于能快速合并两个堆,复杂度为O(logn)。左偏树有两个关键性质:堆性质与距离定义。文章介绍了左偏树的合并、删除和查询操作,并提供了C++代码示例。此外,还提及了一个使用左偏树解决的HDOJ 1512 Monkey King问题,通过并查集和左偏树维护集合最大值。

403

被折叠的 条评论
为什么被折叠?



