Algorithm 当给定一组数字时,如何找到表示所有数字的最小组集?
当给定一组数字时,如何找到覆盖所有数字的最小组集?约束条件是所选组不应重叠 例如,给定三组数字(1,2)、(2,3)和(3,4),我们可以选择(1,2)和(3,4),因为(2,3)是冗余的 对于(1,2)、(2,3)、(3,4)、(1,4),我们有两个解(1,2)、(3,4)或(1,4)、(2,3) 对于(1,2,3)、(1,2,4)和(3,4),存在冗余,但没有解决方案 我提出的算法(例如G=(1,2),(2,3),(3,4),(1,4)是Algorithm 当给定一组数字时,如何找到表示所有数字的最小组集?,algorithm,Algorithm,当给定一组数字时,如何找到覆盖所有数字的最小组集?约束条件是所选组不应重叠 例如,给定三组数字(1,2)、(2,3)和(3,4),我们可以选择(1,2)和(3,4),因为(2,3)是冗余的 对于(1,2)、(2,3)、(3,4)、(1,4),我们有两个解(1,2)、(3,4)或(1,4)、(2,3) 对于(1,2,3)、(1,2,4)和(3,4),存在冗余,但没有解决方案 我提出的算法(例如G=(1,2),(2,3),(3,4),(1,4)是 我知道我的算法在性能方面有很多漏洞,我想这可能是一个
我知道我的算法在性能方面有很多漏洞,我想这可能是一个众所周知的问题。有关于这个问题的提示吗?我在这个网站上找到了一个python代码:
这是一个经典的NP完全问题:这实际上是一个非常难的NP完全问题。在最坏的情况下,你将无法比指数时间暴力算法做得更好,该算法测试组之间的所有可能组合。注意:“使用(1,2,3)、(1,2,4)和(3,4),没有冗余。”-(1,2,3)和(3,4)覆盖它…@Karoly Horvath:约束条件是所选组(1,2,3)和(3,4)不应重叠。我更新了帖子,让它更清晰。有了(1,2,3),(1,2,4),(3,4),有冗余,但没有解决方案。
collect all the numbers from the groups x = (1,2,3,4)
for g in G:
x = remove g in x # x = (3,4)
find G' = (a set of (g' in (G - g))) that makes (G' + g = x) # G' = ((3,4))
if find (G' + g) return (G',g) # return ((1,2)(3,4))
X = {1, 2, 3, 4, 5, 6, 7}
Y = {
'A': [1, 4, 7],
'B': [1, 4],
'C': [4, 5, 7],
'D': [3, 5, 6],
'E': [2, 3, 6, 7],
'F': [2, 7]}
def solve(X, Y, solution=[]):
if not X:
yield list(solution)
else:
c = min(X, key=lambda c: len(X[c]))
for r in list(X[c]):
solution.append(r)
cols = select(X, Y, r)
for s in solve(X, Y, solution):
yield s
deselect(X, Y, r, cols)
solution.pop()
def select(X, Y, r):
cols = []
for j in Y[r]:
for i in X[j]:
for k in Y[i]:
if k != j:
X[k].remove(i)
cols.append(X.pop(j))
return cols
def deselect(X, Y, r, cols):
for j in reversed(Y[r]):
X[j] = cols.pop()
for i in X[j]:
for k in Y[i]:
if k != j:
X[k].add(i)
X = {j: set(filter(lambda i: j in Y[i], Y)) for j in X}
a = solve(X, Y)
for i in a: print i