【问题标题】:Algorithm - Searching in 2D matrix算法 - 在二维矩阵中搜索
【发布时间】:2018-03-26 12:25:12
【问题描述】:

我有一个更大的二维字符网格NxN(2 <= N <= 800)。我得到了一个较小的KxK( 2 <= K <= 100) 二维网格。例如,让 N = 3 和 K = 2 以及以下是矩阵,

更大:

abc
abd
aaa

更小:

bd
aa

问题 1: 如果较大的矩阵包含较小的矩阵,我必须返回。例如上面较小的矩阵匹配较大的矩阵。

问题 2:如果找到,我必须返回 NxN 上的凝视位置混搭部分。上面的例子返回匹配并且 position = (1, 1) #0 based

我的假设:

我的假设是使用散列。但如果有任何更好的想法来有效地搜索。例如,我可以创建一个哈希函数,它将为所有有效位置的 NxN(2x2、3x3、4x4、...、100x100,因为 K 可以达到 100)中的所有可能的正方形生成索引

(0,0), (0,1), ..., (0, N-K)
(1,0), (1,1), ..., (1, N-K)
. .
. .
(N-K,0), (N-K, 1) .... (N-K, N-K)

然后我可以在相关索引中保留位置,当输入 KxK 出现时,我只需运行相同的哈希函数并查看返回的索引是否有位置。

【问题讨论】:

  • 如果您搜索图像处理算法以在图像中找到子图像,您可能会找到相关的东西。
  • 如果你有的话,比尔可以分享一下
  • 也许这个问题可以通过将KMP算法泛化到2D(如果可能的话)来解决。
  • 请分享您的哈希方法的详细信息,否则我们无法知道它已经有效。
  • @MrSmith42 请看我的更新

标签: algorithm multidimensional-array hash


【解决方案1】:

这个问题的诀窍是使用一个散列函数,当你移动一个位置时,你可以在 O(1) 中更新它。这会将复杂度降低到 O(N^2)。

这种散列函数的一个例子是h = sum(x[i] * 2^i) % some_large_prime_number。其中x[i] 是第 i 个字符的 ascii 代码。要更新你会做的

h_new = ((h_previous -
          (x[position_to_remove] * 2^k)) * 2 +
          (x[position_to_add] * 2^0
        ) % some_large_prime_number`

哈希函数不是很强,所以你会得到一些误报。 为了提高匹配的信心,用几个不同的大素数重复算法。它仍然会产生误报,但这种情况很少见。

注意:小心选择一个不会溢出整数类型的素数。您也可以对中间结果应用“%”操作以防止溢出。在大多数语言中,对于负输入,'%' 模运算也会返回一个负数(当你做减法时,你需要自己进行环绕)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2011-03-19
    • 2010-12-30
    • 2017-08-25
    • 2011-08-30
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多