您的位置:首页 > 其它

erl_string-字符串匹配的Boyer-Moore算法

2015-09-14 11:46 337 查看
Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。

文字描述可以到:http://kb.cnblogs.com/page/176945/

下面代码没有实现好字符的处理,有兴趣可以自己试试搞下:

%%字符串匹配的Boyer-Moore算法
boyer_moore(Words,CWords)->
boyer_moore1(Words,length(Words),CWords,length(CWords)).
boyer_moore1(_,LenW,_,LenCW) when LenCW < LenW->
false;
boyer_moore1(Words, LenW, CWords, LenCW) ->
{HCW,TCW} = lists:split(LenW,CWords),
case boyer_moore2(Words,lists:reverse(Words),lists:reverse(HCW),[]) of
true->
true;
MovePos->
{_,TCW1} = lists:split(MovePos,HCW),
boyer_moore1(Words, LenW, TCW1++TCW, LenCW-MovePos)
end.
boyer_moore2(_,[],[],_)-> %%反序匹配到第一个字母相等则找到
true;
boyer_moore2(Words,[HW|TW],[HCW|TCW],Matched) when HW == HCW->
boyer_moore2(Words,TW,TCW,[HW|Matched]);
boyer_moore2(Words, [HW|_TW], [HCW|_TCW], Matched) when HW =/= HCW ->
BadLPos = length(Words)-length(Matched)-1,
BadMove = check_bad_boyer_moore2(Words,HCW,BadLPos),
GoodMove = check_good_boyer_moore2(Words,Matched),
erlang:max(GoodMove,BadMove).
%%后移位数 = 好后缀的位置 - 搜索词中的上一次出现位置 Matched (暂时没好的方法实现)
check_good_boyer_moore2(_Words,_Matched)->
0.
%%后移位数 = 坏字符的位置 - 搜索词中的上一次出现位置(从0开始编号)
check_bad_boyer_moore2(Words,HW,BadLPos)->
case catch lists:foldl(fun(TemW,{TP,Count})->
case TemW == HW of
true->
throw(Count);
_->
{TP,Count+1}
end
end,{-1,0},Words) of
{-1,_}->
length(Words);
FirstSamePos when is_integer(FirstSamePos)->
BadLPos - FirstSamePos;
_ ->
length(Words)
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: