1- ## 1. BM 算法介绍
1+ ## 1. Boyer Moore 算法介绍
22
3- BM 算法的全称叫做 ** 「 Boyer Moore 算法」 ** ,是由它的两位发明者 Robert S. Boyer 和 J Strother Moore 的名字来命名的。BM 算法是他们在 1977 年提出的高效字符串搜索算法。在实际应用中,比 KMP 算法要快 3~ 5 倍。
4-
5- > ** BM 算法思想** :对于给定文本串 ` T ` 与模式串 ` p ` ,先对模式串 ` p ` 进行预处理。然后在匹配的过程中,当发现文本串 ` T ` 的某个字符与模式串 ` p ` 不匹配的时候,根据启发策略,能够直接尽可能地跳过一些无法匹配的情况,将模式串多向后滑动几位。
3+ > ** Boyer Moore 算法** :简称为 BM 算法 ,是由它的两位发明者 Robert S. Boyer 和 J Strother Moore 的名字来命名的。BM 算法是他们在 1977 年提出的高效字符串搜索算法。在实际应用中,比 KMP 算法要快 3~ 5 倍。
4+ >
5+ > - ** BM 算法思想** :对于给定文本串 ` T ` 与模式串 ` p ` ,先对模式串 ` p ` 进行预处理。然后在匹配的过程中,当发现文本串 ` T ` 的某个字符与模式串 ` p ` 不匹配的时候,根据启发策略,能够直接尽可能地跳过一些无法匹配的情况,将模式串多向后滑动几位。
66
77BM 算法的精髓在于使用了两种不同的启发策略来计算后移位数:** 「坏字符规则(The Bad Character Rule)」** 和 ** 「好后缀规则(The Good Suffix Shift Rule)」** 。
88
@@ -12,7 +12,7 @@ BM 算法的精髓在于使用了两种不同的启发策略来计算后移位
1212
1313下面我们来讲解一下 BF 算法中的两种不同启发策略:「坏字符规则」和「好后缀规则」。
1414
15- ## 2. BM 算法启发策略
15+ ## 2. Boyer Moore 算法启发策略
1616
1717### 2.1 坏字符规则
1818
@@ -56,7 +56,7 @@ BM 算法的精髓在于使用了两种不同的启发策略来计算后移位
5656
5757![ ] ( https://qcdn.itcharge.cn/images/20220128162651.png )
5858
59- ## 3. BM 算法匹配过程示例
59+ ## 3. Boyer Moore 算法匹配过程示例
6060
6161下面我们根据 J Strother Moore 教授给出的例子,先来介绍一下 BF 算法的匹配过程,顺便加深对 ** 「坏字符规则」** 和 ** 「好后缀规则」** 的理解。
6262
@@ -114,23 +114,22 @@ BM 算法的精髓在于使用了两种不同的启发策略来计算后移位
114114
11511511 . 继续从模式串的尾部开始逐位比较,发现模式串全部匹配,于是搜索结束,返回模式串在文本串中的位置。
116116
117- ## 4. BM 算法步骤
117+ ## 4. Boyer Moore 算法步骤
118118
119119整个 BM 算法步骤描述如下:
120120
121- - 计算出文本串 ` T ` 的长度为 ` n ` ,模式串 ` p ` 的长度为 ` m ` 。
122-
123- - 先对模式串 ` p ` 进行预处理,生成坏字符位置表 ` bc_table ` 和好后缀规则后移位数表 ` gs_talbe ` 。
124- - 将模式串 ` p ` 的头部与文本串 ` T ` 对齐,将 ` i ` 指向文本串开始位置,即 ` i = 0 ` 。` j ` 指向模式串末尾位置,即 ` j = m - 1 ` ,然后从模式串末尾位置开始进行逐位比较。
125- - 如果文本串对应位置 ` T[i + j] ` 上的字符与 ` p[j] ` 相同,则继续比较前一位字符。
126- - 如果模式串全部匹配完毕,则返回模式串 ` p ` 在文本串中的开始位置 ` i ` 。
127- - 如果文本串对应位置 ` T[i + j] ` 上的字符与 ` p[j] ` 不相同,则:
128- - 根据坏字符位置表计算出在「坏字符规则」下的移动距离 ` bad_move ` 。
129- - 根据好后缀规则后移位数表计算出在「好后缀规则」下的移动距离 ` good_mode ` 。
130- - 取两种移动距离的最大值,然后对模式串进行移动,即 ` i += max(bad_move, good_move) ` 。
131- - 如果移动到末尾也没有找到匹配情况,则返回 ` -1 ` 。
121+ 1 . 计算出文本串 ` T ` 的长度为 ` n ` ,模式串 ` p ` 的长度为 ` m ` 。
122+ 2 . 先对模式串 ` p ` 进行预处理,生成坏字符位置表 ` bc_table ` 和好后缀规则后移位数表 ` gs_talbe ` 。
123+ 3 . 将模式串 ` p ` 的头部与文本串 ` T ` 对齐,将 ` i ` 指向文本串开始位置,即 ` i = 0 ` 。` j ` 指向模式串末尾位置,即 ` j = m - 1 ` ,然后从模式串末尾位置开始进行逐位比较。
124+ 1 . 如果文本串对应位置 ` T[i + j] ` 上的字符与 ` p[j] ` 相同,则继续比较前一位字符。
125+ 1 . 如果模式串全部匹配完毕,则返回模式串 ` p ` 在文本串中的开始位置 ` i ` 。
126+ 2 . 如果文本串对应位置 ` T[i + j] ` 上的字符与 ` p[j] ` 不相同,则:
127+ 1 . 根据坏字符位置表计算出在「坏字符规则」下的移动距离 ` bad_move ` 。
128+ 2 . 根据好后缀规则后移位数表计算出在「好后缀规则」下的移动距离 ` good_mode ` 。
129+ 3 . 取两种移动距离的最大值,然后对模式串进行移动,即 ` i += max(bad_move, good_move) ` 。
130+ 4 . 如果移动到末尾也没有找到匹配情况,则返回 ` -1 ` 。
132131
133- ## 5. BM 算法代码实现
132+ ## 5. Boyer Moore 算法代码实现
134133
135134BM 算法的匹配过程实现起来并不是很难,而整个算法实现的难点在于预处理阶段的「生成坏字符位置表」和「生成好后缀规则后移位数表」这两步上。尤其是「生成好后缀规则后移位数表」,实现起来十分复杂。下面我们一一进行讲解。
136135
@@ -219,7 +218,7 @@ def generageGoodSuffixList(p: str):
219218 return gs_list
220219```
221220
222- ### 5.3 BM 算法整体代码实现
221+ ### 5.3 Boyer Moore 算法整体代码实现
223222
224223``` Python
225224# BM 匹配算法
@@ -291,7 +290,7 @@ print(boyerMoore("abbcfdddbddcaddebc", "aaaaa"))
291290print (boyerMoore(" " , " " ))
292291```
293292
294- ## 6. BM 算法分析
293+ ## 6. Boyer Moore 算法分析
295294
296295- BM 算法在预处理阶段的时间复杂度为 $O(n + \sigma)$,其中 $\sigma$ 是字符集的大小。
297296- BM 算法在搜索阶段最好情况是每次匹配时,模式串 ` p ` 中不存在与文本串 ` T ` 中第一个匹配的字符。这时的时间复杂度为 $O(n / m)$。
0 commit comments