KMP算法

本文详细解析了KMP算法的核心概念与实现步骤,包括前缀函数的计算方法及模式串匹配的过程。通过实例演示,帮助读者清晰掌握KMP算法的原理与实践应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

KMP算法我看了很多次,每次都觉得自己理解了,但是当返回头来用的时候,就又觉得不是很理解,今天我就把思路整理一下好了:

KMP算法主要有两个部分,1)计算next前缀函数,其实就是一个数组,每个元素储存了如果模式串和Target串在改点匹配不成功时,应该将模式串的那个点与之匹配。

2)实现模式串匹配

 

1)计算前缀函数:

该函数的基本思想是,找到某一点i前面(包含该点)前缀等于后缀的最大长度:举例:a b a a b a,其中设初始next[1] = 0,next[2]怎么算呢?包括下面几种情况,如果a[2]==a[1],那么next[2] = 1;如果a[2]!= a[1],证明前缀等于后缀的个数为0,那么next[2]=k=0;

next[3]呢?因为要找前缀和后缀,如果前面已经匹配了a[1],则匹配a[2],如果前面没有匹配a[1],那么就只能从头匹配a[1],在此例中,因为next[2]=0,意味着a[2]未与T匹配,故继续从头匹配。因为a[3]==a[1],next[3]=k=1;

next[4]呢?正如前面所述,由于next[3]>0,故a[3]已经与T匹配了k个,则a[4]需要和a[k+1]进行匹配,即a[2],由于未匹配成功,故需要继续往前匹配,即a[1],匹配成功,则next[4] = k = 1;

next[5]呢?正如前面所述,由于next[4]>0,故a[4]已经与T匹配了k个,则a[5]需要和a[k+1]进行匹配,即a[2],由于匹配成功,则next[5] = k = 2;

next[6]呢?正如前面所述,由于next[5]>0,故a[5]已经与T匹配了k个,则a[6]需要和a[k+1]进行匹配,即a[3],由于匹配成功,则next[6] = k = 3;

伪代码如下:

next[1] = 0;//前缀数组

k = 0;//代表匹配的个数

for i=2:length

  while k>0 && a[k+1] != a[i]

    k = next[k];

  if a[k+1] == a[i]

    k = k + 1;

  next[i] = k;

return next

 

2)KMP实现

m = T.length

n = P.length

next = 前缀函数返回值

k = 0;//匹配的个数

for i = 1: m // 每个元素进行匹配

  while k > 0 && P[k + 1] != T[i]

    k = next[k];

  if P[k+1] == T[i]

    k = k +1;

  if k == m

    return i-n

  k = next[k]//将k移动至next[k]

end

 

转载于:https://www.cnblogs.com/jiangnanrain/p/4368244.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值