`
hcegg
  • 浏览: 32297 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

KMP算法总结

 
阅读更多
    一般的字符串匹配,时间复杂度是O(m*n),KMP算法的时间复杂度为O(m+n).
    一般的字符串匹配过程,一次匹配失败后,指针i(指向原串),指针j(指向子串)都回退至初始位置。而KMP核心思想是计算子串的next函数值(这个可以通过对子串进行预处理得到),据此决定指针i,j的指向。而子串的next函数值与原串无关,其实质是比较子串中末几位与首几位相同的位数情况。
    关于如何求得next函数值:
    (1)next[0]= -1 意义:任何串的第一个字符的模式值规定为-1。
    (2)next[j]= -1   意义:模式串T中下标为j的字符,如果与首字符
相同,且j的前面的1—k个字符与开头的1—k
个字符不等(或者相等但T[k]==T[j])(1≤k<j)。
如:T=”abCabCad” 则 next[6]=-1,因T[3]=T[6]
     (3)next[j]=k   意义:模式串T中下标为j的字符,如果j的前面k个
字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。
                       即T[0]T[1]T[2]。。。T[k-1]==
T[j-k]T[j-k+1]T[j-k+2]…T[j-1]
且T[j] != T[k].(1≤k<j);
      (4) next[j]=0   意义:除(1)(2)(3)的其他情况。

KMP算法Java实现代码

public class KMP {
    public static int[] next(char[] s)
    {
        int length = s.length;
        int next[]=new int[length];
        next[0]=-1;
        next[1]=0;
        for(int i=2;i<length;i++)
        {
            /*如果当前所求的数的前一位和他的next[]位相等的话,那么当前所求的位的next数就是它的前一位的next[]再加1*/
            int temp = next[i-1];
            while(temp!=-1&&s[i-1]!=s[temp])
            {
                temp = next[temp];
            }
            if(temp==-1) next[i] = 0;
            else next[i] = temp+1;
        }
        return next;
    }

    public static int compare(char[] t, char[] s)
    {
        int tlen = t.length;
        int slen = s.length;
        int [] next = next(s);
        int i,j;
        for(i=0,j=0;i<tlen-slen&&j<slen;)
        {
            if(t[i]==s[j]){
                i++;j++;
            }else{
                j=next[j];
                if(j==-1)
                {
                    i++;j++;
                }
            }
        }
        if(j<slen) return -1;
        else return i;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        char s[] = "abab".toCharArray();
        char t[] = "zhangabliababling".toCharArray();
        int temp = compare(t,s);
        System.out.println(temp);
       
    }

}
分享到:
评论

相关推荐

    数据结果 kmp算法实验报告

    kmp算法,数据结构的实验报告,大学实验报告,希望能帮到大家

    KMP算法学习&总结

    KMP算法学习&总结 1、传统的字符串匹配算法 /* * 从s中第sIndex位置开始匹配p * 若匹配成功,返回s中模式串p的起始index * 若匹配失败,返回-1 */ int index(const std::string &s, const std::string &p, ...

    samcat2021#ZXBlog#Hdu - 1711. Number Sequence以及KMP算法总结1

    next[i]的含义是在str[i]之前的字符串str[0...i]中,必须以str[i-1]结尾的后缀子串(不能包含str[0])与必须以str[0]开头的前

    BF算法和KMP算法

    个人对BF和KMP算法的简单理解,部分做了相对完善,希望对你有帮助,

    KMP(字符串匹配)算法总结

    第一部分、KMP算法初解 1、普通字符串匹配BF算法与KMP算法的时间复杂度比较 2、BF算法与KMP算法的区别 3、BF算法为什么要回溯 4、KMP 算法思想 5、next数组的含义 第二部分、next数组求法的来龙去脉与KMP算法的源码

    kmp算法讲解

    详细描述kmp算法,对kmp算法进行总结,有图更易于理解

    KMP 算法 JQS

    自我总结的KMP算法。易懂.而且易于懂得kmp算法的由来。对于现在大学生有很大的帮助

    KMP算法求next 和 nextval

    网上看到的,对kmp算法很好的总结,传上了与大家分享

    算法总结kmp、树状数组等

    算法总结kmp、树状数组、线段树、字典树

    C语言中实现KMP算法的实例讲解

    KMP算法即字符串匹配算法,C语言中KMP可以避免指针回溯从而达到高效,接下来就来总结一下C语言中实现KMP算法的实例讲解

    字符串匹配算法总结

    字符串比对的几大算法,包括KMP,BM,Sunday等

    模式匹配算法在入侵检测中的应用

    全面综述了应用于入侵检测系统的经典的模式匹配算法,包括单模式匹配算法中的KMP算法、BM算法、RK算法和多模式匹配算法中的AC算法、AC—BM算法,并对各种算法的执行效率进行了总结。通过分析算法的思想,提出了未来...

    数据结构实验-2串模式匹配算法(串实验)

    实现功能:朴素的模式匹配算法(BF算法)、KMP改进算法(Next[ ])、KMP改进算法(NextVal[ ])。 主控菜单: 1.输入主串、子串和匹配起始位置 2.朴素的模式匹配算法 3.KMP改进算法(Next[ ]) 4.KMP改进算法(NextVal...

    十五个经典算法研究与总结、目录+索引(定稿版)

    六(三续)、KMP算法之总结篇(必懂KMP) 七、遗传算法 透析GA本质 八、再谈启发式搜索算法 九、图像特征提取与匹配之SIFT算法 (SIFT算法系列五篇文章) 九(续)、sift算法的编译与实现 九(再续)、教你一步一步...

    十三个经典算法研究与总结、目录+索引

    虽然,我无愧于心:这些个算法,个人认为是网上写的最好的,但还是有个别如KMP算法,还亟待完善。 不过,个人会继续写下去,同时,本BLOG内的此经典算法研究系列,永久更新,永久维护。估计,最后会写将近100篇...

    十五个经典算法研究与总结、目录+索引(by_....pdf

    十五个算法包括:A*算法、Dijkstra 算法、动态规划算法、BFS 和 DFS 优先搜索算法、KMP 算法、遗传算法、sift 算法、SIFT 算法、红黑树、快速排序算法、Hash 表算法等等。

    kmp总结1

    kmp总结1

    小甲鱼_数据结构与算法(98集全)

    立39_ KMP算法之NEXT数组代码原理分析. mp4二40_ KMP算法之实现及优化. mp4二41树. mp4 四42_树的存储结构. mp443_树的存储结构2. mp4四44_二艾树. mp445_二叉树2. mp4 46_二又树的存数结构. mp447_二又树的...

    算法文档,来看看吧

    [原网页] 六之再续:KMP算法之总结篇(12.09修订,必懂KMP) [原网页] Nginx源码剖析之内存池,与内存管理 [原网页] 程序员编程艺术第一~二十二章集锦与总结(教你如何编程) [原网页] 从Trie树(字典树)谈到...

    十五个经典算法研究与总结

    红黑树.KMP.遗传.启发式搜索.图像 特征提取SIFT.傅立叶变换.Hash.快速排序.SPFA.快递选择SELECT等15个经典基础算法, 共计31篇文章,包括算法理论的研究与阐述,及其编程的具体实现。很多个算法都后续写 了续集,如...

Global site tag (gtag.js) - Google Analytics