如何从一个'Disjoint Sets'中获得所有元素的列表。
在我的问题中,我有很多元素(类元素).说我有1000个元素.这些元素最初是无关的,这意味着它们是自己的. 稍后,我需要使用联合操作来合并我的程序流程中的一些集合. I plan to use the boost library's disjoint_set (http://www. boost.org/doc/libs/1_57_0/libs/disjoint_sets/disjoint_sets.html ) 我的问题是如何在给定的代表中列出集合中的元素. 是disjoint_set是此类任务的最佳数据结构.所以我应该考虑使用其他东西吗? 解决方案 从您的散文描述中,我没有信息表明这些集合实际上会形成任何图表. 如果您要做的就是将元素与一组关联,我建议 std::map (其中ElementId可以简单地为Element*,如果您知道指针保持有效). 如果您还希望能够有效查询 bimap
0 2024-04-02
编程技术问答社区
在C++中实现等价关系(使用boost::disjoint_sets)。
假设您有很多元素,并且需要跟踪它们之间的等价关系.如果元素A等于元素B,则其等效于所有其他元素B等同于. 我正在寻找一个有效的数据结构来编码此信息.应该可以通过与现有元素的等效性动态添加新元素,并且从该信息可以有效地计算新元素等同的所有元素. 例如,考虑元素的以下等价集[0,1,2,3,4]: 0 = 1 = 2 3 = 4 相等符号表示等效性.现在我们添加一个新元素5 0 = 1 = 2 3 = 4 5 并执行等价5=3,数据结构变为 0 = 1 = 2 3 = 4 = 5 从中,应该能够通过为任何元素设置的等价有效地迭代.对于5,这组将是[3,4,5]. Boost已经提供了一个方便的数据结构,称为disjoint_sets,它似乎满足了我的大多数要求.考虑这个简单的程序,该程序限制了如何实现上述示例: #include #include #include
2 2024-04-02
编程技术问答社区
了解boost::disjoint_sets
我需要使用boost :: disjoint_sets,但是文档对我不清楚.有人可以解释每个模板参数的含义,也许给出一个少量示例代码来创建一个dishoint_sets? 根据请求,我使用disjoint_sets实现 ,即 - 值类型应为vertex_descriptor. 解决方案 我可以从文档中理解的内容: 不一紧密的需要将等级和父(在森林树中)与每个元素相关联.例如,您可能想使用任何类型的数据,例如,您并非总是想为父级使用地图:使用整数,数组就足够了.您还需要每个元素等级敌人(联合获取所需的等级). 您需要两个"属性": 一个将整数与每个元素相关联(第一个模板参数),等级 一个将一个元素与另一个元素相关联(第二个模板参数),父亲 在一个示例中: std::vector rank (100); std::vector parent (100); boost::disjoint_sets ds
0 2024-04-02
编程技术问答社区
如何解决这个Union-Find disjoint set问题?
我陷入了这个问题: 8&page = show_problem&问题= 1099 目前,我有设置,集合中的每个元素都是朋友.但是,我不知道该如何与敌人在一起. 谁能向我指向正确的方向? 解决方案 此问题需要修改正常的分离集数据结构. ,如果两个人通过两人关系序列连接,则可以确定两个人是朋友还是敌人.例如,如果X和Y像X-F-A-F-B-E-C-E-D-F-Y一样连接,那么您知道X和Y是朋友. 您可以使用不相交的数据结构来跟踪此连接性 - 为每个人创建一个集合,并在一个与另一个成员相关的成员时合并两个脱节集. 此外,对于每个不是既定领导人的人,您都应该记住他是父母的朋友还是敌人.通过这种方式,您可以从任何两个人走到他们的固定根源并确定它们的相关性. 此额外的信息在工会大小/等级和路径压缩期间很容易维护.
2 2024-01-23
编程技术问答社区
以最小的切割量将一个图分成相同大小的不相交集合
是否有任何算法或代码将图形节点划分为两个或多个不相交的集合,可满足以下条件: 首先,仅允许边缘卸下. 其次,边缘加权,将要删除的边缘必须具有最小的权重(最小切割算法). 第三,所需的脱节集尽可能长. 解决方案 看起来您正在尝试解决最小两种问题的问题,在该问题中,将图G给出了您希望将v [g]划分为两个不相交的子集A和b的大小相等,以至于A和B之间的边缘的重量最小化.不幸的是,.然而, kernighan – kernighan – lin algorithm 2*logn)有关该问题的启发式算法.虽然理论上对算法知之甚少(我们没有相对于最佳解决方案的性能绑定其性能),但该算法在实验中表现出非常有效的作用:通过模拟退火优化:实验评估;第1部分,图形分区.
4 2024-01-23
编程技术问答社区
找出集合列表中不相交集合的对数
问题语句如下:给定n个集的列表,每个集合包含k整数,找到一对不相交集的数量.假设该集合的可能元素是正的,并且在上面由c> n界定,并假设k 我试图提出一种有效的算法来解决此问题的速度(kn^2),这是幼稚解决方案的运行时. 我可以提出的最佳策略涉及在列表中的每个集合中迭代,并将集合元素放置在集合地图中的每个元素到包含它的集合的一组索引.然后,对于迭代中的当前集合,将其C元素用作键,并考虑由HashTable作为值给出的C集合的键.结果集集代表遇到的集合的数量,这些集合与当前集合无关,我们可以用来查找分离集的数量.在整个迭代中概括此值可以得出正确的答案.但是,由于联合操作是O(n),因此此策略不比Naive解决方案更好. 这个问题最有效的解决方案是什么? 解决方案 作为k 降低复杂性 对每个组进行排序,可以在n * k * log(k) 中排序 然后按第一个元素对所有设置进行排序,n * log(n) 现在比较需求n *(n -1)操作,即: 将s1.
4 2024-01-23
编程技术问答社区
在线性时间内打印出disjoint-set数据结构中的节点
我正在尝试在Cormen等人的算法介绍中进行此练习,这与Disogin集合数据结构有关: 假设我们希望添加操作PRINT-SET(x), 节点x并按任何顺序打印x的所有成员.显示如何 我们可以在一个不连接集中的每个节点中添加一个属性 森林,以便PRINT-SET(x)在成员数量中使用时间线性 x的set 和其他操作的渐近运行时间 不变.假设我们可以在O(1)中打印集合的每个成员 时间. 现在,我很确定所需的属性是尾指针,因此它可以跟踪孩子. 由于不相交的结构已经具有父属性,因此find-set(x)可以轻松地打印出一个方向上的节点.但是现在,有一个尾指针,让我们也朝另一个方向前进. 但是,我不确定如何编写算法来执行此操作.如果有人可以在伪代码中帮助我,那将不胜感激. 解决方案 每个节点应具有next指向其所在集合中的下一个节点的指针.集合中的节点应形成a councular链接列表. 首先创建单身集合时,节点的next指针指向自身. 与node
4 2024-01-23
编程技术问答社区
实施Kruskalls算法时测试电路
我正在尝试编写一个可以找到最小生成树的程序.但是我对此算法遇到的一个问题是测试电路.在Java中最好的方法是什么? 好的,这是我的代码 import java.io.*; import java.util.*; public class JungleRoads { public static int FindMinimumCost(ArrayList graph,int size) { int total = 0; int [] marked = new int[size]; //keeps track over integer in the mst //convert an arraylist to an array List wrapper = graph; String[] arrayGraph = wrapper.toArray(new St
0 2024-01-23
编程技术问答社区
apache spark上的离合集
我试图通过Apache Spark在大量数据上找到搜索不相交集的算法(连接组件/联合信息). 问题是数据量.即使是Graph顶点的原始表示形式也不适合单机器上的RAM.边缘也不适合RAM. 源数据是HDFS上图表的文本文件:" ID1 \ T ID2". id表示为字符串值,而不是int. 我发现的天真解决方案是: 取边RDD-> [id1:id2] [id3:id4] [id1:id3] 键的组边缘. - > [id1:[id2;id3]][id3:[id4]] 对于每个记录,将最小ID设置为每个组 - > (flatMap) [id1:id1][id2:id1][id3:id1][id3:id3][id4:id3] 反向rdd从阶段3 [id2:id1] -> [id1:id2] leftOuterJoin从第3阶段和第4阶段的RDD 从第2阶段重复,而步骤3的RDD的大小不会改变 ,但这导致节点之间大量数据传输 (洗牌) 有什么建议?
4 2024-01-23
编程技术问答社区
对不相交集森林数据结构而言,没有按等级进行联合的联合/查找算法
以下是 wikipedia "> wikipedia wikipedia :wikipedia : 准排骨不相交的森林...(O(n)) ...与联合等级...(现在改进到O(log(n)) ...通过路径压缩(现在改进到O(a(n)),有效地O(1)) 按等级实施联盟,每个节点都必须保留rank字段以进行比较.我的问题是,联合等级值得这个额外的空间吗?如果我跳过等级并进行路径压缩会怎样?足够好吗?现在的摊销复杂性是什么? 发表了一个评论,即表示没有路径压缩的等级联合(摊销O(log(n)复杂性)足以满足大多数实际应用.这是对的.我要问的是相反:如果您按等级跳过联盟,而只是进行路径压缩怎么办? 从某种意义上说,路径压缩是改善联合等级的额外步骤,这就是为什么可以在没有灾难性后果的情况下省略该额外步骤的原因.但是,按等级的联合是路径压缩的必要中间步骤吗?我可以跳过它并直接进入路径压缩,还是会灾难性的? 也有人指出,如果没有等级,重复的工会就可以创建一个链接的
使用union find(又称disjoint sets)检测一个图是否是二方的。
我在SPOJ上遇到问题,基本上可以还原以检测图形是否是双分部分.我正在尝试使用DFS对图进行着色,但是它太慢了.有人评论这个 没有BFS,没有DFS,没有Bipartie图.简单的联合信息套件将使之(实际上是速度). 提示#1: 偶数长度的循环不会影响两个节点之间路径长度的2个(哇,这么多i). 提示#2: (剧透) 让dist [i]成为从i到父母[i]的路径的距离.使用查找和联合功能更新.可以改进将Dist bool阵列. 有人可以解释他对此的含义吗?我认为他想说的是,对于每个节点,您可以存储节点和代表性元素之间的距离.然后,如果您尝试在同一组中合并两个节点,并且它们具有相同的奇偶校验,则创建一个奇数周期,因此该图不能是双分部分.但是,我不明白如何实现这一点.在考虑距离时如何合并两组?您不需要查看整个集合才能找到所有要更新的元素吗? 链接到问题: 解决方案 给定的图表表示为邻接列表(即边缘列表),您可以确定它是否是两部分: 初始化一个不相关的数据结构 set
4 2024-01-23
编程技术问答社区
算法:使用union find来计算岛屿的数量
假设您需要计算矩阵上的岛屿数 {1, 1, 0, 0, 0}, {0, 1, 0, 0, 1}, {1, 0, 0, 1, 1}, {0, 0, 0, 0, 0}, {1, 0, 1, 0, 1} 当输入矩阵大小可以安装在内存中时,我们可以简单地使用DFS或BFS. 但是,如果输入矩阵真的很大,我们该怎么办? 我可以分别块/将输入矩阵分别分别为不同的小文件. 但是如何合并它们? 我被卡住了如何合并.我想到合并它们时,我们必须阅读一些重叠的部分.但是什么是一种具体的方法? 试图了解Matt的解决方案. 当我在白板上绘制以下样本并排对其进行处理. 合并左然后合并顶部,似乎无法正常工作. 来自马特的解决方案. 不确定什么是topidx,boti
12 2024-01-23
编程技术问答社区
路径压缩和按等级联合是如何互补的?
我一直在阅读有关联合信息问题的信息.两个主要的改进是路径压缩和划分的联合.据我了解,按等级来确定如何结合不相交树.如果我们有两个不相交的树T1和T2,那么我们将树的根附加到较高等级的树的根部.如果我们不使用路径压缩,那么等级只是树的深度.这是有道理的,因为我们不想增加树的深度,因为它直接影响了发现和工会. 我的问题是我们也使用路径压缩.我一直在阅读这两个优化相互补充,但我看不到.由于路径压缩,等级不再是树的深度(它成为深度上的上限).假设T1具有2个分支(令T1的等级为3),而T2的深度为2和等级2.现在假设我们在下面标有"*"的T1的叶子上执行(带路压缩)的操作(路径压缩).现在,如果我们将T1的词根和T2的根联合,则T2将连接到T1的根(因为级别未通过查找更新).最终的树具有深度3.但是,如果我们将T1附加到T2,我们的性能可以更好. T1: o (Rank = 3) T2: o (Rank = 2) / \
0 2024-01-22
编程技术问答社区
在Python中实现离合集
我对Python是相对较新的.我正在研究脱节集,并如下实施: class DisjointSet: def __init__(self, vertices, parent): self.vertices = vertices self.parent = parent def find(self, item): if self.parent[item] == item: return item else: return self.find(self.parent[item]) def union(self, set1, set2): self.parent[set1] = set2 现在在驱动程序代码中: def main(): vertices = ['a', 'b', 'c', 'd', 'e', 'h',
2 2024-01-22
编程技术问答社区
c++测试2个集合是否不相交
我知道STL具有set_difference,但是我只需要知道2 set是否是不相交的.我已经介绍了我的代码,这使我的应用程序放慢了很多.是否有一种简单的方法可以查看2套是否不相交,或者我只需要滚动自己的代码? 编辑:我也尝试了set_intersection,但是花了同一时间... 解决方案 修改了Hjhill的代码,通过摆脱count()调用. template bool is_disjoint(const Set1 &set1, const Set2 &set2) { if(set1.empty() || set2.empty()) return true; typename Set1::const_iterator it1 = set1.begin(), it1End = set1.end(); typename Set2::const_iterat
4 2024-01-22
编程技术问答社区
如何在Python中正确实现用于寻找生成森林的disjoint集数据结构?
最近,我试图实施Google Kickstater 2019年编程问题的解决方案,并通过遵循分析说明来实施E轮的樱桃网格. 这是问题和分析的链接. https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050edb/0000000000170721 这是我实施的代码: t = int(input()) for k in range(1,t+1): n, q = map(int,input().split()) se = list() for _ in range(q): a,b = map(int,input().split()) se.append((a,b)) l = [{x} for x in range(1,n+1)] #print(se) for s in se: i = 0
2 2024-01-22
编程技术问答社区
如何对最大集合打包算法进行编码?
假设我们有一个有限的集合S和S的子集列表.然后,集合问题询问列表中的某些K子集是否是成对的. 该问题的优化版本,最大设置包装,要求列表中的最大成对分离集数量. http://en.wikipedia.org/wiki/set_packing 所以,让S = {1,2,3,4,5,6,7,8,9,10} and `Sa = {1,2,3,4}` and `Sb = {4,5,6}` and `Sc = {5,6,7,8}` and `Sd = {9,10}` 然后,成对分离集的最大数量为3(SA,SC,SD) 我找不到有关涉及算法的任何文章.您可以在同一范围内散发一些灯光吗? 我的方法: 根据大小对集合进行排序.从最小尺寸的集合开始.如果下一组的元素与当前集合没有相交,那么我们将集合团结起来并增加最大设置的计数.这听起来对您好吗?有更好的想法吗? 解决方案 正如Hivert所指出的那样,这个问题是NP-HARD,因此没有有效的方法可以做到这一
0 2024-01-22
编程技术问答社区
python替代实施中的脱节森林
我正在python中实现一个不相交的集合系统,但是我已经撞到了墙.我正在为系统使用树实现,并为系统实现find(),merge()和创建()功能. 我正在实施级别系统和路径压缩以提高效率. 捕获是,这些函数必须将一组脱节集作为一个参数,从而使遍历艰难. class Node(object): def __init__(self, value): self.parent = self self.value = value self.rank = 0 def Create(values): l = [Node(value) for value in values] return l 创建函数在值列表中获取,并返回包含适当数据的单数节点的列表. 我认为合并功能看起来与此相似, def Merge(set, value1, value2): value1Root = Find(se
16 2023-08-31
编程技术问答社区
用Pandas数据框架进行随机抽样的不相交组
我需要通过属性'ids'随机将数据框架随机分为两个不相交集.例如,考虑以下数据框架: df= Out[470]: 0 1 2 3 ids 0 17.0 18.0 16.0 15.0 13.0 1 18.0 16.0 15.0 15.0 13.0 2 16.0 15.0 15.0 16.0 13.0 131 12.0 8.0 21.0 19.0 14.0 132 8.0 21.0 19.0 20.0 14.0 133 21.0 19.0 20.0 9.0 14.0 248 NaN NaN 12.0 11.0 17.0 249 NaN 12.0 11.0 10.0 17.0 250 12.0 11.0 10.0 NaN
22 2023-06-29
编程技术问答社区