c++ kmp算法字符匹配_使用kmp算法匹配字符串来查找文件(java版本)2

前言

接上篇文章, 这里完成改文章的后部分, 以python编写的版本

正文如下

同时,我也对原先写的python代码进行了修改,使用KMP算法

python实现KMP算法代码

python实现的KMP算法核心代码如下

def kmpSearchStrByStr(totalStr, strSearch, kmpTable):

#kmp算法查找
#返回字符串中包含搜索串的个数

listSearch = list(strSearch)
listTotal = list(totalStr)

s = 0
t = 0
existCount = 0
while((s < len(listSearch)) & (t < len(listTotal))):
if(listSearch[s] == listTotal[t]):
if((s + 1) != len(listSearch)):
s+=1
t+=1
else:
existCount+=1
if((len(listTotal) - (t + 1)) >= len(listSearch)):
s = 0
t+=1
else:
break;
elif(s == 0):
s = 0
t+=1
else:
s = s - (s - kmpTable[(s - 1)])
if((t + 1) >= len(listTotal)):
break
#print(existCount)
return existCount



def getKMPtable(strSearch):

#获取kmp的部分匹配数值表
#但得先获取字符串所有可能长度的最大公告元素长度,将其存放到int数组中返回

intTablesLength = len(strSearch)
kmpTable = []

for i in range(intTablesLength):
strItem = strSearch[0 : i + 1]
intMaxPublicNum = getMaxPublicNum(strItem)
kmpTable.append(intMaxPublicNum)

#print(kmpTable)
return kmpTable


def getMaxPublicNum(strItem):

#获取前缀和后缀,并最终对比得到最大的公共元素长度,并返回

intMaxPublicNum = 0
intItemLength = len(strItem)

listFront = []
listBack = []

for i in range(intItemLength - 1):
listFront.append(strItem[0 : i + 1])

for i in range(intItemLength, 1, -1):
listBack.append(strItem[i - 1 : intItemLength])

n = -1
for i in range(intItemLength - 1):
if(listFront[i] == listBack[i]):
n = i
if(n != -1):
intMaxPublicNum = len(listFront[n])

#print(intMaxPublicNum)
return intMaxPublicNum
python和java搜索对比

python实现的字符串搜索文件和java实现的字符串搜索文件,其运行速率对比还是很明显,估计问题就在python对文件编码格式上面,如图

0a24f886faf4ad33011831931f8fc182.png

速率相差太大,估计就是代码的问题 java代码同样也是臃肿…

引用文章https://blog.csdn.net/sunnyyoona/article/details/44004563


正文结束

大致看了下我上面的代码, 代码有点子烂阿


author:            cg

create time:    2017-09-15 15:29:28

post time:       2020-11-21 11:55


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值