西南某高校准大二某five,立志暑假拿下《算法》的一半!
由于懒得看这本书前面对JAVA的介绍,我直接跳到第一章最后学起了动态连通性算法。讲真,确实有被震撼到。
之前我对树和森林的认知都停留在链表和数组构建成的二叉树上。而quick_union算法则让我看到了数组自身实现森林的可能性——利用数组的索引和内存中的值组成类似链表的东西(咦怎么好像在高中数学里见过)。
int find(int p){
while (p != id[p])
p = id[p];
return p;
}
这段代码就是quick_union算法中数组构建的树的查找。跟原先的quick_find算法相比,find算法真的不够快——最坏情况下查找到数据需要的时间为N(quick_find的代码贴在下面了)。
int quick_find(int p) {
return id[p]; }
但是动态连通性算法解决的主要问题是添加连通关系的操作(即union())太慢。在quick_find算法中,我们可以看到,它的union()在最坏情况下所需时间为N的平方,此时函数内部进行了N+2次数组访问,且使用了N-1次union()函数,所需时间为(N+2)(N-1)~N的平方。这个速度确实有些慢。
void quick_find_union