多模式匹配
2012年3月25日 小桥流水 74次阅读 发表评论 阅读评论
最近工作上要用到多模式匹配的算法,所以就搜索一些资料,写篇博客分享一下。今天开始用word来写博客了,也试试效果。
之前在百度实习的时候,也用到过多模式匹配,但是别的部门提供的一个公共库dictmatch。我搜了看到百度互联网技术官方博客上面还有几篇介绍dictmatch的几篇博客,链接如下:
【百度分享】dictmatch及多模算法串讲 -- 简介
【百度分享】dictmatch及多模算法串讲 -- dictmatch基本数据结构及算法
dictmatch及多模算法串讲(一)
dictmatch及多模算法串讲(二)
但是这个对于我来说,略显有点复杂了,我也不想去搞一个这么大的工程。我找了一圈,我们的公共库里面也没有提供这样的算法。另外,我依稀记得这个东西因为是用树的结构来存的,还是比较费内存的。我记得,我当时将这个东西改成hash_map这样的东东来实现的,而且效率也完全可以达到要求的。
记得当时是把模式串(要查找的串)放到hashmap中,然后把被查询串切词,切完词后进行相邻组合然后到hash_map中查询是否存在,对于比较短的被查询串来说这个方法还是比较快的,但是对于长的查询串来说可能就不行了,复杂度是O(n^2),其中n为被查询串切词后的长度。
目前我的做法是对于任意一个模式串,用字符串查找算法来判定是否包含该模式串,复杂度为O(m+n)*k(m表示模式串的长度,n为查询串的长度,k为模式串的数量),这种复杂度已经不能满足我的需求了。
我去网上找了找,多模式匹配算法大概有以下几种:
clip_image002
当然最近几年也会有一些改进的算法。网上找了以下最好一种算法的源码,感觉挺复杂的,要学习这个方法也很费劲。找到了一个比较好的实现,代码如下:
?View Code CPP
越看这个代码越觉得复杂。这说明直接上来就代码还是比较困难的,应该先了解清楚了算法,然后才能去看代码或者说是自己来实现代码。
后来我就觉得这样来搞不是很靠谱,自己写一个这样的算法还是比较困难的,所以就想在网络上找个更好的代码,先凑合着用。
网上翻了几个帖子之后,我发现其实我可以用正则表达式来实现我的这个功能,正则表达式中的|(或)直接就可以满足我的需求。就是将所有的模式串或起来,然后搞成一个正则表达式,然后直接用这个正则表达式进行搜索就Ok了,正好能满足我的需求,明天去公司了就准备这么干了。
下载为PDF