Algorithm 寻找重叠集

Algorithm 寻找重叠集,algorithm,language-agnostic,set-theory,Algorithm,Language Agnostic,Set Theory,我正在用C写一个系统。这个系统的一部分是创建一组整数,我需要找到这些集合的组合,这些集合的创建可以让我只剩下一个项。最快的方法是什么 Set A: 1,2,3,4,5,6 Set B: 1,2,3,4,6 Set C: 1,2,3 Set D: 5,6 Solutions: A - B => 5 A - (C + D) => 4 我不需要找到所有的组合,只需要找到尽可能多的唯一数字即可。这可能被用来创建一个更有效的算法 有一点我忘了提: 我事先不知道有多少组,而是一个接一个地添加

我正在用C写一个系统。这个系统的一部分是创建一组整数,我需要找到这些集合的组合,这些集合的创建可以让我只剩下一个项。最快的方法是什么

Set A: 1,2,3,4,5,6
Set B: 1,2,3,4,6
Set C: 1,2,3
Set D: 5,6

Solutions:
A - B => 5
A - (C + D) => 4
我不需要找到所有的组合,只需要找到尽可能多的唯一数字即可。这可能被用来创建一个更有效的算法

有一点我忘了提: 我事先不知道有多少组,而是一个接一个地添加,每次都必须确定是否找到了我需要的每个数字。因此,该算法必须能够在添加新集合时分阶段运行


注意。C中的解决方案(获得奖励分数;)

我认为通过对贪婪集覆盖()算法的某种修改,可以得到一些很好的解决方案

[伪代码] 因此:

编辑:

  • 您可以在最后一个循环中对每个循环进行ommit 设置
  • 这只会给你带来一个 每个集合的解决方案(要修复) 这可以直接改变问题 进入集合覆盖问题并使用贪心算法 设置覆盖范围),例如,如果您使用阵列 [1,3,4],您需要找到 它的所有子集的SCV问题 大小为2:[1,3], [1,4], [3,4]. 这会造成问题 复杂得多
  • 你可以考虑的另一种方法是 进化算法(表示) 这里会很简单,请客 指定为位的数字,适用性 函数应接近1), 但这仍然不能解决这个问题 计算后添加新集合 (也许当你有最好的人口 从上一个问题开始,然后添加 新设置只需在中添加新位置 (染色体)
实际上,你有多少个集合/整数?集合总是排序的吗?@Loic:可能很多,但变化很大。@Eric:不,这些是纯无序的sets@Martin:很多,比如10^3、10^6、10^12?这是一个很好的解决方案。但是,在不断添加新集合的约束条件下(对不起,我之前忘了提到),它的工作效果如何?这将更加困难,您可以针对新集合只执行一个步骤(检查较小大小的集合),或者针对添加的集合和每个较大的集合执行一个步骤(如果您经常添加集合,则工作速度会变慢),请注意,我没有忽视这个答案。我很快会更新投票,我正忙着实现一个变种,看看它有多快。我用来解决这个问题的最终算法完全消除了这种需要。回答得好,谢谢:)
1. sort sets by size descending
2.
foreach set in sets do:
  uncovered = set.size
  while uncovered > 1
    current_set = the biggest set that covers no more than (uncovered - 1) and was not used before to cover set
    uncovered = uncovered - covered_by_set(set)
    collect current_set to some array
  end
end