我正在尝试实现一个涉及不断增长的森林的算法(在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
我主要关注的是能够在合并时跟踪树的根,而无需进行昂贵的更新,无论是否与ref类相关,我都会在此方面采取任何合理的解决方案。我的第二个问题是理解为什么Python使用ref类以这种方式运行以及如何修改类以获得所需的行为。非常感谢任何有关这些问题的帮助或见解。
答案 0 :(得分:0)
执行a=b
时,计算机的值为b
。它会调用b.get()
,因此会返回2
。因此,a
指向2
,而不是b
。
如果您使用a.set(b)
,则a
会指向b
。 (我希望!)
让我知道这是否有效,如果有任何需要进一步澄清的话。