【问题标题】:Understanding Rabin-Karp algorithm with modulo arithmetic用模算术理解 Rabin-Karp 算法
【发布时间】:2022-08-19 03:31:21
【问题描述】:

我很难用模算术理解 Rabin-Karp 算法。我的问题。

  1. 为什么我们使用模数来确定被分析字符串的哈希值?

  2. 如何确定要使用的模数?

标签: string algorithm string-matching string-search rabin-karp


【解决方案1】:

首先,用于计算字符序列值的散列函数是什么? 其次,对文本正文中的每一个 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 + ......

【讨论】:

    猜你喜欢
    • 2018-04-09
    • 2012-04-09
    • 2022-01-18
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多