代码改变世界

算法导论-用于不相交集合的数据结构

2012-05-15 11:33  meteorgan  阅读(895)  评论(0编辑  收藏  举报

21.2-4 对于图21-3中操作序列的运行时间,给出其紧确的渐近界。假定采用的是链表表示和加权合并启发式策略。

  解:make-set,O(n);加权合并启发,每次将较短链表链接到较长链表,即每次将长度为1的集合链接到另外的链表上,时间O(n)。总时间O(n)。

21.2-5 当采用链表表示时,给出对UNION的一个简单的改动,使得无需让tail指针指向每个链表中的最后一个对象。无论是否采用了加权合并启发式策略,你所做的修改不应改变UNION过程的渐进运行时间。

  解:设合并的链表为A, B,将B链接到A上。可以将A的第一个元素指向下一个元素的指针指向head[B],然后遍历B,更改B中元素指向链表第一个元素的指针。然后将B中最后一个元素的指向下一个元素的指针指向A中的第二个元素。

 

21.3-4 证明:在采用了按秩合并和路径压缩时,任意一个包含m个MAKE-SET, FIND-SET,LINK的操作序列(其中所有的LINK操作出现在FIND-SET操作之前)需要O(m)的时间。在同样情况下,如果仅用路径压缩启发式呢?

  解:采用记账法:对每个MAKE-SET(x)操作收取2元费用,1元用来支付MAKE-SET(x)操作,另外1元用来支付x出现在FIND-SET的路径上,并成为根节点的孩子的操作。FIND-SET(x)操作收取1元费用,LINK操作收取1元费用。这样m个操作的需要O(m)时间,其中并未用来按秩合并策略,故仅用路径压缩启发式所需的时间也为O(m)。

 

21-1 脱机最小值

  解:a) 4 3 2 6 8 1

              b) 略

         c) 使用不相交集合数据结构,并将所有合法的集合kj 按照j的顺序用单个链表相连。OFF-LINE-MINIMUM(m,n)第二行相当于find-set(i),第6行相当于在链表中合并两个相邻元素并执行union操作。每个操作的次数不超过n。又m = O(n),所以最坏情况下时间复杂度为O(mα(n))。