【发布时间】:2019-05-31 02:01:16
【问题描述】:
我对 Python 比较陌生。我正在研究不相交集,并按如下方式实现:
class DisjointSet:
def __init__(self, vertices, parent):
self.vertices = vertices
self.parent = parent
def find(self, item):
if self.parent[item] == item:
return item
else:
return self.find(self.parent[item])
def union(self, set1, set2):
self.parent[set1] = set2
现在在驱动代码中:
def main():
vertices = ['a', 'b', 'c', 'd', 'e', 'h', 'i']
parent = {}
for v in vertices:
parent[v] = v
ds = DisjointSet(vertices, parent)
print("Print all vertices in genesis: ")
ds.union('b', 'd')
ds.union('h', 'b')
print(ds.find('h')) # prints d (OK)
ds.union('h', 'i')
print(ds.find('i')) # prints i (expecting d)
main()
所以,起初我将所有节点初始化为单独的不相交集。然后联合bd 和hb 组成集合:hbd 然后合并hi,这应该(如我所料)给我们集合:ihbd。我知道由于在union(set1, set2) 的这一行中设置了父级:
self.parent[set1] = set2
我将h 的父级设置为i,从而将其从bd 的集合中删除。如何实现一组ihbd,其中union() 中的参数顺序不会产生不同的结果?
【问题讨论】:
-
你不应该在构造函数中使用
parent参数,因为调用者对于指定的内容没有任何选择。您应该在 init 而不是 main() 中填充它
标签: python-3.x algorithm data-structures disjoint-sets