高级数据结构-可并堆

可并堆,就是可以合并的堆。堆满足一个性质,就是当前节点,都大于或者等于他的所有子树上的节点,自然在这里我所讲的是结点的权值。显而易见,既然可并堆是堆的一种,容易推出,可并堆也满足这个性质。

现在思考一个问题,当题目里需要合并两个堆的时候,该如何合并呢?如果只是普通的堆的话,我们可以运用启发式合并的思想,每一次把size小的堆的点暴力插入到size大的堆里面,这个方法十分不优秀,时间复杂度是O(nlog2n)。所以我们会用可并堆来实现这个问题。

可并堆是一种运用到左偏树思想的堆,何为左偏树?左偏树顾名思义就是偏向左面的树,如左图就是一棵左偏树,这棵树明显满足一个性质。我们定义dis[p]为从p节点出发可以向右走的最大步数,从右图中可以看到,当前点的左儿子的dis值都比右儿子的dis值大,只要满足这个性质就是左偏树。

学过左偏树之后,我们就可以学习可并堆了,可并堆的难点就是合并,那么应该如何合并呢?为了能保证时间复杂度,我们每一次合并都应该把新的节点放在当前的节点的右儿子上,这个是一个递归的过程,每一次把当前的两个节点进行比较,留下权值大的点,然后递归下去把另一个点和留下的点的右儿子进行比较,如此下去,进行合并。当然每一次回溯之前,我们都需要判断当前节点的左右两个儿子的dis值,如果右儿子的dis值大于左儿子的dis值,则交换左右儿子。

posted @ 2024-07-14 14:45  mcr130102  阅读(4)  评论(0编辑  收藏  举报
请不要抄袭任何人的博客,这是对一名开发者最基本的尊重。