给出 k N x M 维矩阵(例如M1 ... M5)。值为零且仅为1。您如何找到与查询矩阵冲突的所有矩阵,例如 Q ?碰撞意味着查询矩阵是否具有" 1"与数据库中的矩阵处于相同的位置。
示例:
对于这个简单的例子,算法应该为查询找到M1,M2,M3,M4而不是M5,因为没有与查询矩阵匹配的那些。
M1: M3: +-----------------+ +-----------------+ | 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 1 | | 0 1 1 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 | | 0 1 1 0 0 1 1 0 | | 0 0 1 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 | | 0 0 1 0 0 0 0 1 | +-----------------+ +-----------------+ M2: M4: +-----------------+ +-----------------+ | 0 0 0 0 0 1 1 0 | | 0 0 0 0 0 0 0 0 | | 0 0 1 1 0 0 0 0 | | 1 1 1 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 | +-----------------+ +-----------------+ M5: +-----------------+ | 0 0 0 0 0 0 0 0 | | 0 0 0 0 1 0 0 0 | | 0 0 0 0 0 1 0 0 | | 0 0 0 0 0 0 0 0 | +-----------------+ Q: +-----------------+ | 0 0 0 0 0 0 0 0 | | 0 0 1 0 0 0 0 0 | | 0 0 1 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 | +-----------------+
天真的解决方案:
迭代所有矩阵并按位进行AND:
匹配:
M1: 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 Q: 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -------------------------------------------------------------------------- M1 && Q: 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 --------------------------------------------------------------------------
不匹配:
M5: 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 Q: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------------------------------------------------------------------------- M5 && Q: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 --------------------------------------------------------------------------
对问题3的注释: 我考虑将矩阵的整数值存储在MySQL表中,并使用MySQL按位查询来查找它们。如果矩阵变得更大,这是否有效(比例) 100×100?
答案 0 :(得分:1)
1& 2.可以使用稀疏矩阵方法实现子线性(< O(n * m))解,并在第一次碰撞时终止。基本上在每一行中都有一个索引列表,其中包含1并查看是否存在冲突。从技术上讲,如果Q为0,则可以是O(n * m),除了1的最后一列,而M只是其中的倒数。
3.这部分的答案取决于系统的限制以及矩阵的组成方式。如果矩阵不稀疏,并且您正在查看内存使用情况,则可以将行存储为一组分解为1和0的整数。如果矩阵稀疏,您只需存储一组点。
答案 1 :(得分:1)
构建另一个大小为P
的{{1}}矩阵,其中每个元素都是大小为N*M
的位集。如果k
- 矩阵在P(i,j)
处k
,则k
设置1
位。给定(i,j)
,从空Q
- 位集k
开始。对于每Result
(i,j)
,Q(i,j)==1
,Result |= P(i,j)
。此算法需要O(k*N*M)
预处理时间。每个后续查询都在O(N*M*(number of 1s in Q))
中运行。