c++ - 在大矩阵中找到一个矩阵

标签 c++ algorithm

我有一个非常大的 n*m 矩阵 S。我想有效地确定在 S 内部是否存在子矩阵 F。大矩阵 S 的大小可以达到 500*500

为了澄清,考虑以下几点:

S = 1 2 3 
    4 5 6
    7 8 9

F1 = 2 3 
     5 6

F2 = 1 2 
     4 6

在这种情况下:

  • F1S
  • 里面
  • F2 不在 S

矩阵中的每个元素都是一个32 位 整数。我只能想到使用暴力法来查找F 是否是S 的子矩阵。我用谷歌搜索找到了一种有效的算法,但我找不到任何东西。

是否有一些算法或原理可以更快地完成它? (或者可能是一些优化蛮力方法的方法?)

PS统计数据

A total of 8 S
On average, each S will be matched against about 44 F.
The probability of success match (i.e. F appears in a S) is 
19%.

最佳答案

它涉及对矩阵进行预处理。这会占用大量内存,但在计算时间方面应该会更好。

  • 检查前检查子矩阵的大小是否小于矩阵的大小。
  • 在构建矩阵时,构建一个结构,将矩阵中的值映射到矩阵中的 (x,y) 位置数组。这将允许您检查是否存在候选可能存在的子矩阵。您将使用子矩阵中 (0,0) 处的值,并获取该值在较大矩阵中的可能位置。如果职位列表为空,则您没有候选人,因此子矩阵不存在。这是一个开始(然而,更有经验的人可能认为这是一种幼稚的方法)。

关于c++ - 在大矩阵中找到一个矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16750739/

相关文章:

algorithm - 查找数组中缺失的数字

c++ - 为什么 vector 迭代器指向越界?

c++ - 如何在 yacc 中声明 "struct"变量

c++ - 在 Windows 上使用 Google Test 时内存泄漏

c++ - 用 C++ 编写 Haskell 解释器(使用 ghc 或 hugs 作为库)

c++ - 将 char 数组传递给参数化构造函数

algorithm - 指定执行自动学习的算法

c++ - ASCII 字符哈希冲突测试

algorithm - 时间复杂度单循环与多顺序循环

algorithm - 实现Stack的高效算法是什么?