[英]How to store and query a lot of matrices?
给定k N x M维矩阵(例如M1 .. M5)。 值是零和一。 您将如何找到与查询矩阵(例如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按位查询来查找它们。 如果矩阵变得更大(例如100x100),这项工作(缩放)是否可行?
1&2。使用稀疏矩阵方法并在第一次碰撞时终止,可以实现次线性(<O(n * m))解。 基本上,每一行都有一个索引列表,索引列表的值为1,看看是否有冲突。 从技术上讲,如果Q具有1的最后一列以外的0,则Q可以为O(n * m),而M只是该值的倒数。
3.这部分的答案取决于系统的限制以及矩阵的组成方式。 如果矩阵不是稀疏的,并且您正在查看内存使用情况,则可以将行存储为可分解为1和0的整数的集合。 如果矩阵稀疏,则可以简单地存储点集合。
构造另一个矩阵,例如P
,大小为N*M
,其中每个元素都是大小为k
。 如果第k
矩阵在(i,j)
处为1
,则P(i,j)
第k
位被设置。 给定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))
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.