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

Python指针字典(合并树时如何跟踪根),python,dictionary,tree,Python,Dictionary,Tree,我正在尝试实现一个算法(用Python),它涉及一个不断增长的森林。节点的数量是固定的,并且在每一步都会添加一条边。在整个算法过程中,我需要跟踪树的根。这是一个相当常见的问题,例如Kruskal算法。天真的人可能会计算根的飞行,但我的森林太大,使这是可行的。第二种尝试可能是保持由节点键入的字典,其值是包含该节点的树的根。这似乎更有希望,但我需要避免更新要合并的两棵树中每个节点的字典值(树最终会变得非常深,这在计算上太昂贵)。当我发现这个话题时,我充满了希望: 其概念是保留一个指向每个树的根的指

我正在尝试实现一个算法(用Python),它涉及一个不断增长的森林。节点的数量是固定的,并且在每一步都会添加一条边。在整个算法过程中,我需要跟踪树的根。这是一个相当常见的问题,例如Kruskal算法。天真的人可能会计算根的飞行,但我的森林太大,使这是可行的。第二种尝试可能是保持由节点键入的字典,其值是包含该节点的树的根。这似乎更有希望,但我需要避免更新要合并的两棵树中每个节点的字典值(树最终会变得非常深,这在计算上太昂贵)。当我发现这个话题时,我充满了希望:

其概念是保留一个指向每个树的根的指针,并在合并树时简单地更新根。但是,我很快就遇到了以下(不受欢迎的)行为:

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类中采用这种方式,以及如何修改该类以获得所需的行为。非常感谢您对这些问题的任何帮助或见解。

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

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

让我知道这是否有效,如果有什么需要进一步澄清