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

Algorithm 三元矩阵的交

Algorithm 三元矩阵的交,algorithm,binary,intersection,Algorithm,Binary,Intersection,考虑二进制变量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出现在所有矩阵中。因为在矩阵X1

考虑二进制变量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出现在所有矩阵中。因为在矩阵X1中,b0=1,b1=2,b2=1,b3=1与1011相同。在matrix2中,b0=1,b1=0,b2=1,b3=2与1011相同,在matrix3中,b0=2,b1=2,b3=2,b3=1与1011相同


如何找到所有3个矩阵中存在的所有二进制字符串?

我认为最简单且合理有效的算法是对所有可能的组合进行强制检查。从0000开始,然后是0001,然后是0010,等等。对每个矩阵进行迭代并比较值。在第一次匹配时,转到下一个矩阵,在不匹配时,立即拒绝

你们将不得不迭代每个矩阵最多16次,这仍然是O(N)从矩阵的大小

如果要优化实际比较,可以为每个矩阵预计算查找字符串。为0-allowed和1-allowed创建反向位掩码,并使用查询字符串的位掩码has-0和has-1。若两个结果中的任何一个非零(您只需添加或检查结果),字符串将不匹配

在任何情况下,任何类型的比较实现都应该非常快,因为您将只执行16*(1000+1000+1000)操作,而不是您可能正在考虑的(1000*1000*1000)操作。

想法是将每一行“扩展”到它的一组可能性,因此例如1022将扩展为:

1000
1001
1010
1011

然后,可以方便地将每个字符串转换为整数(由于“字符串”的长度为4位,因此为单字节整数),并将其放入排序数组,甚至一个集合中

下一步是按长度对组进行排序,从最小到最大,然后迭代最小的组值,并查看它是否存在于所有其他组中,这是非常快的,因为“解析”步骤中的准备工作


为所有组传递的每个值都是匹配的。

2
不是二进制值。没有显示任何变量。关于“如何”:编写程序代码。你的问题在哪里?关于算法的问题不应该与特定的语言/平台联系在一起。你的问题到底是什么?你需要一个有效的算法吗?有多少个矩阵?每个矩阵最多有多少行?“二进制字符串”是否总是长度为4?“二进制字符串”总是等于一个矩阵行还是可以跨越多行?是的,我需要一个有效的算法。矩阵的数量最多可达100。每个矩阵最多可以有1000行。长度始终为4的“二进制字符串”。“二进制字符串”必须始终等于矩阵行。它不能跨越多行。
b0
<代码>b3是四个名称,而不是三个名称。他们似乎持有三种不同的价值观,而不是两种。也许你应该先把问题解决好。看看“二进制”是什么意思。