|
1 | | -## 1. RK 算法介绍 |
| 1 | +## 1. Rabin Karp 算法介绍 |
2 | 2 |
|
3 | | -RK 算法的全称叫 **「Rabin Karp 算法」**,是由它的两位发明者 Michael Oser Rabin 和 Richard Manning Karp 的名字来命名的。RK 算法是他们在 1987 年提出的、使用哈希函数以在文本中搜寻单个模式串的字符串搜索算法。 |
| 3 | +> **Rabin Karp 算法**:简称为 RK 算法。是由它的两位发明者 Michael Oser Rabin 和 Richard Manning Karp 的名字来命名的。RK 算法是他们在 1987 年提出的、使用哈希函数以在文本中搜寻单个模式串的字符串搜索算法。 |
| 4 | +> |
| 5 | +> - **Rabin Karp 算法思想**:对于给定文本串 `T` 与模式串 `p`,通过滚动哈希算快速筛选出与模式串 `p` 不匹配的文本位置,然后在其余位置继续检查匹配项。 |
4 | 6 |
|
5 | | -> **RK 算法思想**:对于给定文本串 `T` 与模式串 `p`,通过滚动哈希算快速筛选出与模式串 `p` 不匹配的文本位置,然后在其余位置继续检查匹配项。 |
| 7 | +## 2. Rabin Karp 算法步骤 |
6 | 8 |
|
7 | | -## 2. RK 算法步骤 |
| 9 | +### 2.1 Rabin Karp 算法整体步骤 |
8 | 10 |
|
9 | | -### 2.1 RK 算法整体步骤 |
10 | | - |
11 | | -- 对于给定的文本串 `T` 与模式串 `p`,求出文本串 `T` 的长度为 `n`,模式串 `p` 的长度为 `m`。 |
12 | | -- 通过滚动哈希算法求出模式串 `p` 的哈希值 `hash_p`。 |
13 | | -- 再通过滚动哈希算法对文本串 `T` 中 `n - m + 1` 个子串分别求哈希值 `hash_t`。 |
14 | | -- 然后逐个与模式串的哈希值比较大小。 |
15 | | - - 如果当前子串的哈希值 `hash_t` 与模式串的哈希值 `hash_p` 不同,则说明两者不匹配,则继续向后匹配。 |
16 | | - - 如果当前子串的哈希值 `hash_t` 与模式串的哈希值 `hash_p` 相等,则验证当前子串和模式串的每个字符是否真的相等(避免哈希冲突)。 |
17 | | - - 如果当前子串和模式串的每个字符相等,则说明当前子串和模式串匹配。 |
18 | | - - 如果当前子串和模式串的每个字符不相等,则说明两者不匹配,继续向后匹配。 |
19 | | -- 比较到末尾,如果仍未成功匹配,则说明文本串 `T` 中不包含模式串 `p`,方法返回 `-1`。 |
| 11 | +1. 对于给定的文本串 `T` 与模式串 `p`,求出文本串 `T` 的长度为 `n`,模式串 `p` 的长度为 `m`。 |
| 12 | +2. 通过滚动哈希算法求出模式串 `p` 的哈希值 `hash_p`。 |
| 13 | +3. 再通过滚动哈希算法对文本串 `T` 中 `n - m + 1` 个子串分别求哈希值 `hash_t`。 |
| 14 | +4. 然后逐个与模式串的哈希值比较大小。 |
| 15 | + 1. 如果当前子串的哈希值 `hash_t` 与模式串的哈希值 `hash_p` 不同,则说明两者不匹配,则继续向后匹配。 |
| 16 | + 2. 如果当前子串的哈希值 `hash_t` 与模式串的哈希值 `hash_p` 相等,则验证当前子串和模式串的每个字符是否真的相等(避免哈希冲突)。 |
| 17 | + 1. 如果当前子串和模式串的每个字符相等,则说明当前子串和模式串匹配。 |
| 18 | + 2. 如果当前子串和模式串的每个字符不相等,则说明两者不匹配,继续向后匹配。 |
| 19 | +5. 比较到末尾,如果仍未成功匹配,则说明文本串 `T` 中不包含模式串 `p`,方法返回 `-1`。 |
20 | 20 |
|
21 | 21 | ### 2.2 滚动哈希算法 |
22 | 22 |
|
@@ -56,7 +56,7 @@ $\begin{align} Hash(ate) &= (Hash(cat) - c \times 26 \times 26) * 26 + e \times |
56 | 56 |
|
57 | 57 | 因为哈希值过大会造成溢出,所以我们在计算过程中还要对结果取模。取模的值应该尽可能大,并且应该是质数,这样才能减少哈希碰撞的概率。 |
58 | 58 |
|
59 | | -## 3. RK 算法代码实现 |
| 59 | +## 3. Rabin Karp 算法代码实现 |
60 | 60 |
|
61 | 61 | ```Python |
62 | 62 | # T 为文本串,p 为模式串,d 为字符集的字符种类数,q 为质数 |
|
0 commit comments