用python编写程序实现带有压缩规则和加权规则的Find和Union算法,写出主程序设置初始集合中只包含一个元素,随机执行union和find的方法,分别打印数组存储情况
时间: 2024-02-05 21:11:20 浏览: 56
我用Python写的一些算法
5星 · 资源好评率100%
以下是带有压缩规则和加权规则的Find和Union算法的Python实现:
```python
class UnionFind:
def __init__(self, n):
self.parent = [i for i in range(n)]
self.size = [1 for i in range(n)]
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
px, py = self.find(x), self.find(y)
if px == py:
return
if self.size[px] > self.size[py]:
px, py = py, px
self.parent[px] = py
self.size[py] += self.size[px]
```
其中,`parent`数组存储每个节点的父节点,`size`数组存储每个节点所在的集合的大小。
主程序如下:
```python
import random
n = 10 # 初始化集合中只包含一个元素
uf = UnionFind(n)
for i in range(20): # 随机执行20次union和find操作
op = random.choice(['union', 'find'])
if op == 'union':
x, y = random.randint(0, n-1), random.randint(0, n-1)
uf.union(x, y)
else:
x = random.randint(0, n-1)
uf.find(x)
print(' '.join([str(uf.parent[i]) for i in range(n)]))
```
每次执行完一个操作后,打印出`parent`数组的当前状态。这样可以看到每个节点所在的集合。
阅读全文