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

如何在UnionFind数据结构中正确实现wighted union和路径压缩

昝枫
2023-03-14

我试图用C实现一个联合查找/分离集数据结构,在查找中使用加权联合和路径压缩。我有一些问题,与非加权联合相比,如何实现加权联合以降低时间复杂度。

我已经在网上找到了解决这个问题的几种方法,并实施了自己的方法。在每个解决方案中,每个单独树的根(表示一个集合)始终保持树的节点数。当合并属于不同集合的两个随机对象的集合时,首先找到根(这里使用路径压缩),然后比较这些根的大小。最大树的根被设置为最小树的根的父级。

然而,在我的理解中,我们试图用加权联合实现的是降低结果树的高度(这也是我们试图用路径压缩实现的)。因此,应该连接到另一棵树的不是具有最低节点数的树,而是具有最低高度的树。这使高度保持最小。

这是正确的吗?考虑到实现的其余部分(我们总是从许多单个(一个节点)集合开始),检查高度和大小在某种程度上是等价的吗?

假设需要检查的是高度,如果不使用路径压缩,则跟踪树的高度是相当简单的。然而,我还没有找到一种方法来跟踪使用路径压缩时树的高度(至少在不遍历整个树的情况下是这样,这增加了“find”算法的时间复杂性。

以下是我找到的一个实现示例,并使用我在c:https://github.com/kartikkukreja/blog-codes/blob/master/src/Union 查找(脱交集)数据结构中描述的内容(与我所编码的内容非常相似).cpp

共有1个答案

慎俊艾
2023-03-14

看来你自己已经很清楚了。

高度联合是生成最短树的明显方法,但是当使用路径压缩时,很难跟踪高度...

所以通常使用按等级联合。一个集合的“等级”是它的高度,如果我们不做任何路径压缩,所以当你在路径压缩中使用按等级联合时,就像从按高度联合开始,然后应用路径压缩作为优化,确保路径压缩不会改变合并的工作方式。

然而,很多人(包括我自己)使用按大小合并,因为大小通常是有用的,并且可以证明按大小合并会产生与按等级联合相同的最坏情况复杂性。同样,在这种情况下,路径压缩不会影响合并,因为它不会更改任何根的大小。

 类似资料:
  • 我想创建一个食谱网站,在那里你可以添加/修改/删除食谱,每个模型都应该有一个配料的列表,与所需的量的那个配料。 我试图使用这样的dict:,但结果是EF Core并不真正喜欢dicts的思想,所以我试图创建一个“映射器”模型,如下所示: 问题是,它仍然没有真正起作用。我不能添加菜谱,也不能删除,因为它进入了一个永远循环。 你将如何实施它? 谢谢

  • 我正在寻找关于如何以及何时实现dispose模式的建议。 我已经阅读了MSDN关于如何实现dispose()模式的文章。说得通。我在我的类中实现了它,但它似乎对内存使用没有什么影响。 有点背景,我正在建立一个2D自顶向下的游戏引擎。我有一个名为Gatherer的单元,它继承自Actor(一个用于绘制sprite和跟踪viewplane的基本类),它们是一些简单的sprite。它们在5轮比赛后消失。

  • 问题内容: 我目前正在尝试在Go中实现Merkle- tree数据结构。基本上,我的最终目标是存储一小组结构化数据(最大10MB),并使该“数据库”可以轻松地与网络上分布的其他节点同步(请参阅参考资料)。由于没有类型检查,因此我已经在Node中有效地实现了这一点。这就是Go的问题,我想利用Go的编译时类型检查,尽管我也想拥有一个可以与任何提供的树一起使用的库。 简而言之,我想将结构用作merkle

  • 问题内容: 我收到错误 线程“主”中的异常java.lang.NoClassDefFoundError: 当我尝试在Ubuntu上运行已编译的类时。我使用的是一个非常简单的Helloworld示例,互联网上已经存在数百万个响应,这表明我的CLASSPATH和JAVA_HOME变量设置有误。 但是,我已经将etc / environment编辑为正确的文件夹以及当前文件夹: PATH =“。:/ u

  • 图的存储结构 图的存储结构除了要存储图中各个顶点的本身信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多。常用的图的存储结构有邻接矩阵、邻接表等。 邻接矩阵表示法 对于一个具有n个结点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系。矩阵 A(i,j) =

  • 栈简介 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。 它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,