坏字符规则:

后移位数 = 坏字符的位置 - 搜索词中的上一次出现位置

例如:

字符串: "HERE IS A SIMPLE EXAMPLE"

搜索串: "EXAMPLE"

以S为例,它对应搜索串第6位, 上一次出现在搜索词的''-1''(未出现)

即:

后移 = 6 - (-1) = 7

"HERE IS A SIMPLE EXAMPLE"

"EXAMPLE"

再以P为例,对应搜索串的第6位,在搜索词的上一次第4位

即:

后移 = 6 - 4 = 2

"HERE IS A SIMPLE EXAMPLE"

"EXAMPLE"

好后缀规则:

(1) "好后缀"的位置以最后一个字符为准。假定"ABCDEF"的"EF"是好后缀,则它的位置以"F"为准,即5(从0开始计算)。

(2) 如果"好后缀"在搜索词中只出现一次,则它的上一次出现位置为 -1。比如,"EF"在"ABCDEF"之中只出现一次,

则它的上一次出现位置为-1(即未出现)

(3) 如果"好后缀"有多个,则除了最长的那个"好后缀",其他"好后缀"的上一次出现位置必须在头部。

比如,假定"BABCDAB"的"好后缀"是"DAB"、"AB"、"B",请问这时"好后缀"的上一次出现位置是什么?

回答是,此时采用的好后缀是"B",它的上一次出现位置是头部,即第0位。

这个规则也可以这样表达:如果最长的那个"好后缀"只出现一次,

则可以把搜索词改写成如下形式进行位置计算"(DA)BABCDAB",即虚拟加入最前面的"DA"。

后移位数 = 好后缀的位置 - 搜索词中的上一次出现位置

例如:

"HERE IS A SIMPLE EXAMPLE"

"EXAMPLE"

所有的"好后缀"(MPLE、PLE、LE、E)之中,只有"E"在"EXAMPLE"中并且还出现在头部,

所以:

后移 = 6(E在搜索词中的位置) - 0(E在搜索词中的上一次的位置) = 6。

"HERE IS A SIMPLE EXAMPLE"

"EXAMPLE"

Boyer-Moore算法基本思想 : 每次后移这两个规则之中的较大值。

def bm_match(target, part):

target_len = len(target)

part_len = len(part)

# 临时长度

_ = len(part)

cur = 1

def bad():

""" 生成坏词规则

构建搜索词中各字符上一次出现位置

"""

_dict = {}

for index, value in enumerate(part):

_dict[value] = index

return _dict

def good_postfix(cur):

""" 生成好后缀规则

做好后缀和前缀的匹配

# >>> b = 'EXAMPLE'

# >>> for i in range(4,0,-1):

# ... print(b[-i:],b[:i], i)

# ...

# MPLE EXAM 4

# PLE EXA 3

# LE EX 2

# E E 1

"""

for i in range(cur, 0, -1):

if part[-i:] == part[:i]:

return i - 1

return 0

bad_dict = bad()

while part_len <= target_len:

# 判断part与target对应位是否相同

if part[-cur] == target[_ - cur]:

cur += 1

if cur > part_len:

return _ - part_len

else:

b = (part_len - cur) - bad_dict.get(target[_ - cur], -1)

g = 0

# 好后缀大于1个才进行好后缀匹配

if cur > 1:

g = part_len - good_postfix(cur)

_ += max(b, g)

cur = 1

return -1

if __name__ == '__main__':

print(bm_match('HERE IS A SIMPLE EXAMPLE', 'EXAMPLE'))

# 输出为17

boyer moore算法 java_Boyer-Moore算法相关推荐

  1. BellmanFord算法与SPFA算法

    Bellman-Ford Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Be ...

  2. 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)

    声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...

  3. SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析

    图像特征点提取算法的算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上.对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素点,在 ...

  4. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  5. 标准K-means算法的缺陷、K-mean++初始化算法、初始化算法步骤、Kmeans++算法实现

    标准K-means算法的缺陷.K-mean++初始化算法.初始化算法步骤.Kmeans++算法实现 目录 标准K-means算法的缺陷.K-mean&

  6. Apriori算法、FP-Growth算法、顺序分析、PrefixSpan算法

    Apriori算法.FP-Growth算法.顺序分析.PrefixSpan算法 目录 Apriori算法.FP-Growth算法.顺序分析.PrefixSpan算法 Apriori算法 FP-Grow ...

  7. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

  8. 「AI科技」机器学习算法之K-means算法原理及缺点改进思路

    https://www.toutiao.com/a6641916717624721933/ 2019-01-03 08:00:00 K-means算法是使用得最为广泛的一个算法,本文将介绍K-mean ...

  9. floyd算法_最短路径的算法:Floyd算法

    点击箭头处"蓝色字",关注我们哦!! 算法 最短路径的算法-Floyd算法 ● ○ ● Shortest Path Algorithm - Floyd Algorithm ● ○ ...

  10. 【算法】模拟退火算法解决TSP问题的matlab实现

    [算法]模拟退火算法解决TSP问题的matlab实现 参考文章: (1)[算法]模拟退火算法解决TSP问题的matlab实现 (2)https://www.cnblogs.com/wenyehoush ...

最新文章

  1. 世界人工智能创新大赛来了!
  2. 趣谈网络协议笔记-二(第五讲)
  3. 汇编语言--adc指令
  4. BLE-NRF51822教程10—动态密码(配对码)
  5. Oracle超出最大连接数问题及解决
  6. flutter 返回指定界面_Flutter页面路由导航及传参
  7. 新浪微博iOS版SDK“宝玉XP”框架学习笔记
  8. sql sum()对空值的处理
  9. [转]nodejs深入学(7)理解Buffer
  10. 【hdu 4658】Integer Partition (无序分拆数、五边形数定理)
  11. 华为鸿蒙2.0安装包,鸿蒙2.0系统官网正式版下载-华为鸿蒙2.0系统官网安装包下载-战地2中文网...
  12. VC6.0 files---open 出现 MSDEV.exe错误,Project ---- add to project 出现错误等等~~
  13. structs2本地(国际)化
  14. 如何隐藏电脑下方工具栏个别图标_怎么隐藏电脑任务栏右边的各种小图标 - 卡饭网...
  15. 20145201 《信息安全系统设计基础》期中总结
  16. 读 Robert C. Solomon 之《哲学导论》
  17. 古城钟楼微博地支报时程序铛,100行代码实现,价值一天20万粉丝
  18. 基于Tushare的上证综指行情分析与影响其涨跌的因素(以美债为例)
  19. Win10桌面图标显示不正常变成了白色
  20. AOSP ~ Camera - RK HAL3 ( 一 )

热门文章

  1. HDU - 2041 - 超级楼梯(dp)
  2. 【推导】计蒜客17119 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F. Trig Function
  3. jenkins 入门教程(下)
  4. Ruby 2.2.0发布,支持增量式垃圾收集和符号的垃圾收集
  5. javascript体系-DOM原理
  6. Ubuntu下安装配置Open×××
  7. [MOSS开发]:WSS v3授权
  8. Solid Converter PDF
  9. Python lambda 关键字
  10. SparkStreaming读取Kakfa数据时发生OffsetOutOfRangeException异常