【问题标题】:Algorithm to count occurrences of a matrix inside a larger one计算较大矩阵中出现的矩阵的算法
【发布时间】:2011-09-09 16:22:03
【问题描述】:

我现在面临一个问题,我需要计算某个 MxM 矩阵出现在 NxN 矩阵中的次数(这个矩阵应该大于第一个矩阵)。关于如何做到这一点的任何提示?我打算用 C 来实现它,没有办法改变它。

修订版 1

大家好,我真的要感谢所有关于此事的答案和意见。我应该告诉你,经过数小时的努力,我们得出的解决方案并非严格像 Boyer-Moore 方法,而是我自己的算法。我计划在测试完成后发布它。现在,这些解决方案正在适应并行化,以使用带有 C 库 MPI 的大学集群进行速度优化。

【问题讨论】:

  • 到目前为止你想到了什么?
  • @Oli_Charlesworth 我在考虑线性矩阵表示,c 实现它们的方式,并寻找向量模式匹配算法,但是有很多事情需要一些指针来开始至少一个他们

标签: c algorithm matrix count


【解决方案1】:

嗯,听起来像是字符串匹配的二维版本。我想知道是否有 2D 版本的 Boyer-Moore?

A Boyer-Moore Approach for Two-Dimensional Matching

啊,显然有。 :-)

【讨论】:

【解决方案2】:

立即想到的一种方法:

将大矩阵视为 N*N 个“字符”的线性字符串,将小矩阵视为长度为 (M+1)*M 的线性正则表达式,每个“行”的前 M 个位置有“字面字符” " 并且在每行的剩余位置相当于.{N-M}。将正则表达式编译为 DFA 并运行它。

找到所有匹配项的时间是 O(N*N)。我怀疑有更高级的算法可以工作(更高级的一维子字符串搜索算法的改编),但这个还不错。

【讨论】:

    【解决方案3】:

    最近,已经开发出用于构建 2D 后缀树的快速算法。这些可用于及时找到较大矩阵中的任何方形子矩阵,而与较大矩阵的大小无关:

    您可能需要成为订阅者才能查看这些论文。

    我还发现了这个免费提供的,它描述了一种预期线性时间的随机构造算法:

    如果您需要在单个矩阵中搜索许多不同的子矩阵,我希望构建 2D 后缀树并使用它进行搜索会更快,但如果您要在不同的矩阵中搜索,它可能会比 2D Boyer-Moore 慢矩阵。

    【讨论】:

    • “与较大矩阵的大小无关”绝对是错误的。考虑在 NxN 矩阵中搜索 1x1 子矩阵。没有办法在少于 N^2 的时间内找到它。也许你的意思是独立于较小矩阵的大小......??
    • @R.:您忘记了索引构建时间,这当然需要查看所有 NxN 元素。构建完成后,2D 后缀树将让您在 NxN 矩阵中搜索一个 1x1 子矩阵,只需大约一个步骤,就像 1D 后缀树可以让您在大约 6 个步骤中找到莎士比亚所有作品中是否出现“香蕉” . (这是查找单个事件的时间复杂度——列出所有事件需要更多时间。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2018-01-21
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多