Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从给定集合中寻找不相交集合的最大并集_Algorithm_Graph_Intersection - Fatal编程技术网

Algorithm 从给定集合中寻找不相交集合的最大并集

Algorithm 从给定集合中寻找不相交集合的最大并集,algorithm,graph,intersection,Algorithm,Graph,Intersection,我有多组(大约100个左右)从1到32不等的数字,每个数字不超过32项 例如: [1,2] [3,4] [1,2,3] 我想做的是做一个算法来输出集合的最大并集,它们之间没有交集 示例的输出是[[1,2],[3,4]],它们之间没有任何交点,并且它们的并集大于集合[[1,2,3] 我曾尝试寻找二部图与映射到数字的集合的最大匹配,但我立即感到困惑,因为问题不在于只找到一个匹配,而在于找到多个数字的集合 似乎编写多项式时间复杂度的算法很难,任何时间复杂度不超过2^n的想法都会受到欢迎。您描述的问题

我有多组(大约100个左右)从1到32不等的数字,每个数字不超过32项

例如:

[1,2]
[3,4]
[1,2,3]
我想做的是做一个算法来输出集合的最大并集,它们之间没有交集

示例的输出是
[[1,2],[3,4]]
,它们之间没有任何交点,并且它们的并集大于集合
[[1,2,3]

我曾尝试寻找二部图与映射到数字的集合的最大匹配,但我立即感到困惑,因为问题不在于只找到一个匹配,而在于找到多个数字的集合


似乎编写多项式时间复杂度的算法很难,任何时间复杂度不超过2^n的想法都会受到欢迎。

您描述的问题被称为NP难问题。因此,我们不知道这个问题的多项式时间算法,如果P≠ NP则不存在。

您所描述的问题称为NP,并且已知为NP难问题。因此,我们不知道这个问题的多项式时间算法,如果P≠ NP则不存在。

在{1..32}的100个随机子集的一般情况下,基本穷举搜索非常有效。子集的大小约为16,如果选择100个,通常没有一对是不相交的。这大概是n^2/2比较(如果子集是随机选取的)

在特殊情况下,当子集的长度很小(例如5)时,复杂度上升得更快。一个基本的穷举搜索至少可以工作500分钟


我的观点是,这取决于你的数据。

在{1..32}的100个随机子集的一般情况下,基本的穷举搜索非常有效。子集的大小约为16,如果选择100个,通常没有一对是不相交的。这大概是n^2/2比较(如果子集是随机选取的)

在特殊情况下,当子集的长度很小(例如5)时,复杂度上升得更快。一个基本的穷举搜索至少可以工作500分钟


我的观点是,这取决于您的数据。

那么,我是否应该强制执行它?我发现的唯一解决方案是使用类似bfs的方法对集合进行迭代,该方法的时间复杂度范围为n到2^n,其中n是集合数,空间复杂度为2^n*log2(σ),其中σ代表我考虑的字典大小,在最糟糕的情况下,有很多场景需要拍摄,这似乎过于复杂了。有可能有比暴力更好的东西,但这仍然需要指数级的时间,尽管我不知道。在某种程度上,大多数解决方案都是通过对可能的组合进行某种探索来实现的。OP的问题类似于集合装箱问题,但有所不同,因为OP寻找的是元素数量最大的并集,而不是子集数量最大的并集。所以我应该强制它吗?我发现的唯一解决方案是使用类似bfs的方法对集合进行迭代,该方法的时间复杂度范围为n到2^n,其中n是集合数,空间复杂度为2^n*log2(σ),其中σ代表我考虑的字典大小,在最糟糕的情况下,有很多场景需要拍摄,这似乎过于复杂了。有可能有比暴力更好的东西,但这仍然需要指数级的时间,尽管我不知道。在某种程度上,大多数解决方案都是通过对可能的组合进行某种探索来实现的。OP的问题类似于集合装箱问题,但不同,因为OP寻找的是元素数量最大的并集,不适用于子集数最大的并集。零一整数规划将是我的首选。有一些很好的开源解决方案,如cbc。如果集合包含1-32之间的整数,则它们不能有50个成员(或任何超过32个的成员)。请解释您所说的每个集合最多只能有50个项的意思。考虑到每个集合只能包含1到32之间的数字,我似乎没有什么意义。请同时说明首选语言。32似乎很适合通过使用32位整数来加速运算。@WalterTross这听起来是一个很好的微观优化,但我认为问题是需要一个更好的算法。@WalterTross看起来我在以一些复杂的方式思考它,一个简单的&操作数可以确定这一点。零一整数编程将是我的首选。有一些很好的开源解决方案,如cbc。如果集合包含1-32之间的整数,则它们不能有50个成员(或任何超过32个的成员)。请解释您所说的每个集合最多只能有50个项的意思。考虑到每个集合只能包含1到32之间的数字,我似乎没有什么意义。请同时说明首选语言。32似乎很适合通过使用32位整数来加速运算。@WalterTross这听起来是一个很好的微观优化,但我认为问题是需要一个更好的算法。@WalterTross看起来我在以一些复杂的方式思考它,一个简单的&操作数可以确定这一点。