zoukankan      html  css  js  c++  java
  • 字符串匹配算法——总结

    1. 朴素算法:即暴力法

    缺点在于,未能充分利用位移s所提供的信息。比如p=aaab,发现位移s=0是有效的。则位移1,2,3都不是有效位,因为T[4]=b。

    时间复杂度:O((n-m+1)m)

    2. rabin-karp

    利用的是数论: 若a==b, 则 a≡b(mod q) ; 若a≠b(mod q), 则一定有a≠b

    分别将P[m],T[s,s+m]转化成一个数值,再对值进行比较。如果不等,则一定有P[m] ≠ T[s,s+m];如果相等,则P[m]可能==T[s,s+m],再对P[m]和T[s,s+m]一一检测。

    又因为Ts+1 可以直接从T推导出,所以算法复杂度降低。

    算法分两步走:1.预处理:计算模式P和T[m]对应的数值。 时间复杂度为O(m)

                        2.匹配:时间复杂度O((n-m+1)m),因为每一个数都可能是有效位移。

    但实际中,可能的有效位移很少,所以算法的期望匹配时间为O((n-m+1)+cm)=O(n+m)

    3.字符串匹配自动机: 对于这个已弃疗。。。。。

    4.KMP算法

    分两步骤:1.预处理,计算模式P的前缀函数prefix[],复杂度O(m)

                  2.检测匹配串,根据prefix[]来计算有效位移,复杂度O(n)

    其中prefix[q] 是 模式Pq的 既是真前缀也是真后缀的字串 的 最长长度。 

    算法代码如下:

    5.BM算法

     将 坏字符的位移 和 最好后缀的 位移综合起来的。

    算法待看。。。。。。原理想得不是很清楚

  • 相关阅读:
    自我学习笔记08
    自我学习笔记07
    自我学习笔记06
    自我学习笔记05
    自我学习笔记04
    自我学习笔记03
    自我学习笔记02
    WebApi HttpUtils
    Android 正则表达式,Pattern,Matcher基本使用
    Andriod项目结构
  • 原文地址:https://www.cnblogs.com/renrenbinbin/p/4445964.html
Copyright © 2011-2022 走看看