给定一些集合和一个数字 n:
Here assume n is 5:
a - (0,1,2)
b - (0,1,2,3)
c - (1,3,4,5)
d - (0,1,2,4)
e - (2,3,4,5)
f - (3,5)
现在,如果我们只考虑b
和c
,那么我们可以得到从0到5的整个范围。
我曾尝试一种贪心方法,但貌似不适用于这里。
给定一些集合和一个数字 n:
Here assume n is 5:
a - (0,1,2)
b - (0,1,2,3)
c - (1,3,4,5)
d - (0,1,2,4)
e - (2,3,4,5)
f - (3,5)
现在,如果我们只考虑b
和c
,那么我们可以得到从0到5的整个范围。
我曾尝试一种贪心方法,但貌似不适用于这里。
min = 0
function bfs(i, visited sets)
if i > m
n = the number of the visited sets without duplicates
if n < min
min = n
end
return
end
if no set contains i
return
end
for each set that contains i
bfs(i+1, visited sets + this set)
end
end
bfs(0, empty set)
那么min
将是集合中的最小数。
获取最小集合的最佳解决方案是通过检查所有可能的子集来获得,但当 k
是集合数量时,这将需要 2^k
的时间。
您可以通过构建图并运行深度优先搜索(DFS),直到获得完全覆盖来完成它。
在运行时间和最优解之间存在权衡。如果运行时间较短,则会接受不是最小集合的选项。
N
次递归调用;构建答案可能需要N
个集合,因此复杂度为O(N^N)
。 - Koterpillar