算法导论-用于不相交集合的数据结构
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))。