zoukankan      html  css  js  c++  java
  • 多模式匹配

    多模式匹配 - 小桥流水的博客

    多模式匹配
    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
  • 相关阅读:
    lua时间戳和日期转换及踩坑【转】
    Js正则表达式验证输入是否有特殊字符【转】
    PHP数据类型转换【转】
    JavaScript indexOf() 方法
    CSS文本下划线 删除线 上划线【转】
    PHP中把stdClass Object转array的几个方法【转】
    2020软件工程作业02
    2020软件工程作业01
    2020 CCPC Wannafly Winter Camp Day1-F-乘法
    牛客-装货物
  • 原文地址:https://www.cnblogs.com/lexus/p/2939144.html
Copyright © 2011-2022 走看看