算法:查找包含整个域的最小数量的集合

时间:2013-06-09 11:42:49

标签: algorithm data-structures

给出几组和一个数字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)

现在,如果我们只选择bc,我们会得到0到5的整个范围。

我在想一个贪婪的方法,但这似乎不适合这里。

3 个答案:

答案 0 :(得分:6)

这是set cover problem,因此,NP-complete,意味着您必须考虑每个可能的解决方案并选择最小值。

答案 1 :(得分:0)

通过检查所有可能的子集可以轻松获得最少数量的集合的最佳解决方案,但当2^k是集合数时,这将需要k

您可以通过构建图表并运行深度为1,2,3的DFS来实现,直到您获得全面覆盖。

在运行时和最佳解决方案之间存在交易。是接受不是最小集,而不是选项,运行时间较短

答案 2 :(得分:0)

BFS搜索可以轻松解决此问题。

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

从i = 0开始搜索并清空已访问的集合

bfs(0, empty set)

然后min将是最小数量的集合。

相关问题