|
|
@ -86,7 +86,7 @@ A naive Implementation of `find(...)` is simple enough to write:
|
|
|
|
```python
|
|
|
|
```python
|
|
|
|
def find(self, elem: int) -> int:
|
|
|
|
def find(self, elem: int) -> int:
|
|
|
|
# If `elem` is its own parent, then it is the root of the tree
|
|
|
|
# If `elem` is its own parent, then it is the root of the tree
|
|
|
|
if (parent: = self._parent[elem]) == elem:
|
|
|
|
if (parent := self._parent[elem]) == elem:
|
|
|
|
return elem
|
|
|
|
return elem
|
|
|
|
# Otherwise, recurse on the parent
|
|
|
|
# Otherwise, recurse on the parent
|
|
|
|
return self.find(parent)
|
|
|
|
return self.find(parent)
|
|
|
@ -98,7 +98,7 @@ do a small optimization called _path splitting_.
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
```python
|
|
|
|
def find(self, elem: int) -> int:
|
|
|
|
def find(self, elem: int) -> int:
|
|
|
|
while (parent: = self._parent[elem]) != elem:
|
|
|
|
while (parent := self._parent[elem]) != elem:
|
|
|
|
# Replace each parent link by a link to the grand-parent
|
|
|
|
# Replace each parent link by a link to the grand-parent
|
|
|
|
elem, self._parent[elem] = parent, self._parent[parent]
|
|
|
|
elem, self._parent[elem] = parent, self._parent[parent]
|
|
|
|
return elem
|
|
|
|
return elem
|
|
|
|