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/
下面代码没有实现好字符的处理,有兴趣可以自己试试搞下:
文字描述可以到: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.
相关文章推荐
- 一款写书、写手册、电子书制作工具
- 安卓Activity全屏显示以及不显示title
- mongodb 探索
- 对Microsoft Windows 2008 Server R2上传文件限制200K更改
- 排序算法——宏观总结
- 基本字符串操作函数
- 缓存技术PK:选择Memcached还是Redis?
- JavaScript解析JSON
- 每天一个linux命令(2):cd命令
- 一些网络用语
- 国家基本药物学习班 止咳化痰中成药的简易选择
- iOS之创建一个常驻线程
- CentOS jemalloc库缺失问题
- 《从零开始学Swift》学习笔记(Day 12)——说几个特殊运算符
- Ubuntu终端出现Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
- Unity3D序列化ScriptableObject
- ural 1012
- 向用户征询IOS授权的五种常见设计模式
- 待解决的问题
- Windows/MFC_中dll __stdcall,__cdcel,extern c 和导出函数名