Python字典指针(如何在合并树时跟踪根)

时间:2015-04-21 17:19:29

标签: python dictionary tree

我正在尝试实现一个涉及不断增长的森林的算法(在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

我主要关注的是能够在合并时跟踪树的根,而无需进行昂贵的更新,无论是否与ref类相关,我都会在此方面采取任何合理的解决方案。我的第二个问题是理解为什么Python使用ref类以这种方式运行以及如何修改类以获得所需的行为。非常感谢任何有关这些问题的帮助或见解。

1 个答案:

答案 0 :(得分:0)

执行a=b时,计算机的值为b。它会调用b.get(),因此会返回2。因此,a指向2,而不是b

如果您使用a.set(b),则a会指向b。 (我希望!)

让我知道这是否有效,如果有任何需要进一步澄清的话。