60得票5回答
理解boost::disjoint_sets

我需要使用boost::disjoint_sets,但文档对我来说不太清晰。请有人解释一下每个模板参数的含义,并为创建disjoint_sets给出一个小例子代码吗? 根据要求,我正在使用disjoint_sets来实现Tarjan离线最近公共祖先算法,即-值类型应该是vertex_desc...

20得票10回答
用C++实现不相交集合(并查集)

我正在尝试实现不相交集并查集,用于Kruskal算法,但是我不太明白应该如何实现,特别是如何管理森林中的树。在阅读了维基百科上对于不相交集描述以及《算法导论》(Cormen等人)中的描述后,我得出了以下代码: class DisjointSet { public: ...

20得票2回答
使用不带按秩合并的并查集森林数据结构的并查集/查找算法

这是一个关于维基百科上不相交集合森林的并查集算法的分解: 裸奔的不相交集合森林...(O(n)) ... 使用按秩合并...(现在改进到O(log(n))) ...使用路径压缩(现在改进到O(a(n)),实际上是O(1)) 实现按秩合并需要每个节点保持一个rank字段进行比...

17得票3回答
联合查找(或不相交集合)数据结构在STL中吗?

我本以为这样一个有用的数据结构会被包含在C++标准库中,但我似乎找不到。

12得票5回答
C++测试两个集合是否不相交

我知道STL有set_difference函数,但是我只需要知道两个set是否不相交。我已经对我的代码进行了分析,发现这部分代码会导致我的应用程序变慢很多。是否有一种简单的方法来判断两个集合是否不相交?还是说我需要自己编写代码? 编辑:我也尝试使用set_intersection函数,但时间...

12得票2回答
Python中的不相交集合实现

我对Python比较陌生。我正在学习并实现“不相交集合”:class DisjointSet: def __init__(self, vertices, parent): self.vertices = vertices self.parent = pa...

9得票2回答
路径压缩和按秩合并如何互相补充?

我一直在研究并查集问题。两个主要的改进是路径压缩和按秩合并。据我所知,按秩合并用于确定如何组合不相交的树。如果我们有两棵不相交的树T1和T2,那么我们将较小秩的树的根节点连接到较大秩的树上。如果我们不使用路径压缩,则秩仅为树的深度。这是有道理的,因为我们不想增加树的深度,因为它直接影响查找和合...

9得票2回答
Apache Spark上的不相交集合

我正在尝试找到使用Apache Spark在大量数据上搜索不相交集合(连接组件/并查集)的算法。问题在于数据量很大,即使是图形顶点的原始表示形式也无法适应单个计算机的内存,边缘也不能满足内存要求。 源数据是HDFS上的图形边缘文本文件: "id1 \ tid2"。 id以字符串值而非整数表...

9得票2回答
如何编写最大集合覆盖算法的代码?

假设我们有一个有限集合S和S的子集列表。那么,集合包装问题要求在列表中是否存在k个成对不相交的子集。该问题的最优化版本——最大集合包装问题,要求在列表中找到最大数量的成对不相交的子集。 链接:http://en.wikipedia.org/wiki/Set_packing 因此,令S = ...

9得票2回答
有没有一个无需使用按秩合并的并查集实现Union & Find算法,可以在Omega(q log n)时间内运行的示例?

最近,我阅读了这篇文章,惊讶地发现只使用路径压缩的并查集算法的时间复杂度为O((m+n) log n),其中m是“查找”查询的数量,n是“合并”查询的数量。 我对这个复杂度很感兴趣(因为我通常实现这个算法时没有使用等级,并且即使我将反向等级应用于并查集,性能也不错!),并尝试找到一个可以达到...