再學並查集
阿新 • • 發佈:2019-01-03
記憶 str oid alpha 並且 inline class ret unit
使用混合策略時,可得到上界\(O(m \alpha{'}(n))\)
對於\(n\)的所有實際值,\(\alpha^{'}(n) \le 3\)
證明是不可能有的。
總之,跑得挺快。
貼代碼
並查集好啊!
雖然並查集很好,但是我對它的掌握卻十分膚淺。
搬運算導
1.單用路徑壓縮復雜度\(O(n+m*(1+log_{2+m/n}n))\)
證明是不可能有的。
2.單用按秩合並並且記憶化復雜度\(O(nlogn+m)\)
由於路徑壓縮也是一種記憶化,所以混合策略也有該上界。
復雜度顯然。
3.假設所有\(link\)在所有\(find\)前,復雜度\(O(m)\),只使用路徑壓縮或使用混合策略。勢能分析一下。
4.眾所周知,\(\alpha(n)=min \{ k:A_{k}(1) \ge n \}\)
可得上界\(O(m \alpha(n))\)
設\(\alpha^{'}(n)=min \{ k:A_{k}(1) \ge lg(n+1) \}\)
使用混合策略時,可得到上界\(O(m \alpha{'}(n))\)
對於\(n\)的所有實際值,\(\alpha^{'}(n) \le 3\)
證明是不可能有的。
總之,跑得挺快。
貼代碼
struct dsu{ int fa[N]; void init(int len){ memset(fa,-1,sizeof(*fa)*(len+1)); } int find(int x){ return fa[x]<0?x:find(fa[x]); } int unite(int x,int y){ x=find(x); y=find(y); if (fa[x]<fa[y]){ fa[x]+=fa[y]; fa[y]=x; } else{ fa[y]+=fa[x]; fa[x]=y; } } };
遞歸寫法好啊!
再學並查集