当前位置: 首页 > 知识库问答 >
问题:

带路径压缩的加权快速联合-实现

南宫星波
2023-03-14

我正在为联合/查找结构实现快速联合算法。在“Java中的算法”一书网站上给出的实现中,普林斯顿实现在实现路径压缩(在find()方法中)时无法保持树的大小不变。这不应该对算法产生不利影响吗?还是我错过了什么?另外,如果我是对的,我们将如何修改大小数组?

共有1个答案

段良弼
2023-03-14

除非我错了,否则我认为这段代码确实保持了每棵树的根存储其子树中节点数的不变量

创建数据结构时,注意构造函数为森林中的每个节点设置了< code>sz[i] = 1。这意味着这些值开始时是正确的。

在联合操作期间,数据结构正确地调整合并树的根的大小。因此,在任何联合操作之后,所有的树根都具有正确的大小。

虽然在查找步骤中的路径压缩期间大小没有更新是正确的,但这里的数据结构没有理由改变大小。路径压缩只是减少了从某棵树中的节点到树根的路径长度。它不会改变存储在该树中的节点数量。因此,进行路径压缩的树的根部的大小信息不需要改变。尽管一些内部子树可能会丢失一些子树,因为它们在树中的较高位置被重新标记,但这无关紧要,因为联合/查找结构只需要在其树的根部维护大小信息,而不是在内部节点。

总体而言,这意味着数据结构确实正确存储了大小信息。对运行时没有负面影响,也不需要更正任何内容。

希望这有所帮助!

 类似资料:
  • 根据Princeton booksite,带有路径压缩的加权快速联合将10^9联合对10^9对象的操作时间从一年减少到大约6秒。这个数字是怎么得出的?当我在10^8操作中运行下面的代码时,我的运行时间是61s。

  • 我有一个项目,我必须实现一个带有路径压缩算法的加权快速并集。在看到其他一些源代码后,我最终得到了这个: 分配给我的任务是正确完成以下方法: int find(int v) void unite(int v,int u) setCount(int v) 嗯,算法似乎很慢,我找不到合适的解决方案。

  • 有一种“带路径压缩的加权快速联合”算法。 代码: 问题: > 路径压缩是如何工作的意味着我们只到达节点的第二个祖先,而不是根。 包含从 到 整数。如何帮助我们知道集合中元素的数量? 有人能帮我澄清一下吗?

  • 针对并集寻找不相交集的问题,提出了带路径压缩的加权快速并集算法 带路径压缩算法的加权快速并集 路径压缩会影响iz[]数组(包含以I为根的树的长度的数组)吗?

  • 我正在学习联合/查找结构的“加权快速联合与路径压缩”算法。普林斯顿edu网站详细解释了该算法。这是Java的实现: 但就像网站提到它的性能一样: 定理:从空数据结构开始,任何 M 并集序列和对 N 个对象的查找操作都需要 O(N M lg* N) 时间。 证明非常困难。 但是算法仍然很简单! 但我仍然很好奇迭代对数lg*n是如何产生的。它是如何推导出来的?有人可以证明它或只是以直观的方式解释它吗?

  • 处理以下问题(https://leetcode.com/problems/friend-circles/): 一个班有N个学生。他们有些是朋友,有些不是。他们的友谊本质上是可传递的。比如A是B的直接好友,B是C的直接好友,那么A就是C的间接好友,而我们定义的朋友圈就是一群直接或者间接好友的同学。 给定一个N*N矩阵M,表示班级学生之间的朋友关系。如果M[i][j]=1,则第i和第j个学生是彼此的直