Skip to content

Commit 2e167e1

Browse files
committed
Update 02.String-Rabin-Karp.md
1 parent f593f94 commit 2e167e1

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

Contents/06.String/02.String-Single-Pattern-Matching/02.String-Rabin-Karp.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
## 1. RK 算法介绍
1+
## 1. Rabin Karp 算法介绍
22

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` 不匹配的文本位置,然后在其余位置继续检查匹配项。
46
5-
> **RK 算法思想**:对于给定文本串 `T` 与模式串 `p`,通过滚动哈希算快速筛选出与模式串 `p` 不匹配的文本位置,然后在其余位置继续检查匹配项。
7+
## 2. Rabin Karp 算法步骤
68

7-
## 2. RK 算法步骤
9+
### 2.1 Rabin Karp 算法整体步骤
810

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`
2020

2121
### 2.2 滚动哈希算法
2222

@@ -56,7 +56,7 @@ $\begin{align} Hash(ate) &= (Hash(cat) - c \times 26 \times 26) * 26 + e \times
5656

5757
因为哈希值过大会造成溢出,所以我们在计算过程中还要对结果取模。取模的值应该尽可能大,并且应该是质数,这样才能减少哈希碰撞的概率。
5858

59-
## 3. RK 算法代码实现
59+
## 3. Rabin Karp 算法代码实现
6060

6161
```Python
6262
# T 为文本串,p 为模式串,d 为字符集的字符种类数,q 为质数

0 commit comments

Comments
 (0)