在较大的密集矩阵中计算子矩阵的好算法是什么?如果我有一行数据,我可以使用后缀树,但我不确定是否将后缀树推广到更高的维度是非常简单或最好的方法。
思想?
我的天真解决方案是索引密集矩阵的第一个元素并消除全矩阵搜索,只提供了对全矩阵扫描的适度改进。
解决这个问题的最佳方法是什么?
Example:
Input:
Full matrix:
123
212
421
Search matrix:
12
21
Output:
2
此子矩阵在完整矩阵中出现两次,因此输出为2.完整矩阵可以是1000x1000,但搜索矩阵大到100x100(可变大小),并且我需要连续处理一些搜索矩阵。因此,这个问题的一个强大的力量太低效,无法满足几个矩阵的亚秒搜索时间。
答案 0 :(得分:3)
对于算法课程,我曾经做过一个练习,其中Rabin-Karp字符串搜索算法必须稍微扩展,以您描述的方式搜索匹配的二维子矩阵。
我认为如果您花时间了解维基百科上描述的算法,那么将它扩展到二维的自然方式将会很清楚。实质上,您只需在矩阵上进行多次传递,一次沿着一列爬行。有一些小技巧可以让时间复杂度尽可能低,但你可能根本不需要它们。
在N×N矩阵中搜索M×M矩阵,这种方法应该给你一个O(N²·M)算法。有了技巧,我相信它可以精炼到O(N²)。
答案 1 :(得分:3)
算法和计算理论手册建议什么是N ^ 2 * log(字母大小)解决方案。给定要搜索的子矩阵,首先要对其行进行重复数据删除。现在请注意,如果您逐行搜索大矩阵,则最多一个已删除的行可以出现在任何位置。使用Aho-Corasick在时间N ^ 2 * log(字母大小)中对其进行搜索,并在大矩阵中的每个单元处向下记录null或子矩阵的匹配行的标识符。现在再次使用Aho-Corasick搜索这个行匹配矩阵的列,并发出匹配信号,其中所有行都在彼此之下。
答案 2 :(得分:1)
我没有现成的答案,但这是我将如何开始:
- 您希望快速查找,您可以花多少(时间)来构建索引结构?当蛮力不够快时,你需要索引。
- 您对您未告诉我们的数据了解多少?所有矩阵中的所有值都是单位整数吗?
- 如果它们是单位数整数(或者您可以表示为单个字符或索引值的任何其他内容),请考虑线性化2D结构。一种方法是沿着从右上角到左下角的对角线读取矩阵,并从左上角到右下角进行扫描。难以用文字解释,但阅读矩阵:
1234
5678
90ab
cdef
as 125369470c8adbef
(搞定了?)
现在,您可以将超级矩阵索引到您的速度和空间要求所需的任何深度;在我的示例键1253中...指向元素(1,1),键abef指向元素(3,3)。不确定这是否适合您,您将不得不使用解决方案的参数。选择您喜欢的存储键值对的方法:哈希,列表,甚至在事情变得狂野时在索引中构建一些索引。
此致
标记
答案 3 :(得分:1)
这听起来类似于template matching.如果有动机,您可以使用FFT转换原始数组,并从强力搜索中删除日志。 (N log(M))而不是(N M)