目录
原因:
优化:
原因:
当路径比较特殊,如图:
非常深,最底层进行find时,循环找根(或者递归找),消耗就比较大。
我们可以进行优化。
优化:
(arr就是并查集的数组)
我们在find找到根时,"可以再来一次",这次直接将arr里的"上面节点"直接换成根节点,这样以后查找会非常快
(但并非以后还是直接根节点,因为根节点之后可能还会变,此时处理不到底层节点,底层节点可能就要多找一两次,不过消耗很少了。)
int find(int aim)
{int cur = aim;while (arr[aim] != aim){aim = arr[aim];}//压缩://while (arr[cur] != cur){int tmp = cur;cur = arr[cur];arr[tmp] = aim;}/return aim;
}
aim正好就是根了,这个时候不要浪费,就去压缩一下。
cur记下最开始根,也是当前要处理的节点
因为要改掉他的arr,所以提前用tmp把他的"前驱节点"(即上面的节点)记录下来,以便可以继续压缩。(然而这里不是。。这里的处理可以少写一句。这里是用tmp记下cur,然后cur去成为下一个要处理的(即他自己的前驱节点),然后就可以对tmp操作了)。