1编程实现蒂有压缩规则和加权规则的Find和Union算 法,写出主程序设置初始集合中只包含一个元素,随机执行union和find的方法,分别打印数组存储情况用python加上注释
时间: 2024-02-05 11:12:05 浏览: 20
以下是Python实现蒂有压缩规则和加权规则的Find和Union算法的代码,包含主程序设置初始集合中只包含一个元素,随机执行union和find的方法,并打印数组存储情况的注释。
```python
class UnionFind:
def __init__(self, size):
self.parent = list(range(size))
self.rank = [0] * size
self.size = [1] * size
def find(self, x):
# 如果x不是根节点,则将其父节点设置为根节点,同时更新路径上的所有节点的父节点为根节点
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
# 找到x和y的根节点
root_x, root_y = self.find(x), self.find(y)
# 如果x和y已经在同一个集合中,则不需要合并
if root_x == root_y:
return
# 根据加权规则,将节点数少的集合合并到节点数多的集合中
if self.rank[root_x] < self.rank[root_y]:
root_x, root_y = root_y, root_x
self.parent[root_y] = root_x
self.size[root_x] += self.size[root_y]
# 如果两个集合高度相同,则将合并后的集合高度加1
if self.rank[root_x] == self.rank[root_y]:
self.rank[root_x] += 1
def get_size(self, x):
# 返回x所在集合的节点数
return self.size[self.find(x)]
# 创建包含10个元素的集合
uf = UnionFind(10)
# 随机执行10次find和union操作
import random
for i in range(10):
x, y = random.randint(0, 9), random.randint(0, 9)
print("Union", x, y)
uf.union(x, y)
print("Array:", uf.parent, uf.rank, uf.size)
x, y = random.randint(0, 9), random.randint(0, 9)
print("Find", x, y)
print(uf.find(x) == uf.find(y))
print("Array:", uf.parent, uf.rank, uf.size)
```
其中,`parent`数组用于存储每个节点的父节点,`rank`数组用于存储每个节点的高度,`size`数组用于存储每个集合的节点数。在`find`方法中,使用路径压缩规则将路径上的所有节点的父节点直接设置为根节点,以加快后续查找速度。在`union`方法中,根据加权规则将节点数少的集合合并到节点数多的集合中,同时更新高度。在主程序中,随机执行10次find和union操作,并打印每次操作后的数组存储情况。