boyer moore算法 java_Boyer-Moore算法
坏字符规则:
后移位数 = 坏字符的位置 - 搜索词中的上一次出现位置
例如:
字符串: "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算法相关推荐
- BellmanFord算法与SPFA算法
Bellman-Ford Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Be ...
- 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)
声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...
- SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析
图像特征点提取算法的算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上.对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素点,在 ...
- 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)
目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...
- 标准K-means算法的缺陷、K-mean++初始化算法、初始化算法步骤、Kmeans++算法实现
标准K-means算法的缺陷.K-mean++初始化算法.初始化算法步骤.Kmeans++算法实现 目录 标准K-means算法的缺陷.K-mean&
- Apriori算法、FP-Growth算法、顺序分析、PrefixSpan算法
Apriori算法.FP-Growth算法.顺序分析.PrefixSpan算法 目录 Apriori算法.FP-Growth算法.顺序分析.PrefixSpan算法 Apriori算法 FP-Grow ...
- Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector
文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...
- 「AI科技」机器学习算法之K-means算法原理及缺点改进思路
https://www.toutiao.com/a6641916717624721933/ 2019-01-03 08:00:00 K-means算法是使用得最为广泛的一个算法,本文将介绍K-mean ...
- floyd算法_最短路径的算法:Floyd算法
点击箭头处"蓝色字",关注我们哦!! 算法 最短路径的算法-Floyd算法 ● ○ ● Shortest Path Algorithm - Floyd Algorithm ● ○ ...
- 【算法】模拟退火算法解决TSP问题的matlab实现
[算法]模拟退火算法解决TSP问题的matlab实现 参考文章: (1)[算法]模拟退火算法解决TSP问题的matlab实现 (2)https://www.cnblogs.com/wenyehoush ...
最新文章
- 世界人工智能创新大赛来了!
- 趣谈网络协议笔记-二(第五讲)
- 汇编语言--adc指令
- BLE-NRF51822教程10—动态密码(配对码)
- Oracle超出最大连接数问题及解决
- flutter 返回指定界面_Flutter页面路由导航及传参
- 新浪微博iOS版SDK“宝玉XP”框架学习笔记
- sql sum()对空值的处理
- [转]nodejs深入学(7)理解Buffer
- 【hdu 4658】Integer Partition (无序分拆数、五边形数定理)
- 华为鸿蒙2.0安装包,鸿蒙2.0系统官网正式版下载-华为鸿蒙2.0系统官网安装包下载-战地2中文网...
- VC6.0 files---open 出现 MSDEV.exe错误,Project ---- add to project 出现错误等等~~
- structs2本地(国际)化
- 如何隐藏电脑下方工具栏个别图标_怎么隐藏电脑任务栏右边的各种小图标 - 卡饭网...
- 20145201 《信息安全系统设计基础》期中总结
- 读 Robert C. Solomon 之《哲学导论》
- 古城钟楼微博地支报时程序铛,100行代码实现,价值一天20万粉丝
- 基于Tushare的上证综指行情分析与影响其涨跌的因素(以美债为例)
- Win10桌面图标显示不正常变成了白色
- AOSP ~ Camera - RK HAL3 ( 一 )
热门文章
- HDU - 2041 - 超级楼梯(dp)
- 【推导】计蒜客17119 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F. Trig Function
- jenkins 入门教程(下)
- Ruby 2.2.0发布,支持增量式垃圾收集和符号的垃圾收集
- javascript体系-DOM原理
- Ubuntu下安装配置Open×××
- [MOSS开发]:WSS v3授权
- Solid Converter PDF
- Python lambda 关键字
- SparkStreaming读取Kakfa数据时发生OffsetOutOfRangeException异常