python不支持的数据类型,python基础教程
参考文献:https://www.ruanx.net/kmp/
为了理解算法,用你的笔画出播放软件匹配器过程的不同情况是有意义的。
辅助函数做准备计算模式的信息预计算下一个列表(模式):
在相应地不匹配后,获取偏移量(返回列表的元素可以用作模式下一个要匹配的字符的索引)
单子是由模式独立计算的!
参数:
模式(字符串):模式字符串
退货:
列表:元素是不匹配后的偏移量,在每种情况下,您可以从模式的继续位置进行匹配;
您可以使用匹配字符数-1作为索引来查询最长公共序列前缀和后缀的长度,或者返回列表的元素可以用作模式的下一个字符的索引来匹配字符串,以加快匹配过程
len_list=len(模式)
#注意,长度值是基于真实(严格)子串的,它不包括字符串本身
next_list=[]
next_list.append(0) #第一个值(下一个列表[0])初始化为0(第一个长度元素值表示匹配的茶的个数只有1;类似地,下一个列表的第二个值意味着匹配的字符是2,)
#的添加字符索引,用于计算最长公共子字符串前缀和后缀的下一个小数位数
#添加字符索引表示增加的比例(这也意味着要测试最后一个匹配字符的后继字符)
_ add _ char _ index=1
#已计算的长度(现在_长度将是下一个列表的元素)
now_length=0
#同时现在_长度可以作为判断_添加_字符_索引字符是否匹配新前缀的索引
#总是从字符模式[0]开始计算长度!根据不同的情况(即不同的_添加_字符_索引情况),它可能更长或更短
#该过程涉及三个尺度值:要计算的当前尺度长度值:现在_长度(判断值),now_length-1(已知长度值);
正在…循环将计算下一个列表的第二个值(以及其他更晚的长度值)
而_adding_char_index len_list:
幸运的是:添加一个字符后,前缀是相同的
判断新字符是否可以添加到新的比例前缀中
我们必须知道,虽然有不同的规模(情况),但所有前缀有相同的开始字符
#注意,模式的第一个字符是模式[0]
#模式[添加字符索引]来自模式的第二个字符
if pattern[now _ length]==pattern[the _ adding _ char _ index]:# matched!
now_length=1
_ add _ char _ index=1
#这个新尺度是计算出来的!它可以被记录到下一个列表中
next_list.append(现在长度)
#不匹配:
否则:
#在本例中,now _ length=1(因为我们打算访问下一个列表[当前长度-1])
#否则,然后执行最后一个"否则"分支案例
如果现在_长度:#迭代长度值
#使用上次缩放计算的长度值(略小于当前缩放现在_长度)来计算下一个长度值(更大的缩放)
#这是播放软件算法的基本部分
#使用现在_长度-1(已知长度值)计算当前的计算刻度
#这种方法把案件转化为幸运案件(只是规模变小)来解决
now _ length=next _ list[now _ length-1]# now _ length=0
否则:
#在这种情况下,将长度值显式设置为0
next_list.append(0)
_ add _ char _ index=1
返回下一个列表
kmp(字符串,模式)def kmp(字符串,模式):
s=0 #偏移
#位置将继续匹配(作为模式字符串的指定索引)
postion _ to _ continue=0
下一个列表=预先计算下一个列表(模式)
而s len(字符串):
#匹配!
#如果两个字符相同,步进索引(s和位置)
#蛮力(天真)法也一样
如果字符串==模式[position _ to _ continue]:
s=1
postion _ to _ continue=1
elif位置_继续:#不匹配!(postion _ to _ continue=1)
#根据下一个列表查找要继续匹配的字符
# position _ to _ continue-1=0
#下一个列表从0开始计数,所以,如果我们想访问下一个列表的第一个元素,我们使用next _ list[0];
位置继续=下一个列表[位置继续-1]
否则:
s=1 #保持位置不变
#判断子字符串是否完全匹配,然后打印
#绳子
if position _ to _ continue==len(pattern):
打印(s位置_继续_ 1)
位置继续=下一个列表[位置继续-1]
string= teababaca _ aaaeeaae
# pattern=ea
模式1=eea
# pattern=aacaa
# pattern= aadabaadaadaa
# pattern=acbabaca
模式2=阿巴巴卡
# print(pre_calculate_next_list模式1))
#打印(kmp())
kmp(字符串,模式1)
kmp(字符串,模式2)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。