【问题标题】:Worst Time Complexity for 2D Patten Matching2D 模式匹配的最差时间复杂度
【发布时间】:2014-03-20 22:17:01
【问题描述】:

使用蛮力算法进行 2D 模式匹配的最差时间复杂度是多少?

如果 haystack-size = n an needle-size = m(都是正方形),我觉得它是 O(m^2 * n^2)。

我到达那里的方法是使用 m = 2 和 n = 4 时的简单案例场景。如果我们在行中水平移动(匹配大海捞针中的 m x m 个字符),我们会进行 m^2 字符串比较(n - 1) 次。我们垂直重复 (n-1) 次。因此,时间 = m^2 (n - 1) x (n - 1) = m^2 * n^2 - 2 * m^2 * n + m*2 = O(m^2 * n^2)。

这个分析正确吗?是 O(m^2 * n^2) 还是应该是 O(m^2 * n^2 - 2 * m^2 * n + m*2)?

编辑:我只是比较两个字符串矩阵,或者可能是两个位矩阵。示例:

haystack = [["a", "b", "c", "d"],
            ["e", "f", "g", "h"],
            ["i", "j", "k", "l"],
            ["m", "n", "o", "p"]]
needle = [["j", "k"],
          ["n", "o"]]

【问题讨论】:

  • 什么是“使用蛮力算法进行二维模式匹配”?
  • 我只是比较两个字符串矩阵,即两个多维字符串数组。请参阅上面的编辑。
  • 似乎干草堆/针都可以看作是线性序列;也就是说,只是一个普通的“str in str”搜索,略有不同的是,在匹配尝试期间,干草堆指针以不同的步幅前进 - 例如不是总是加 1,而是 1,3(haystackwidth-1),1,3,.. 但这不会改变线性化序列中初始 haystack/needle 的起始位置。
  • 那么你是说时间复杂度还是一样的吗?
  • 我想它会是 O(n*m) 根据原生的“str in str”,其中 n 和 m 指的是每个矩阵中 元素 的数量(不是矩阵的维度)。

标签: algorithm pattern-matching time-complexity


【解决方案1】:

匹配2个二维数组,查找所有子数组,我认为是m*n*o*p(如果第一个数组是m*n,第二个是o*p),判断是否有单个char火柴。然后我会说你需要将它乘以更大数组的维度,因为这会给你可能的子数组的数量。但毫无疑问,有一种比蛮力法更聪明的方法,它从最小的匹配子阵列开始,智能地扩展它,可能使用动态编程。我会研究子串匹配算法,因为这是类似的,但是是二维的。

【讨论】:

  • 我只是比较两个字符串矩阵,即两个多维字符串数组。请参阅上面的编辑。
  • 你可以在线性时间内匹配字符串,就像你可以匹配子矩阵一样
  • 是的,但我正在考虑暴力匹配的复杂性,即用针匹配大海捞针中的每个可能的子正方形。
  • 此处给出的蛮力算法的 2D 等效项:link。 2D 版本需要 O(mn) 时间。
  • @Jess 这不是蛮力
猜你喜欢
  • 2021-07-08
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 2020-09-08
相关资源
最近更新 更多