2015-04-21 59 views
0

我試圖實現一個算法(在Python中)涉及到一個正在增長的森林。節點的數量是固定的,並且在每個步驟中添加邊緣。在整個算法過程中,我需要跟蹤樹的根。這是一個相當普遍的問題,例如克魯斯卡爾算法。天真的人可能會在飛行中計算根,但是我的森林太大而無法實現。第二次嘗試可能是保留由節點鍵入的字典,其值是包含該節點的樹的根。這看起來更有希望,但我需要避免更新兩個要合併的樹中每個節點的字典值(樹最終變得非常深,這在計算上花費過高)。我希望,當我發現的題目是:Python字典的指​​針(如何在合併樹時跟蹤根)

Simulating Pointers in 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類以這種方式行事,以及如何修改類以獲得所需的行爲。任何關於這些問題的幫助或見解都非常感謝。

回答

0

當執行a=b時,計算機的值爲b。它叫b.get(),所以返回2。因此,a指向2,而不是b

如果您改用a.set(b),則a將指向b。 (我希望!)

讓我知道這是否工作,如果有什麼需要更多的澄清。