当前位置:  编程技术>c/c++/嵌入式

快速模式匹配算法(KMP)的深入理解

    来源: 互联网  发布时间:2014-10-16

    本文导语:  恐怕现在用过电脑的人,一定都知道大部分带文本编辑功能的软件都有一个快捷键ctrl+f 吧(比如word)。这个功能主要来完成“查找”,“替换”和“全部替换”功能的,其实这就是典型的模式匹配的应用,即在文本文件中查...

恐怕现在用过电脑的人,一定都知道大部分带文本编辑功能的软件都有一个快捷键ctrl+f 吧(比如word)。这个功能主要来完成“查找”,“替换”和“全部替换”功能的,其实这就是典型的模式匹配的应用,即在文本文件中查找串。

1.模式匹配
模式匹配的模型大概是这样的:给定两个字符串变量S和P,其中S成为目标串,其中包含n个字符,P称为模式串,包含m个字符,其中m= 0)//迭代的过程
        {
            i = next[i];
        }
        if(str[j] == str[i+1])
        {
            next[j] = i+1;
        }
        else
        {
            next[j] = -1;
        }
    }
}

现在有了next数组保存的k值,就可以实现KMP算法了:
代码如下:

View Code
//des是目标串,pat是模式串,len1和len2是串的长度
int kmp(char des[],int len1,char pat[],int len2)
{
    Next(str2,len2);
    int p=0,s=0;
    while(p < len2  && s < len1)
    {
        if(pat[p] == des[s])
        {
            p++;s++;
        }
        else
        {
            if(p==0)
            {
                s++;//若第一个字符就匹配失败,则从des的下一个字符开始
            }
            else
            {
                p = next[p-1]+1;//用失败函数确定pat应回溯到的字符
            }
        }
    }
    if(p < len2)//整个过程匹配失败
    {
        return -1;
    }
    return s-len2;
}

时间复杂度:
对于Next函数近似接近O(m),KMP算法的时间复杂度为O(n),所以整个算法的时间复杂度为O(n+m)
空间复杂度:
多引入了O(m)的空间复杂度。
4.应用KMP的一道面试题
给定两个字符串是s1和s2,要判定s2是否能够被s1做循环移位得到的字符串包含。例如s1=AABCD,s2 =CDAA,返回true,因为s1循环移位可以变成CDAAB。给定s1=ACBD和s2=ACBD则返回false。
分析:不难发现对s2移位得到的字符串都将是字符串s1s1的子串,如果s2可以有s1循环移位得到,那么s2一定是s1s1的子串,这时KMP算法是不是就很管用了呢。

    
 
 

您可能感兴趣的文章:

  • php正则表达式中的非贪婪模式匹配
  • [VIM] 如何在匹配的模式中插入
  • 用于文本抽取的模式匹配语言 TXR
  • 问一个expr模式匹配问题
  • 还是那个模式匹配的问题!
  • awk 模式匹配问题
  • Java模式匹配库 JMatch
  • MySQL 字符串模式匹配 扩展正则表达式模式匹配
  • 深入串的模式匹配算法(普通算法和KMP算法)的详解
  • JavaScript模式匹配库 matches.js
  • aix下c的模式匹配(常规表达式)问题,急!!!!
  • 字符串的模式匹配详解--BF算法与KMP算法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Android开发之文件操作模式深入理解
  • Informatica bulk与normal模式的深入详解
  • 用代码和UML图化解设计模式之桥接模式的深入分析
  • 深入c#工厂模式的详解
  • 深入C#字符串和享元(Flyweight)模式的使用分析
  • ACE反应器(Reactor)模式的深入分析
  • Java源码分析:深入探讨Iterator模式
  • Office 2010 Module模式下使用VBA Addressof
  • 在linux下如何在桌面环境下切换到命令行模式,如何在命令行模式切换到桌面模式
  • GOF设计模式简介- 责任链模式
  • linux epoll的ET模式和LT模式的主要区别是什么呢?为什么ET模式一定要用非阻塞socket?
  • 无线网卡工作模式介绍以及如何设置工作模式
  • 用户模式和内核模式
  • VS2012+MySQL+SilverLight5的MVVM开发模式介绍
  • IA32架构下,能从保护模式返回实模式吗?
  • java观察者模式概念及相关类介绍
  • 如何从字符模式切换到图形模式?
  • Docker 四种网络模式及网络配置详细介绍
  • 如何从文本模式返回到桌面模式
  • 怎么从图形模式进入文字模式?
  • 如何进入安全模式或console模式
  • 图形模式 和 命令模式 有什么特别的区别吗?
  • 如何从桌面模式切换到文本模式??
  • 开机进入文本模式,怎样启动图形模式?
  • 一般的linux嵌入式设备,系统工作在实模式还是保护模式下呢
  • 不按Esc键,Vim如何从编辑模式切换到普通模式
  • 切换Oracle的归档模式以及非归档模式
  • 我在KDE中选择了TWM模式后,启动那个模式,可是无法返回到KDE界面下,应该怎么操作?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3