如何存储和查询很多矩阵?

时间:2014-07-24 15:28:56

标签: mysql algorithm matrix mariadb

问题:

给出 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 
--------------------------------------------------------------------------

问题:

  1. 这可以在次线性时间内完成吗?
  2. 是否有比给定的天真方法更好的算法?
  3. 在数据库中存储和查询矩阵数据的好方法是什么?
  4. 对问题3的注释: 我考虑将矩阵的整数值存储在MySQL表中,并使用MySQL按位查询来查找它们。如果矩阵变得更大,这是否有效(比例) 100×100?

2 个答案:

答案 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)==1Result |= P(i,j)。此算法需要O(k*N*M)预处理时间。每个后续查询都在O(N*M*(number of 1s in Q))中运行。