union-find相关内容
我一直在读有关工会发现问题的文章。两个主要的改进是路径压缩和按等级合并。据我所知,按等级合并是用来确定如何组合不相交的树的。如果我们有两棵不相交的树T1和T2,那么我们将排名较小的树的根附加到排名较高的树上。如果我们不使用路径压缩,那么排名就是树的深度。这是有意义的,因为我们不想增加Out树的深度,因为它直接影响Find和UNION。 我的问题是当我们也使用路径压缩时。我一直读到这两个优化是
..
我知道可以使用 DFS 和 BFS 检测直接图中的循环.我想知道我们是否可以使用 Union-Find 检测有向图中的循环? 如果是,那么如何?和 如果我们不能,那为什么? 解决方案 不,我们不能使用 union-find 来检测有向图中的循环.这是因为无法使用不相交集(执行联合查找的数据结构)来表示有向图. 当我们说'a union b'时,我们无法确定边的方向 a
..
我正在处理 3d 数据,并提供了一个相互连接的顶点列表.数据格式如下: faces = [(0, 1, 2),(1, 3, 2),(3, 5, 6),(5, 7, 4),(10, 11, 12),(11, 12, 13),(12, 13, 14)] 数组中的每一项都由一个三元组组成,其中每个位置的数字表示相互连接的顶点的索引.我在图片中可视化了这个例子,以便更好地理解顶点是如何连接的.
..
我有一个带权重的边的列表,我想从中获得不交集.但是,我也想在集合中跟踪权重.例如,如果我有数据集, N1 N2重量a1 a2 1.0a2 a3 0.5a3 a5 1.0a4 a8 1.0a8 a9 0.8 这将导致两套 [(a1,1.0),(a2,1.0),(a3,1.0 * 0.5),(a5,0.5 * 1.0)]和[(a4,1.0),(a8,1.0),(a9,1.0 * 0.8)]
..
我已经盯着这个算法有一段时间了,但是找不到我错过的东西. 逻辑: 初始化所有隔离的组件 union frm,连接到每个边缘中的组件,并减小#组件(如果尚未连接). 问题:运行此特定测试用例时,为什么会得到此 -48 ? def countComponents(self,n,edges):“":type n:整数:type edges:列表[列表[int]]:rtype:整数
..
我知道可以使用DFS和BFS在直接图中检测周期。我想知道是否可以使用 Union-Find 检测有向图中的循环? 如果是, ,那又如何?和 如果不能,为什么? 解决方案 否,我们不能使用联合查找来检测有向图中的循环。这是因为不能使用不交集(执行联合查找的数据结构)表示有向图。 当我们说“联合b”时我们无法确定边缘的方向 是去b了吗? (或) b是要去a吗? 但是
..
我正试图在Cormen等人的“算法简介"中进行此练习,该练习与Disjoin Set数据结构有关: 假设我们希望添加操作PRINT-SET(x),该操作已给出 节点x,并以任何顺序打印x的集合的所有成员.展示如何 我们可以向不交集中的每个节点仅添加一个属性 森林,以便PRINT-SET(x)花费个时间线性的成员数 x的设置以及其他运算的渐近运行时间 不变.假设我们可以在O(1)中打印集合的每
..
我一直在阅读有关工会发现的问题.两项主要改进是路径压缩和按等级合并.据我了解,等级合并用于确定如何合并不相交的树.如果我们有两个不相交的树T1和T2,那么我们将等级较小的树的根附加到等级较高的树.如果我们不使用路径压缩,那么等级就是一棵树的深度.这是有道理的,因为我们不想增加输出树的深度,因为它直接影响查找和并集. 我的问题是当我们也使用路径压缩时.我一直在阅读这两种优化是相辅相成的,但是我
..
这就是我想做的:我有一个包含几个等价关系的列表: l = [[1, 2], [2, 3], [4, 5], [6, 7], [1, 7]] 我想合并共享一个元素的集合.这是一个示例实现: def union(lis): lis = [set(e) for e in lis] res = [] while True: for i in range(len(lis)
..
我来自一个强制性的背景,正在尝试实现一个简单的不相交集(“union-find”)数据结构,以便在Haskell中创建和修改(持久化)数据结构来实践。目标是简单实现,但我也关心效率,我的问题与此有关。 首先,我创建了一个不相交的林实现通过等级联合,并通过定义“点”的数据类型开始: data Point = Point { _value :: Int ,_parent :: Ma
..
我正在使用 union-find 算法。在我的程序的第一部分,该算法计算一个大集合 E 的分区。 之后,我想检索集合 S 的所有成员,其中包含给定的节点 x 。 到目前为止,天真地,我正在测试 E 的所有元素的成员资格到 S 。但是昨天我正在阅读“算法介绍”(CLRS第3版,前言21.3-4),在练习中,我发现: 假设我们希望添加一个操作 PRINT-SET(x),这是 给定一
..
我注意到, Data.UnionFind 使用IO monad通过IORefs提供指针。我想象,每个人都很开心地调用 unsafePerformIO ,在本地使用纯代码,因为数据结构是如此的很好理解,但是.. 这种数据结构是否有规范的清洁方法?也许IO周围的包装,通过禁止大多数IO操作,使不可避免的 unsafePerformIO 更不安全的“寻找”? 解决方案 这种数据结构是否
..
对于许多问题,我看到解决方案是使用union-find数据结构。我试图阅读它,并考虑如何实现(使用C ++)。我目前的理解是,它只不过是一套集合。所以要找到属于哪一个元素,我们需要 n * log n 操作。当我们必须执行工会时,我们必须找到需要合并的两个集合,并对它们执行一个 set_union 。这对我来说看起来并不高效。我对这个数据结构的理解是正确的还是我缺少某些东西? 解决方案 这
..
对于许多问题,我看到建议的解决方案是使用union-find数据结构。我试图读一下它,并想想如何实现(使用C ++)。我目前的理解是,它只是一组列表。因此,要找到一个元素属于哪个集合,我们需要 n * log n 操作。当我们必须执行联合时,我们必须找到需要合并的两个集合,并对它们执行 set_union 。这看起来对我来说效率不高。是我对这个数据结构的理解正确还是我缺少了一些东西? 解决方
..
有一个“加权快速联盟与路径的COM pression”算法。 在code: 公共类WeightedQU { 私人INT [] ID; 私人INT [] IZ; 公共WeightedQU(INT N) { ID =新INT [N]; IZ =新INT [N]; 的for(int i = 0; I< id.le
..
我只是在这个问题上使用的std ::矢量,我可以保证每个向量没有重复(但没有任何顺序在每个向量) 。我如何结合使我有引导? 例如: 如果我有以下载体... 1 1 3 2 五 5 4 2 4 4 2 工会后,我应该只有两个向量左: 1 2 3 4 5 再次声明,我只能用向量,的std ::设为是不允许的。 解决方案 您可以使用std :: set_union算法。
..