Boyer-Moore字符串搜索(BM算法)的Python实现
BM算法根据两个判据来进行字符串匹配,分别是“坏字符规则”和‘好后缀规则",其中好后缀规则可以单独使用,算法的图解可以参照下面这篇博文:
https://www.cnblogs.com/wxgblogs/p/5701101.html
采用Python语言对BM算法进行实现,实现过程分为3个函数,主循环函数和两个判据的数组生成函数。
def my_BM(t,p):
'''bm算法的自我实现,在t串中匹配p串,从模式串的尾部开始匹配'''
'''需要坏字符数组badchar[]和好后缀数组goodsuffix[]
每次失配后,根据两判据中最大的值移动p串,比较指针移动至最后'''
BadChar=BClist(p)
GoodSuffix=GSlist(p)
tlen,plen=len(t),len(p)
if tlen<plen:
return -1
i,k=plen-1,plen-1 #从p串尾部开始比较
move=0
while i<tlen and k>=0:
if t[i]==p[k]:
i,k=i-1,k-1
else:
BCmove=k-BadChar[ord(t[i])] if BadChar[ord(t[i])]!=-1 else plen
move=max(GoodSuffix[k],BCmove) #滑动位数
i,k=i+move+plen-1-k,plen-1
if k<=0:
return i+1
return -1 def BClist(p):
'''产生坏字符的失配移动表
j处失配,p串整体右移j-bc[T[j]]位'''
bc=[-1]*128 #标准ACCII表,可显示128个常用字符
plen=len(p)
for i in range(plen):
bc[ord(p[i])]=i #利用ord--chr函数的互相转化,间接直接将字符作为下标
return bc def GSlist(p):
'''产生好后缀方法的失配移动表,若i处失配,则分三种:相应地跳过字符个数逐渐变大
1. 已匹配成功的字符串形成的后缀gs,在p串中x存在相等的子串,则将p串右移i-x+1;
2. 条件1不成立,则在p的前缀中寻找gs的后缀相等的最大串,设后缀头在j,这一步类似于kmp的寻找最大相等前后缀,将p串右移j位;
3. 条件1,2都不成立,本轮比较失败,将p串整体移动p长度m'''
plen=len(p)
GS=[plen]*plen #初始化数组,并直接置于条件3的值
GS[plen-1]=1 #好后缀规则可以单独使用,它是基于已匹配的字符进行优化跳过,若首次匹配就失败,则应该只移动p串一位
for i in range(plen-1): #i处失配
#条件2,求i之后的后缀串,其在p串前缀中的最大相等前缀
#虽然也是求最大相等前后缀,但与kmp不同,kmp求的是前缀子串中的最大相等前后缀,而好后缀算法中求的是整个p串的最大相等前后缀,只是对该前后缀的长度做了限制
k=0
j=i+1
while j<plen:
if p[k]==p[j]:
k,j=k+1,j+1
else:
j=j-k+1
k=0
if k!=0:
GS[i]=plen-1-k
#搜寻p串中是否还有与p[i+1:]相等的子串,即条件1
substr=find_last(p[:plen-1],p[i+1:]) #find_last(t,p)函数寻找t串中最后一个p串的起始位置,若没有则返回-1
if substr!=-1:
GS[i]=i-substr+1
return GS
Boyer-Moore字符串搜索(BM算法)的Python实现的更多相关文章
- Boyer–Moore (BM)字符串搜索算法
在计算机科学里,Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法.它由Bob Boyer和J Strother Moore设计于1977年.此算法仅对搜索目标字符串(关键字)进行预处 ...
- 字符串与模式匹配算法(四):BM算法
一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右 ...
- 字符串匹配算法之BM算法
BM算法,全称是Boyer-Moore算法,1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法. BM算法定义了两个规则: ...
- 字符串匹配算法之 kmp算法 (python版)
字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺 ...
- hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)
基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...
- 【ToolGood.Words】之【StringSearch】字符串搜索——基于BFS算法
字符串搜索中,BFS算法很巧妙,个人认为BFS算法效率是最高的. [StringSearch]就是根据BFS算法并优化. 使用方法: string s = "中国|国人|zg人|fuck|a ...
- 对《禁忌搜索(Tabu Search)算法及python实现》的修改
这个算法是在听北大人工智能mooc的时候,老师讲的一种局部搜索算法,可是举得例子不太明白.搜索网页后,发现<禁忌搜索(Tabu Search)算法及python实现>(https://bl ...
- LeetCode初级算法的Python实现--排序和搜索、设计问题、数学及其他
LeetCode初级算法的Python实现--排序和搜索.设计问题.数学及其他 1.排序和搜索 class Solution(object): # 合并两个有序数组 def merge(self, n ...
- LeetCode初级算法的Python实现--字符串
LeetCode初级算法的Python实现--字符串 # 反转字符串 def reverseString(s): return s[::-1] # 颠倒数字 def reverse(x): if x ...
随机推荐
- 【SpringBoot基础系列-实战】如何指定 bean 最先加载(应用篇)
[基础系列-实战]如何指定 bean 最先加载(应用篇) 在日常的业务开发中,绝大多数我们都是不关注 bean 的加载顺序,然而如果在某些场景下,当我们希望某个 bean 优于其他的 bean 被实例 ...
- 建议11:增强数组排序的sort功能
sort方法不仅按字母顺序进行排序,还可以根据其他顺序执行操作.这时就必须为方法提供一个比较函数的参数,该函数要比较两个值,然后返回一个用于说明这两个值得相对顺序的数字.比较函数应该具有两个参数a和b ...
- 【Weiss】【第03章】队列例程
前几个例程还是相当简单的,把链表即时改了一下就是队列了. 还有想了一下,决定这种例程的代码放法是:先把测试代码默认折叠放在前面,然后把实现代码默认展开放在后面. 测试代码如下: #include &l ...
- qt creator源码全方面分析(3-5)
目录 qtcreatorlibrary.pri 使用实例 上半部 下半部 结果 qtcreatorlibrary.pri 上一章节,我们介绍了src.pro,这里乘此机会,把src目录下的所有项目文件 ...
- sql 语句系列(null 值处理)[八百章之第二章]
查找只存在一个表中的数据 有两张表: EMP: select * from emp DEPT: 他们有共同的属性:deptno 现在要查询EMP 中的deptno不等于DEPTNO的deptno项. ...
- TCP IP Socket In C, 2e-chapter 1 Introduction
本章是基础概念,建议补计算机网络基础,这里不全. 目录 1 网络,数据包,协议 2 关于地址(address) 2.1 IP地址格式 2.2 IPv4和IPv6共存 2.3 端口号 2.4 特殊地址 ...
- Natas2 Writeup(水平越权)
Natas2: 查看源码,发现页面隐藏了一个图片的连接,分析图片,无隐写内容,联想到目录权限问题,访问同级目录http://natas2.natas.labs.overthewire.org/file ...
- Recover刷机简介
Recovery Recovery是一种可以对安卓手机内部的数据文件进行修改的模式,类似电脑的PE.不同的recovery有不同的功能.使用recovery可以说是刷机(卡刷)的基础,想要比较顺畅的刷 ...
- Cisco 模拟配置
本次模拟:采用Cisco Packet Tracer 软件,进行cisco网络设备的模拟.可以实现CLI界面命令配置,同实际交换机一样. 1.同一VLAN 可以互相访问,不同VLAN 不能访问 PC0 ...
- 决战Leetcode: easy part(1-50)
本博客是个人原创的针对leetcode上的problem的解法,所有solution都基本通过了leetcode的官方Judging,个别未通过的例外情况会在相应部分作特别说明. 欢迎互相交流! em ...