《算法导论》笔记 第20章 20.2 可合并堆的操作

来源:互联网 发布:php sleep 停止执行 编辑:程序博客网 时间:2024/06/05 08:15

【笔记】


无序二项树U0包含一个结点,一棵无序的二项树Uk包含两棵无序二项树Uk-1,其中一棵的根节点成为另一棵的根结点的任意子结点。

二项树的性质堆无序二项树仍然成立

4' 对无序二项树Uk,根的度数为k,它大于任何其他结点的度数。根的子女按某种顺序分别为子树U0,U1,...,Uk-1的根。


创建一个新的斐波那契堆


插入一个结点

将x插入到H的根表中。结点x成为一棵单结点的最小堆有序树,同时也是堆中的一棵无序二项树。

连续执行k次INSERT操作,则k棵单结点的树被加到了根表中。

平摊代价O(1)


寻找最小结点

最小结点由指针min[T]指示,故可以在O(1)实际时间内找到最小结点。


合并两个斐波那契堆

将H1和H2的根表拼接成一个新的根表H。


抽取最小结点

先使最小结点的每个子女都成为一个根,并将最小结点从根表中去掉。

通过将度数相同的根连接起来,直至对应每个度数至多只有一个根来调整根表。


若执行EXTRACT-MIN前,斐波那契堆中所有的树都是无序二项树,则在此以后,它们也都是无序的二项树。

树发生变化的方式有两种。根z的每个孩子x成为一个根,都是无序的二项树。度数相同时,连接起来,若各有k个子女,则所得的树具有Uk+1的结构。



【练习】


20.2-1 给出图调用EXTRACT-MIN后得到的斐波那契堆。



20.2-2 证明:二项树的性质对无序二项树也成立。



20.2-3 证明:如果仅需支持可合并堆操作,则在包含n个结点的斐波那契堆中结点的最大度数D(n)至多为floor(lgn)。



20.2-4 插入和合并在最后的步骤中做合并调整。最坏运行时间是多少?



20.2-5 论证:如果对关键字的唯一操作是比较两个关键字,则并非所有的可合并堆操作都有O(1)的平摊运行时间。




0 0