Pythonで素集合システムを実装していますが、壁にぶつかりました。システムにツリー実装を使用しており、システムにFind()、Merge()、およびCreate()関数を実装しています。
効率を上げるためにランクシステムとパス圧縮を実装しています。
問題は、これらの関数が互いに素なセットのセットをパラメーターとして受け取らなければならないため、トラバースが困難になることです。
class Node(object):
def __init__(self, value):
self.parent = self
self.value = value
self.rank = 0
def Create(values):
l = [Node(value) for value in values]
return l
Create関数は値のリストを受け取り、適切なデータを含む単一のノードのリストを返します。
マージ関数はこれに似ていると思いますが、
def Merge(set, value1, value2):
value1Root = Find(set, value1)
value2Root = Find(set, value2)
if value1Root == value2Root:
return
if value1Root.rank < value2Root.rank:
value1Root.parent = value2Root
elif value1Root.rank > value2Root.rank:
value2Root.parent = value1Root
else:
value2Root.parent = value1Root
value1Root.rank += 1
ただし、ノードのリストと値(ノードだけでなく)をパラメーターとして受け取る必要があるため、Find()関数を実装する方法がわかりません。Find(set、value)がプロトタイプになります。
ノードがFind(x)のパラメーターとして使用される場合にパス圧縮を実装する方法を理解していますが、このメソッドは私を失望させます。
どんな助けでも大歓迎です。ありがとうございました。
明確にするために編集。