美文网首页
KMP算法优化

KMP算法优化

作者: 塘朗山小钻风 | 来源:发表于2019-09-25 20:33 被阅读0次

KMP算法是根据三个发现者名字首字母缩写命名的。

图1

是一种启发式的跳过搜索算法。在搜索过程中如果搜索串有个字母与目标串不匹配,移动搜索串开头到匹配位置(特例:如果是第一个字母就不匹配,搜索串也要移动一位)。要处理就是如下这种特例。如果搜索串不匹配字符前面字符串有如下匹配模式。

图2:在不包括字母C的字符串中找出尽量长的两个子串,子串分别连接开头和结尾

就如图1最后那行所标示的:内部有2个子串“ab”相等。所以搜索串又要回退两个位置(ab的长度)如图1第4行。

如下是我对这算法的一点优化尝试,使用Lua实现:

local pattern = 'abaabcac'

local jump = {}

function CalcJump()

local i = 1

    while (i <= #pattern) do

if i == 1 then

table.insert(jump, 1)

else

local half_count = math.floor(i/2)

if string.sub(pattern, 1, half_count) == string.sub(pattern, i-half_count+1, i) then

table.insert(jump, i+1-half_count)

else

if i == 2 then

table.insert(jump, 1)

else

local half_count = math.floor((i-1)/2)

local inserted = false

for _i = half_count, 1, -1 do

if string.sub(pattern, 1, _i) == string.sub(pattern, i-_i, i-1) then

table.insert(jump, i-1-_i)

inserted = true

end

end

if not inserted then

table.insert(jump, i)

end

end

end

end

i = i + 1

    end

end

CalcJump()

function Matchs(str)

local offset = 0

while offset <= #str - #pattern do

for j = 1, #pattern do

if string.byte(pattern, j) ~= string.byte(str, offset + j) then

offset = offset + jump[j]

break

end

if j == #pattern then  --退出

print(string.sub(str, offset+1), offset)

offset = offset + 1

end

end

end

end

Matchs('abcabaaaabaabcac')

实现原理就是更细致的分析搜索串的内部匹配。使得搜索算法能以更长的步长跳跃。

相关文章

  • KMP算法及优化

    转载请注明出处: KMP算法及优化 今天看到同学在复习数据结构书上的KMP算法,忽然发觉自己又把KMP算法忘掉了,...

  • 算法(2)KMP算法

    1.0 问题描述 实现KMP算法查找字符串。 2.0 问题分析 “KMP算法”是对字符串查找“简单算法”的优化。 ...

  • KMP算法优化

    KMP算法是根据三个发现者名字首字母缩写命名的。 是一种启发式的跳过搜索算法。在搜索过程中如果搜索串有个字母与目标...

  • AC自动机及多模式匹配

    在接触AC自动机之前,只仅仅掌握单模式匹配的算法:比如KMP、BMH等算法;经过优化后,KMP和BMH都具有线性时...

  • KMP 专题整理

    KMP 学习记录 kuangbin专题十六——KMP KMP 学习总结 朴素 KMP 算法 拓展 KMP 算法(E...

  • 子字符串查找(2)——KMP算法

    一、定义 KMP(Knuth-Morris-Pratt)算法,其实是对暴力查找算法的优化。在暴力查找算法中,用于追...

  • 对KMP算法的一些理解

    最近学到KMP算法,下面讲讲对KMP算法的一些个人理解,希望对大家有帮助! 对于KMP算法的理解: 整个KMP算法...

  • KMP算法文章合集

    字符串的查找:朴素查找算法和KMP算法 暴力匹配算法与KMP算法(串的匹配) 字符串查找算法BF和KMP 字符串匹...

  • 串的模式匹配算法

    KMP算法 算法匹配

  • 计算机科学家做的事情

    更快 提出一个新算法解决之前存在的问题(比如RSA算法解决了加解密的问题) 优化之前的算法比如KMP、深度学习(比...

网友评论

      本文标题:KMP算法优化

      本文链接:https://www.haomeiwen.com/subject/xngiuctx.html