我試圖實現一個算法(在Python中)涉及到一個正在增長的森林。節點的數量是固定的,並且在每個步驟中添加邊緣。在整個算法過程中,我需要跟蹤樹的根。這是一個相當普遍的問題,例如克魯斯卡爾算法。天真的人可能會在飛行中計算根,但是我的森林太大而無法實現。第二次嘗試可能是保留由節點鍵入的字典,其值是包含該節點的樹的根。這看起來更有希望,但我需要避免更新兩個要合併的樹中每個節點的字典值(樹最終變得非常深,這在計算上花費過高)。我希望,當我發現的題目是:Python字典的指針(如何在合併樹時跟蹤根)
的概念是一個指針,以保持每棵樹的根,只需更新根時樹木被合併。不過,我趕緊跑進以下(不良)行爲:
class ref:
def __init__(self,obj): self.obj = obj
def get(self): return self.obj
def set(self,obj): self.obj=obj
a = ref(1)
b = ref(2)
c = ref(3)
a = b
b = c
print(a,b,c) # => 2, 3, 3
當然期望的輸出將3,3,3。我檢查每一步的地址,我發現a和b確實指向相同的東西(在a = b之後),但是當我設置b = c時a不會更新。
a = ref(1)
b = ref(2)
c = ref(3)
print(id(a),id(b),id(c)) # => 140512500114712 140512500114768 140512500114824
a = b
print(id(a),id(b),id(c)) # => 140512500114768 140512500114768 140512500114824
b = c
print(id(a),id(b),id(c)) # => 140512500114768 140512500114824 140512500114824
我最關心的是能夠當他們無需昂貴的更新合併跟蹤到樹根,我想借此在這方面它是否涉及引用類的任何合理的解決方案。我關心的第二個問題是理解Python爲什麼用ref類以這種方式行事,以及如何修改類以獲得所需的行爲。任何關於這些問題的幫助或見解都非常感謝。