*集合
**并查集
【应用】File transfer:计算机网络连通;
TSSN【too simple sometimes naive】
***union:
按秩归并【两种】
-高度。高度大的返回时不用改变高度
-规模。最终小规模“贴”到大规模时需要改变规模
【防止成为单支树】
***find:
路径压缩、第一次find操作会“痛苦”,但是后面就find效率高了
return s[X]=find(s[],s[X]);
【三个操作】
1、find函数,一步步往上找到x的父节点【x的父节点和x是“同一个蚂蚱”】
2、递归返回时,s[s[s[n-1]]]=s[s[s[s[n]]]]。路径一下子压短了
3、递归返回时,return的始终是“下图”的“棕色节点”
4、最终是返回s[s[s[s[n]]]]——根节点
【结果】:
【附加】
【转】
我们知道递归危险,当路径上压缩的节点太多时,可能会让你的系统堆栈爆掉。
但“伪递归”不会。非常容易变成循环【?】,编译器就帮助你优化成循环代码。
【引理】
【......】