Python 联合查找算法-读取其他';s代码

Python 联合查找算法-读取其他';s代码,python,algorithm,union-find,Python,Algorithm,Union Find,我试图理解上面的代码 我不确定突出显示部分中的“parent”是否指用户需要输入的“defaultdict”对象。此外,有人能向我解释一下“-1”从何而来(请注意,没有一个顶点的值为-1) 我为我愚蠢的问题道歉 我不确定突出显示部分中的“parent”是否指用户需要输入的“defaultdict”对象 否。defaultdict是用户输入的图形parent是表示图中连接组件集的树——它是连接来自相同连接组件的所有节点的任意树。有多种方法可以构建这样的树,有些方法比其他方法更好 例如,您有一个由

我试图理解上面的代码

我不确定突出显示部分中的“parent”是否指用户需要输入的“defaultdict”对象。此外,有人能向我解释一下“-1”从何而来(请注意,没有一个顶点的值为-1)

我为我愚蠢的问题道歉

我不确定突出显示部分中的“parent”是否指用户需要输入的“defaultdict”对象

否。
defaultdict
是用户输入的图形
parent
是表示图中连接组件集的树——它是连接来自相同连接组件的所有节点的任意树。有多种方法可以构建这样的树,有些方法比其他方法更好

例如,您有一个由两个组件组成的图:

1--2
|  |
3--4   5---6
树木(更准确地说,森林)可以

也可以是

1         5      parent[2] = 1, parent[3] = 2, parent[4] = 3, parent[6] = 5
 \         \
  2         6    parent[1] = parent[5] = -1
   \
    3
     \
      4
第一个版本更好,因为树的高度更短。实际上,在上图中表示组件的最佳树是:

     1        5
   / | \      |
  2  3  4     6
正式地说:

  • parent[u]=-1
    表示u是树的根
  • parent[u]==v
    表示u和v属于相同的连接组件。但是请注意,情况并非如此:它可以是
    parent[u]!=v
    但u和v属于相同的连接部件。为什么?因为它可以是
    父[u]==w,父[w]==v
    和u和v通过关联连接
  • 那么,如何确定两个节点u和v是否连接?您需要找到包含u和v的树的根,如果两个根相同,则u和v属于同一棵树,并且它们是连接的
  • 如何找到根?向上移动父节点,直到到达根节点(其父节点为-1)

还有一些技巧可以缩短树的高度,同时保持其表示形式。通常情况下,union find树的高度应该并且可以保持非常短,按照log*(N)的顺序(以log*为准)

欢迎使用SO!最好是添加代码(使用blocktype环境),而不是使用屏幕截图。谢谢!对不起!我是新来的,谢谢你的解释!在示例中,如何将以下树表示为默认字典(父[2]=1,父[3]=1,父[4]=3,父[1]=1)?对不起,这个愚蠢的问题。我不擅长编程……实际上,你可以使树的高度比原木还小*n。查找的摊销成本可以是O(alpha(n)),其中alpha(n)是阿克曼逆函数,其增长速度甚至比log*n还要慢。
     1        5
   / | \      |
  2  3  4     6