Algorithm 寻找重叠集
我正在用C写一个系统。这个系统的一部分是创建一组整数,我需要找到这些集合的组合,这些集合的创建可以让我只剩下一个项。最快的方法是什么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 我不需要找到所有的组合,只需要找到尽可能多的唯一数字即可。这可能被用来创建一个更有效的算法 有一点我忘了提: 我事先不知道有多少组,而是一个接一个地添加
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), 但这仍然不能解决这个问题 计算后添加新集合 (也许当你有最好的人口 从上一个问题开始,然后添加 新设置只需在中添加新位置 (染色体)
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