Python 联合查找算法-读取其他';s代码
我试图理解上面的代码 我不确定突出显示部分中的“parent”是否指用户需要输入的“defaultdict”对象。此外,有人能向我解释一下“-1”从何而来(请注意,没有一个顶点的值为-1) 我为我愚蠢的问题道歉 我不确定突出显示部分中的“parent”是否指用户需要输入的“defaultdict”对象 否。Python 联合查找算法-读取其他';s代码,python,algorithm,union-find,Python,Algorithm,Union Find,我试图理解上面的代码 我不确定突出显示部分中的“parent”是否指用户需要输入的“defaultdict”对象。此外,有人能向我解释一下“-1”从何而来(请注意,没有一个顶点的值为-1) 我为我愚蠢的问题道歉 我不确定突出显示部分中的“parent”是否指用户需要输入的“defaultdict”对象 否。defaultdict是用户输入的图形parent是表示图中连接组件集的树——它是连接来自相同连接组件的所有节点的任意树。有多种方法可以构建这样的树,有些方法比其他方法更好 例如,您有一个由
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
正式地说:
表示u是树的根parent[u]=-1
表示u和v属于相同的连接组件。但是请注意,情况并非如此:它可以是parent[u]==v
但u和v属于相同的连接部件。为什么?因为它可以是parent[u]!=v
和u和v通过关联连接父[u]==w,父[w]==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