[关闭]
@w1024020103 2017-04-10T09:41:20.000000Z 字数 1965 阅读 635

Disjoint Sets Study Guide

CS61B


Review

Dynamic Connectivity Problem

这一届主要讲动态连接问题,目的是要得到一种data type,它可以使得固定数量N个对象支持下列操作:

22.JPG-52.5kB

Quick Find

24.JPG-50.3kB

connect的runtime是Θ(N),因为connect(p,q)的时候,不只是要把p的id变成q的id,而是要把任何id跟p的id相等的所有元素的id变为q的id,以为这需要iterate over the entire array:

23.JPG-24kB

Quick Union

Quick Union改变了id[]的含义,现在id[i]代表i的parent,find会找到某个对象最上端的根;现在要connect两个对象,只需要将前一个对象的根连接到后一个对象的根下,就只需one change to id[]:

25.JPG-58.2kB

虽然现在connect只require one change to id[],但是root finding却可能需要爬整个tree,所以connect的worst case是是Θ(N):

26.JPG-71.8kB

WeightedQuickUnion

27.JPG-60.8kB

WeightedQuickUnion相比QuickUnion,connect(p,q)时 不是把前一个元素的根连接到后一个元素的根下方,而是把smaller tree的root连接到bigger tree的root下方(这里的small指的是该tree的元素少,而不是深度少);
这样的情况下,树高为lgN, 所以root finding的时候worst case需要O(lgN):
28.JPG-85.2kB

WeightedQuickUnionWithPathCompression:

Path Compression即在find()被call时,每一个along the way的node都会指向root:

29.JPG-43.9kB

log*(N) 即Log star N, 最多为5,所以相对来说runtime减小了不少

30.JPG-80.9kB

比较:
31.JPG-71.7kB

B level
Problem 1 from the Princeton Fall 2011 midterm.
32.JPG-37.3kB

32.JPG-118.3kB

注意要满足height < lgN, height是从顶端到末段元素数量-1;
B项也重要,注意到0位parent的一分支比9为parent的另一分支size大(元素多),那0作parent的分支是不可能连接到9之下的;同时也可以根据0的Parent 9所在树的size应该至少double0作parent所在树的size来判断这里不满足条件

33.JPG-34.2kB

Problem 1 from the Princeton Fall 2012 midterm.
34.JPG-98.4kB

C项比较重要,wighted quick union有一条标准:
The size of the tree at least doubles since weight(T2) ≥ weight(T1)
但这里3的parent9所拥有的元素数目只比3多1,没有3的两倍:

14.JPG-77.6kB

答案:
35.JPG-25.8kB

3.37.JPG-28.3kB

课上的slide讲到weighted quick union的runtime:

36.JPG-93kB

runtime包括了Union和isConnected操作,但不要忘了还有array creation需要的runtime:
38.JPG-45.6kB

array creation:
39.JPG-33.3kB

5.
40.JPG-22.5kB

这道题乍看上去没毛病,但我们看一看Quick Find在课程slides里的实施:
41.JPG-24.1kB

正确实施多了两行code:

int pid = id[p];
int qid = id[q];

而在上面的直觉实施里,面临着一个问题:即id[p]在for loop里被变为id[q],当存在r>p的id[r] = id[p]时,它就不会被改变成id[q]了

42.JPG-20.4kB

A LEVEL 3
43.JPG-21.2kB

  1. public class weightedQUwithPC{
  2. int [] parent;
  3. int [] size;
  4. public weightedQUwithPC(int N) {
  5. parent = new int[N];
  6. size = new int[N];
  7. for(int i = 0; i< parent.length; i++){
  8. parent[i] = i;
  9. size[i] = 1;
  10. }
  11. }
  12. public void union(int p, int q) {
  13. int i = find[p];
  14. int j = find[q];
  15. if(i == j){
  16. return;
  17. }
  18. if(size[i] > size[j]){
  19. parent[j] = i;
  20. size[i] += size[j];
  21. }else {
  22. parent[i] = j;
  23. size[j] += size[i];
  24. }
  25. }
  26. public int find(int p) {
  27. if ( parent[p] == p) {
  28. return p;
  29. }
  30. while(! parent[p] == p){
  31. p = parent[p]
  32. }
  33. return p;
  34. }
  35. public boolean connected(int p, int q) {
  36. return find(p) == find(q);
  37. }
  38. }

find()写的有问题,参考slide:

18.JPG-84.8kB

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