考虑二元变量b0,b1,b2,b3的3个矩阵。所有这些矩阵具有相同的列数,但可以是不同的行数。矩阵的每个元素可以具有三个值1,0或2,其中2表示无关紧要。我必须找到在所有三个矩阵中出现的二进制字符串。例如,考虑以下3个矩阵:
matrix1:
1 0 2 2
2 2 0 0
1 2 1 1
matrix2:
2 2 0 2
1 0 1 2
matrix3:
2 2 1 2
1 2 2 1
2 2 2 1
因此,对于此示例,字符串b0 = 1,b1 = 0,b2 = 1,b3 = 1存在于所有矩阵中。因为,在矩阵1中,b0 = 1,b1 = 2,b2 = 1,b3 = 1与1011相同。在矩阵2中,b0 = 1,b1 = 0,b2 = 1,b3 = 2与1011相同,在矩阵3中,b0 = 2,b1 = 2,b3 = 2,b3 = 1与1011相同。
如何查找所有3个矩阵中存在的所有二进制字符串?
答案 0 :(得分:2)
我们的想法是将每一行“扩展”为一组可能性,例如1022扩展为:
1000
1001
1010
1011
然后,将每个字符串转换为整数(单字节整数,因为“字符串”为4位长)并放置在有序数组中,甚至是一个集合都很方便。
下一步是按长度对组进行排序,从最小到最大,然后迭代最小的组值并看到它存在于所有其他组中,由于“解析”步骤中的准备工作,这非常快
为所有组传递的每个值都是匹配。
答案 1 :(得分:1)
我认为最简单和合理有效的算法将是强力检查所有可能的组合。从0000开始,然后是0001,然后是0010等。对于每个矩阵,迭代每个矩阵并比较值。在第一场比赛中,转到下一个矩阵,在不匹配时,立即拒绝。
你必须迭代每个矩阵最多16次,这仍然是矩阵大小的O(N)。
如果要优化实际比较,可以预先计算每个矩阵的查找字符串。为0-allowed和1-allowed创建反向位掩码,并使用has-0和has-1查询字符串的位掩码进行AND运算。如果两个结果中的任何一个非零(您可以只添加或OR它们并检查结果),则字符串将不匹配。
在任何情况下,对于任何类型的比较实现它都应该非常快,因为你将只做16 *(1000 + 1000 + 1000)而不是(1000 * 1000 * 1000)操作,你可能正在考虑。< / p>