您的位置:首页 > 其它

《算法导论》笔记 第19章 19.2 对二项堆的操作

2014-04-30 11:34 162 查看

【笔记】

创建一个新二项堆

寻找最小关键字

最小关键字必在根节点中。

合并两个二项堆

反复连接根节点的度数相同的各二项树

第一阶段,将二项堆H1和H2的根表合并为一个链表H,它按度数排序成单调递增次序。

第二阶段,将相等度数的根连接起来,直到每个度数至多有一个根时为止。

情况1,degree[x]!=degree[next-x]。将指针指向下一个位置。

情况2,当x为具有相同度数的三个根中的第一个时发生,把三个相等度数的根中的第二个和第三个联合起来。

情况3和情况4,当x为具有相同度数的两个根中的第一个时发生。

情况3,key[x]<=key[next-x],故将next-x连接到x上。

情况4,next-x具有更小关键字,故x被连接到next-x上。

BINOMIA-HEAP-UNION的运行时间时间为O(lgn),其中n为二项堆H1和H2中总的结点数。

插入一个结点

构造一个只包含一个结点的二项堆H‘,再在O(lgn)时间内,将其与包含n个结点的二项堆H合并。

抽取具有最小关键字的结点

具有最小关键字的根x被从H的根表中去掉。x的各子女分别为B_{k-1},B_{k-2}...B_0树的根。

得到一个包含x树中除x外每个结点的二项堆H’。

合并H与H‘所得的结果二项堆包含原堆中除x的所有结点。

减小关键字的值

使关键字冒泡上升

删除一个关键字

使得结点x在整个二项堆中具有唯一的最小关键字,来使关键字及其卫星数据信息冒泡上升至树根。

将跟从H中去掉。

【练习】

19.2-1 请写出BINOMIAL-HEAP-MERGE的伪代码。

19.2-2 请给出将关键字为24的结点插入图所示的二项堆后,所得的结果二项堆。

19.2-3 请给出将关键字为28的结点从图中的二项堆中删除后的结果。

19.2-4 讨论使用如下循环不变式时BINOMIAL-HEAP-UNION的正确性。

在while循环迭代开始时,x指向下列之一的根:

该度数下唯一的根;

该度数下仅有两根中的第一个;

该度数下仅有三个根中的第一个或第二个;

而且,根表中在x的前驱之前的所有根结点都有唯一度数,如果x的前驱的度数不同于x,则它在根表中的度数也是唯一的。最后,根表结点的顺序是按结点度数单调递增的。

19.2-5 如果关键字的值可能是OO,为什么过程BINOMIAL-HEAP-MINIMUM可能无法正确工作?重写代码使之正常工作。

19.2-6 假设无法表示出关键字-OO。重写BINOMIAL-HEAP-DELETE过程,使之在这种情况下能正确的工作。运行时间仍为O(lgn)。

19.2-7 讨论二项堆上的插入与一个二进制数增值的关系,以及合并两个二项堆与将两个二进制数相加之间的关系。

19.2-8 在不调用BINOMIAL-HEAP-UNION的前提下,重写INSERT,将一个结点直接插入一个二项堆中。

19.2-9 证明:如果将根表按度数排成严格递减序保存,仍可以在不改变渐进运行时间的前提下实现每一种二项堆操作。

19.2-10 找出使EXTRACT-MIN、DECREASE-KEY、DELETE、UNION的运行时间为Ω(lgn)的输入。解释为什么INSERT,MINIMUM的最坏运行时间是Ω^OO(lgn),而不是Ω(lgn)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: