差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン両方とも次のリビジョン
programming_algorithm:data_structure:union_find_tree [2021/01/31] ikatakosprogramming_algorithm:data_structure:union_find_tree [2021/01/31] – [実装] ikatakos
行 84: 行 84:
     * ${\rm table}[x]$ が負ならば、$x$ は代表。絶対値はランクを示す     * ${\rm table}[x]$ が負ならば、$x$ は代表。絶対値はランクを示す
     * ${\rm table}[x]$ が非負ならば、$x$ は代表でない。値は $x$ の親を示す     * ${\rm table}[x]$ が非負ならば、$x$ は代表でない。値は $x$ の親を示す
-    * 最初は、$n$個の要素が別々の$n$個のグループに所属している状態 +    * 最初は、$n$ 個の要素が別々の $n$ 個のグループに所属している状態 
-  * ''_root''で代表を再帰的に探索する+  * ''root''で代表を再帰的に探索する
     * ついでに経路圧縮を行う     * ついでに経路圧縮を行う
  
-<note> 2020/05 _rootを非再帰に変更(特にPyPyで高速化) </note>+<note> 2020/05 rootを非再帰に変更(特にPyPyで高速化) </note>
  
 <sxh python> <sxh python>
行 99: 行 99:
         self.table = [-1] * n         self.table = [-1] * n
  
-    def _root(self, x):+    def root(self, x):
         stack = []         stack = []
         tbl = self.table         tbl = self.table
行 110: 行 110:
  
     def find(self, x, y):     def find(self, x, y):
-        return self._root(x) == self._root(y)+        return self.root(x) == self.root(y)
  
-    def union(self, x, y): +    def unite(self, x, y): 
-        r1 = self._root(x) +        r1 = self.root(x) 
-        r2 = self._root(y)+        r2 = self.root(y)
         if r1 == r2:         if r1 == r2:
             return             return
行 130: 行 130:
 if __name__ == '__main__': if __name__ == '__main__':
     ins = UnionFind(4)     ins = UnionFind(4)
-    ins.union(0, 1) +    ins.unite(0, 1) 
-    ins.union(2, 3)+    ins.unite(2, 3)
     print(ins.find(0, 3))  # False     print(ins.find(0, 3))  # False
-    ins.union(1, 2)+    ins.unite(1, 2)
     print(ins.find(0, 3))  # True     print(ins.find(0, 3))  # True
  
programming_algorithm/data_structure/union_find_tree.txt · 最終更新: 2023/05/26 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0