@w1024020103
2017-04-09T10:19:06.000000Z
字数 911
阅读 564
CS61B
选择一种data structure来表达Sets:
我们用Array:
具体的实施:为什么这儿是N+2到2N+2次array access呢?这里注意一下array access指的是什么
最坏情况是if语句都判断为真,那么if语句算一次access,另一句赋值算一次access;而最好情况是if语句都判断为false,那么就只有if语句这一次access,再加上上面的2次access,所以一共有N+2 ~ 2N+2次array access:
Runtime:
现在我们想提高Connect操作的效率,那么我们该如何调整set的表示方法,能够使得connect两个sets只需要改变一个值?
现在我们不用id[],而是给每个node一个parent:
比如现在我们要connect(5,2),我们就前一个数字的根变为后一个数字的根的子分枝:
这种方法存在一种问题,树可能变得很长很长:
具体实施:
Performance:
因为这里的find()的worst case其实是O(N),(worst case下的big theta又是Θ(N)),所以相应的connect(里面有find())是O(N),isConnected()也是O(N);
改进一下Quick Union来避免tall trees:
最少需要改变:
Weighted Quick Union Performance:
Performance Summary:
要判断isConnected()的时候,将两个Node所在的分支中每一个Node都改为直接跟root相连:
这样的话,N个Nodes上M次操作需要 O(N + Mlg*N); lg*N最多不会超过5,这个值约等于O(N+M);
α(N):Ackermann function
改变后的find():
代码:
Performance分析: