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_Programming Languages - Fatal编程技术网

Algorithm 集合覆盖问题的最小规模集合覆盖算法

Algorithm 集合覆盖问题的最小规模集合覆盖算法,algorithm,programming-languages,Algorithm,Programming Languages,在集合覆盖问题中,我们给出了一个宇宙U,使得| U |=n,集合S1,…,Sk是U的子集。集合覆盖是S1,…,Sk中的一些集合的集合C,其并集是整个宇宙U 我试图提出一个算法,找到集合覆盖的最小数目,这样我就可以证明,贪婪的集合覆盖算法有时会找到更多的集合 以下是我的想法: 每组重复上述步骤。 1.Cover集合Cover是NP难的,因此不太可能有比查看集合的所有可能组合并检查每个组合是否为Cover更有效的算法 基本上,先看一组的所有组合,然后看两组,以此类推,直到它们形成一个封面 编辑 这是

在集合覆盖问题中,我们给出了一个宇宙U,使得| U |=n,集合S1,…,Sk是U的子集。集合覆盖是S1,…,Sk中的一些集合的集合C,其并集是整个宇宙U

我试图提出一个算法,找到集合覆盖的最小数目,这样我就可以证明,贪婪的集合覆盖算法有时会找到更多的集合

以下是我的想法:

每组重复上述步骤。
1.Cover集合Cover是NP难的,因此不太可能有比查看集合的所有可能组合并检查每个组合是否为Cover更有效的算法

基本上,先看一组的所有组合,然后看两组,以此类推,直到它们形成一个封面

编辑

这是一个伪代码示例。请注意,我并不认为这是有效的。我只是说没有比多项式时间更有效的算法(除非发现真正酷的东西,否则算法会比多项式时间差)

其中
组合(K,n)
返回其元素来自
K
的所有可能的大小集
n

编辑

但是,我不太清楚为什么需要一个算法来找到最小值。在这个问题中,你说你想证明贪婪的集合覆盖算法有时能找到更多的集合。但这很容易通过一个反例实现(维基百科的SETCOVER条目中显示了一个反例)。所以我很困惑

编辑

组合(K,n)
的一个可能实现是:

if n == 0: return [{}] //a list containing an empty set
r = []
for k in K:
    K = K \ {k} // remove k from K.
    for s in combination(K, n-1):
        r.append(union({k}, s))
return r

但是,结合覆盖问题,可能需要从基本情况
n==0
执行覆盖测试。好吧。

集合覆盖是NP难的,所以不可能有比查看集合的所有可能组合并检查每个组合是否是覆盖更有效的算法

基本上,先看一组的所有组合,然后看两组,以此类推,直到它们形成一个封面

编辑

这是一个伪代码示例。请注意,我并不认为这是有效的。我只是说没有比多项式时间更有效的算法(除非发现真正酷的东西,否则算法会比多项式时间差)

其中
组合(K,n)
返回其元素来自
K
的所有可能的大小集
n

编辑

但是,我不太清楚为什么需要一个算法来找到最小值。在这个问题中,你说你想证明贪婪的集合覆盖算法有时能找到更多的集合。但这很容易通过一个反例实现(维基百科的SETCOVER条目中显示了一个反例)。所以我很困惑

编辑

组合(K,n)
的一个可能实现是:

if n == 0: return [{}] //a list containing an empty set
r = []
for k in K:
    K = K \ {k} // remove k from K.
    for s in combination(K, n-1):
        r.append(union({k}, s))
return r


但是,结合覆盖问题,可能需要从基本情况
n==0
执行覆盖测试。好的。

尝试Donald E.Knuth算法-X,使用稀疏矩阵获得精确的集合覆盖率。必须稍微调整以解决最小集合覆盖问题。

使用稀疏矩阵,尝试Donald E.Knuth算法-X以获得精确集合覆盖。必须稍微调整以解决最小集合覆盖问题。

Um。贪婪算法并不总是找到更多的集合。例如,在一个小例子中,子集都是不相交的,它会精确地找到最小值,即所有子集。你是对的。我更正了我的问题。但是你对如何找到一个总是能找到最小集合数的算法有什么建议吗?Thanks@user491753:不,我不知道有什么方法能比找到最小覆盖本身更简单地找到最小覆盖的大小。即使只是为了确定贪婪算法对于给定的输入是否是最优的:不知道,对不起。只是希望在其他有线索的人来到这里之前澄清这个问题:-)嗯。贪婪算法并不总是找到更多的集合。例如,在一个小例子中,子集都是不相交的,它会精确地找到最小值,即所有子集。你是对的。我更正了我的问题。但是你对如何找到一个总是能找到最小集合数的算法有什么建议吗?Thanks@user491753:不,我不知道有什么方法能比找到最小覆盖本身更简单地找到最小覆盖的大小。即使只是为了确定贪婪算法对于给定的输入是否是最优的:不知道,对不起。只是希望在其他有线索的人来到这里之前澄清这个问题:-)我不知道你的意思。你能给我看一下伪代码吗。提前非常感谢。因为我写了一个使用贪婪alg的程序。为了找到min cover,我只想写另一个程序,不用贪婪的方法找到min cover,但效率不高,直到我不明白。目标是什么?这是否表明贪婪算法并不总是得到最小覆盖?是的。只是想展示一下贪婪的alg。不总是找到最小的封面。你知道我在java中遇到了一个查找集合组合的问题吗?然后,你只需要一个反例。(在“贪婪算法”部分)中有一个。这表明贪婪算法并没有找到那个问题的最小覆盖。我不知道你的意思。你能给我看一下伪代码吗。提前非常感谢。因为我写了一个使用贪婪alg的程序。为了找到min cover,我只想写另一个程序,不用贪婪的方法找到min cover,但效率不高,直到我不明白。目标是什么?这是否表明贪婪算法并不总是得到最小覆盖?是的。只是想展示一下贪婪的alg。并不总是f