[关闭]
@w1024020103 2017-04-09T10:19:06.000000Z 字数 911 阅读 564

Lecture 20: Disjoint Sets

CS61B


Quick Find

选择一种data structure来表达Sets:

1.JPG-51.6kB

我们用Array:

2.JPG-73.5kB

具体的实施:为什么这儿是N+2到2N+2次array access呢?这里注意一下array access指的是什么

3.JPG-70.6kB

最坏情况是if语句都判断为真,那么if语句算一次access,另一句赋值算一次access;而最好情况是if语句都判断为false,那么就只有if语句这一次access,再加上上面的2次access,所以一共有N+2 ~ 2N+2次array access:
7720398397@chatroom_1491669513562_60.png-55.6kB

Runtime:

4.JPG-47.4kB

Quick Union

现在我们想提高Connect操作的效率,那么我们该如何调整set的表示方法,能够使得connect两个sets只需要改变一个值?

5.JPG-68.1kB

现在我们不用id[],而是给每个node一个parent:

6.JPG-83.1kB

比如现在我们要connect(5,2),我们就前一个数字的根变为后一个数字的根的子分枝:
7.JPG-63.7kB

这种方法存在一种问题,树可能变得很长很长:

8.JPG-74.5kB

具体实施:
9.JPG-74.9kB

Performance:
因为这里的find()的worst case其实是O(N),(worst case下的big theta又是Θ(N)),所以相应的connect(里面有find())是O(N),isConnected()也是O(N);

10.JPG-72.3kB

Weighted Quick Union

改进一下Quick Union来避免tall trees:

12.JPG-75.5kB

最少需要改变:

13.JPG-89.6kB

Weighted Quick Union Performance:
14.JPG-77.6kB

Performance Summary:
15.JPG-94.7kB

Path Compression

要判断isConnected()的时候,将两个Node所在的分支中每一个Node都改为直接跟root相连:

17.JPG-95.1kB

这样的话,N个Nodes上M次操作需要 O(N + Mlg*N); lg*N最多不会超过5,这个值约等于O(N+M);
α(N):Ackermann function

改变后的find():

21.JPG-66.6kB

代码:
18.JPG-84.8kB

Performance分析:

19.JPG-78.7kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注