То, что я имею до сих пор, в значительной степени основано на странице 571 «Введение в алгоритмы» Кормена и др.
У меня есть класс Node в python, который представляет набор:
class Node:
def __init__(self, parent, rank = 0):
self.parent = parent
self.rank = rank
Эта реализация будет использовать List
узлов в качестве леса (я открыт для более эффективных способов хранения наборов).
Initialize()
возвращает список узлов, которые я буду хранить впеременная set
и передача в другие функции.
Find
ищет значение в лесу и возвращает набор, в котором оно появляется. Я решил использовать for s in range(len(set)):
, чтобы в рекурсии я могсократить список наборов, передаваемых set[s:]
.
<code>def Find(set, value):
for s in range(len(set)):
if value != set[s].parent:
set[s].parent = Find(set[s:], set[s].parent)
return set[s]
Merge
объединяет наборы в лесу, находя их и продвигая наборы с более высоким рейтингом.
<code>def Merge(set, value1, value2):
set_val_1 = Find(set, value1)
set_val_2 = Find(set, value2)
if set_val_1.rank > set_val_2.rank:
set_val_2.parent = set_val_1
else:
set_val_1.parent = set_val_2
if set_val_1.rank == set_val_2.rank:
set_val_2.rank += 1
Я получаю некоторые ошибки, когда я Find
с и Merge
с, а именно Find
не возвращает правильный набор, и поэтому я не уверен, если Merge
работает как надо.Буду признателен за помощь, чтобы убедиться, что функции реализованы правильно.