拉宾附近算法四五月白羊座
Rabin Karp Algorithm for 2D arrays
如何扩展 rabin karp 以在 nxn 个字符中寻找 mxm 模式?
谁能想出伪代码?对算法的时间复杂度有影响吗?
一种方法分为三个步骤:
1) 对于每条水平线,使用 Rabin-Karp 滚动散列来计算散列值,该散列值覆盖沿着该线的每个连续的长度为 k 的散列字符。
2) 对于每一列,使用 Rabin-Karp 滚动散列在列中向下滚动,以获取在步骤 (1) 中计算的散列值,用于长度为 k 的连续文本段,它们位于彼此的正上方和正下方,并计算 a对应于文本矩形的组合哈希值。
3) 像以前一样查找文本矩形。
在第 2 步中,我们从第 1 步生成的 X[0] + X[1]*P + X[1]*P^2+... 形式的值开始。如果使用乘数 P ^k 对于第二步,您应该能够在一个矩形上得到一个哈希函数,如果您将矩形重新排列为单行并计算出一个长的 Rabin-Karp 哈希。
如上所述,您需要足够的存储来保存所有矩形输入的哈希值。应该很容易将其减少到足够的存储空间以在输入中保存哈希值 运行 的矩形,但深度仅与您正在搜索的模式一样深。如果您全神贯注并进行更多计算,您可能会做得更好。很明显,您可以在搜索之前将区域划分,代价是沿着划分边界重做正方形。
如何扩展 rabin karp 以在 nxn 个字符中寻找 mxm 模式?
谁能想出伪代码?对算法的时间复杂度有影响吗?
一种方法分为三个步骤:
1) 对于每条水平线,使用 Rabin-Karp 滚动散列来计算散列值,该散列值覆盖沿着该线的每个连续的长度为 k 的散列字符。
2) 对于每一列,使用 Rabin-Karp 滚动散列在列中向下滚动,以获取在步骤 (1) 中计算的散列值,用于长度为 k 的连续文本段,它们位于彼此的正上方和正下方,并计算 a对应于文本矩形的组合哈希值。
3) 像以前一样查找文本矩形。
在第 2 步中,我们从第 1 步生成的 X[0] + X[1]*P + X[1]*P^2+... 形式的值开始。如果使用乘数 P ^k 对于第二步,您应该能够在一个矩形上得到一个哈希函数,如果您将矩形重新排列为单行并计算出一个长的 Rabin-Karp 哈希。
如上所述,您需要足够的存储来保存所有矩形输入的哈希值。应该很容易将其减少到足够的存储空间以在输入中保存哈希值 运行 的矩形,但深度仅与您正在搜索的模式一样深。如果您全神贯注并进行更多计算,您可能会做得更好。很明显,您可以在搜索之前将区域划分,代价是沿着划分边界重做正方形。