繁体   English   中英

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

[英]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 
--------------------------------------------------------------------------

问题:

  1. 可以在亚线性时间内完成吗?
  2. 是否有比给定的幼稚方法更好的算法?
  3. 在数据库中存储和查询矩阵数据的一种好方法是什么?

问题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 ,从空的kResult 对于每个(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM