【发布时间】:2022-08-19 03:31:21
【问题描述】:
我很难用模算术理解 Rabin-Karp 算法。我的问题。
-
为什么我们使用模数来确定被分析字符串的哈希值?
-
如何确定要使用的模数?
-
阅读en.wikipedia.org/wiki/…,它解释了散列函数的基本原理,以及如何选择模数。
标签: string algorithm string-matching string-search rabin-karp
我很难用模算术理解 Rabin-Karp 算法。我的问题。
为什么我们使用模数来确定被分析字符串的哈希值?
如何确定要使用的模数?
标签: string algorithm string-matching string-search rabin-karp
首先,用于计算字符序列值的散列函数是什么? 其次,对文本正文中的每一个 M 字符序列进行哈希处理不是很耗时吗?
将 M 字符序列视为以 b 为底的 M 位数字,其中 b 是字母表中的字母数。文本子序列 t[i .. i+M-1] 是 映射到数字:
x(i) = t[i]*b^M-1+ t[i+1]*b^M-2+...+ t[i+M-1]
此外,给定 x(i),我们可以在恒定时间内计算下一个子序列 t[i+1 .. i+M] 的 x(i+1),如下所示:
x(i+1) = t[i+1]∗b^M-1+ t[i+2]*b^M-2+...+ t[i+M]
x(i+1) = x(i)*b (Shift left one digit)
- t[i]*b^M (Subtract leftmost digit)
+ t[i+M] Add new rightmost digit
通过这种方式,我们永远不会显式计算新值。我们只需在移动一个字符时调整现有值。
如果 M 很大,那么结果值 (b^M) 将是巨大的。出于这个原因,我们通过将其取模素数 q 来散列该值。
mod 函数在这种情况下特别有用,因为它有几个固有属性:
[(x mod q) + (y mod q)] mod q = (x+y) mod q
(x mod q) mod q = x mod q
由于这些原因:
h(i) = ((t[i]* b^M-1mod q) +(t[i+1]* b^M-2mod q) +... +(t[i+M-1] mod q)) mod q
h(i+1) =( h(i)* b mod q (Shift left one digit)
-t[i]* b^M mod q (Subtract leftmost digit)
+t[i+M] mod q ) (Add new rightmost digit)
mod q
我们可以使用以下公式确定哈希值:
(1st letter) X (prime) + (2nd letter) X (prime)¹ + (3rd letter) X (prime)² X + ......
【讨论】: