Я относительно новичок в 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()
не даст других результатов?