Algorithm 如何找到所有矩阵列集合,这些集合一起包含每行的值?
给出一个布尔值矩阵示例:Algorithm 如何找到所有矩阵列集合,这些集合一起包含每行的值?,algorithm,matrix,Algorithm,Matrix,给出一个布尔值矩阵示例: a b c +-------- X | 1 0 1 Y | 1 1 1 Z | 0 1 1 +-------- 找到所有序列[a | b | c]的最佳方法是什么,这样每个序列的X、Y和Z至少有一个真1值 在上述示例中,序列集没有特定顺序: abc, ab, ac, bc, c 鉴于这些顺序不符合要求: a (doesn't provide Z) b (doesn't provide X) 我实际上在寻找一个任意矩阵
a b c
+--------
X | 1 0 1
Y | 1 1 1
Z | 0 1 1
+--------
找到所有序列[a | b | c]的最佳方法是什么,这样每个序列的X、Y和Z至少有一个真1值
在上述示例中,序列集没有特定顺序:
abc, ab, ac, bc, c
鉴于这些顺序不符合要求:
a (doesn't provide Z)
b (doesn't provide X)
我实际上在寻找一个任意矩阵的广义算法
有什么想法吗
获取不是每行的顺序。
确定这些序列的所有子序列。
你的答案是剩下的所有序列。
本质上,你是把不提供X的序列,不提供Y的序列和不提供Z的序列联合起来,然后取这个集合的补码
我认为这是一种概括。在O2^n时间内运行的一种可能的算法是递归地尝试每种可能性 所以在伪代码中:
validSequence(vector<columns> cols, vector<columns> sequence)
// base case for recursion
if (cols.empty)
if (validSequence(sequence))
printSequence(sequence)
else
// invalid sequence
// now we recurse using the next row and not using the next row
column nextRow = pop(cols)
validSequence(cols, sequence)
sequence.push(nextRow)
validSequence(cols, sequence)
显然,您仍然需要实现validSequencesequence函数,但我非常确定这会起作用
希望这对您有所帮助您可以确定满足X a、ab、ac、abc、bc、c的集合,将其与满足Y a、ab、ac、abc、b、bc、c的集合相交,并将结果与满足Z ab、ac、abc、b、bc、c等的集合相交 对于较大的矩阵,您可以使用此操作中的分治模式:取一半条件并确定其集合,取另一半条件并确定其集合,并与两个集合相交。对两个部分重复…基本上你在解X&Y&Z,其中X=a | c,Y=a | b | c,Z=b | c表示a,b和c 所以基本上你要寻找的是一个公式中的所有解。虽然存在一些简化,但基本上任何方法都是O2N。有效地找到这类问题的解决方案的算法列在下表中;然而,如果您想要所有的解决方案,您将迭代2N种可能性,所以简单地列举它们并进行测试就足够了 一些琐碎的优化: 公式中没有否定,所以如果你有一个解决方案,那么向该解决方案添加任何其他变量也将是一个解决方案。你的OP说你想要所有的解决方案;对于大型矩阵,将有许多基于相同必要基础和所有不必要值选择的解决方案。 如果您和列中的所有值相加并得到1,则该列是解决方案的基础该列和任何其他列的选择都是解决方案 如果您或某列中的所有值均为0,则该列不构成任何解决方案的基础 基于组合集合以查找基的方法仅在选择未选择的行时向集合中添加一列可能比查找所有解决方案的方法更好 如果采用组合解决问题的集合的方法(非解的并集或解的交集),则最好将行分为两行,对1数不多的行使用正方法,对0数不多的行使用负方法。
由于这是一个2N问题,因此可以合理地假设N将矩阵表示为一个图,然后可以找到所有簇。我很确定这在graphviz符号中是通用的,因为你可以把你的矩阵当作邻接矩阵来使用
graph G {
A -- X;
A -- Y;
B -- X;
B -- Y;
C -- X;
C -- Y;
C -- Z;
}
ABC可以到达XYZ
BC可以到达XYZ
交流能达到XYZ
AB可以到达XYZ
C可以到达XYZ
A无法到达XYZ
B无法到达XYZ
如果任意矩阵的零比一多,这比正的版本更糟糕-如果它在前对角线上只有一个,你要计算不匹配的N2N-1集合的并集,找到一个匹配的集合。这是对某些矩阵的优化;没有比2Hey Pete更好的通用方法了-非常感谢。你的帖子很有帮助。