`
caoxudong818
  • 浏览: 45613 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

KMP算法的实现

    博客分类:
  • java
阅读更多
用Java实现KMP算法,并与String.indexOf方法做比较。

    public static int kmp1(String pattern,  String src){
        int srcLength = src.length() ;
        int patternLength = pattern.length() ;
        int index = -1 ;
        int count = 0 ;
        for(int i = 0 ; i < srcLength - 1 ;){
            count = 0 ;
            for(int j = 0 ; (j < patternLength ) && (i < srcLength) ; j++){
                if(src.charAt(i) == pattern.charAt(j)){
                    count++ ;
                    i++ ;
                }else{
                    break ;
                }
            }
            if(count == patternLength){
                return i - count ;
            }
            if(count == 0){
                i++ ;
            }
        }
        return index ;
    } 


测试程序如下:
    public static void main(String[] args){
        String src = "1234567890abcdefghijk" ;
        String pattern = "abcd" ;
        long beginTime = System.nanoTime() ;
        int index = kmp1(pattern, src) ;
        System.out.println("My KMP : index = " + index + " and time = " + (System.nanoTime() - beginTime) + "ns");
        beginTime = System.nanoTime() ;
        index = src.indexOf(pattern) ;
        System.out.println("String.indexOf : index = " + index + " and time = " + (System.nanoTime() - beginTime) + "ns");
    }


结果很悲剧,输出如下
My KMP : index = 10 and time = 58012 ns
String.indexOf : index = 10 and time = 9895 ns


对代码进行修改,发现方法kmp1在内层循环中对条件判断的使用有些费操作,遂修改如下:
    public static int kmp2(String pattern,  String src){
        int srcLength = src.length() ;
        int patternLength = pattern.length() ;
        int index = -1 ;
        int count = 0 ;
        for(int i = 0 ; i < srcLength - 1 ;){
            count = 0 ;
            for(int j = 0 ; (j < patternLength ) && (i < srcLength) && (src.charAt(i) == pattern.charAt(j)); j++,i++,count++) ;
            if(count == patternLength){
                return i - count ;
            }
            if(count == 0){
                i++ ;
            }
        }
        return index ;
    } 


执行后发现没什么效果,输出如下:
My KMP : index = 10 and time = 57070 ns
String.indexOf : index = 10 and time = 9961 ns


再将字符串改为对字符数组的操作
    public static int kmp3(char[] patternArray , char[] srcArray){
    	int index = -1 ;
        int count = 0 ;
        for(int i = 0 ; i < srcArray.length - 1 ;){
            count = 0 ;
            for(int j = 0 ; (j < patternArray.length ) && (i < srcArray.length) && (srcArray[i] == patternArray[j]); j++,i++,count++) ;
            if(count == patternArray.length){
                return i - count ;
            }
            if(count == 0){
                i++ ;
            }
        }
        return index ;
    }


效果依然不好:
My KMP : index = 10 and time = 55805 ns
String.indexOf : index = 10 and time = 10277 ns



各位看官,给点提醒吧,还可以从哪里优化吗?还是说,我写的KMP本身就有问题?
分享到:
评论

相关推荐

    kmp算法实现

    KMP算法实现 KMP算法实现 KMP算法实现 KMP算法实现

    串的基本操作 kmp算法实现

    串的替换,删除,查找 以及KMP算法的具体的实现 c语言 数据结构

    KMP算法实现模板(c++版)ACM算法

    **KMP算法实现模板(C++版) ACM算法** KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中查找子串匹配的有效方法,尤其适用于已经预处理了模式串(子串)的匹配信息。它是由D.E. Knuth、V. Morris和J.H. Pratt...

    用KMP算法实现的文本检索

    在本项目中,我们利用KMP算法来实现对本地文件的文本检索,并结合MFC(Microsoft Foundation Classes)库创建了可视化的用户界面。 KMP算法是由D.E. Knuth、V.R. Morris和J.H. Pratt共同提出的,它的主要优点在于...

    简单kmp算法实现

    简单的kmp算法实现,代码结构十分清晰,适合初学者理解kmp算法

    C语言kmp算法实现.rar_ C KMP_C语言_KMP_KMP算法_MIMO BLAST

    压缩包中的"C语言kmp算法实现.cpp"文件很可能是这样一个实现,可以作为学习和理解KMP算法的实例。 至于"www.pudn.com.txt"文件,可能包含了一些关于算法的额外信息,如算法的来源、使用说明或其他相关资源链接。在...

    C++实现的KMP算法

    用C++语言实现的KMP算法。经过调试。供广大算法学习者参考。

    KMP算法实现,语言C++

    以下是一个简化的C++ KMP算法实现示例: ```cpp #include #include int* createPartialMatchTable(const std::string& pattern) { int table[pattern.length()]; table[0] = 0; for (int i = 1, j = 0; i ();...

    kmp算法的代码实现

    数据结构、kmp算法、代码实现、KMP(char *P,char *T,int *N,int start)

    KMP算法实现代码

    KMP(Knuth-Morris-Pratt)算法是一种在字符串...通过理解和掌握以上这些知识点,你就能编写出一个功能完备的C语言版本的KMP算法实现。实际编程时,注意代码的清晰性和可读性,适当的注释也能帮助理解算法的运行过程。

    KMP算法实现(C语言)

    在C语言中实现KMP算法,我们需要理解其核心思想和步骤。 1. **KMP算法的核心思想**: - KMP算法的关键在于构造一个部分匹配表(也叫失配表),用于记录当主串与模式串比较时,如果发生不匹配,模式串应如何移动以...

    KMP算法实现的C++代码

    下面我们将详细探讨KMP算法的原理、实现以及C++代码的编写。 ### KMP算法原理 1. **部分匹配表(Partial Match Table)**:KMP算法的核心是构建一个部分匹配表,也称为失配表。这个表记录了在模式串中每次不匹配时...

    模式匹配中的KMP算法的实现

    模式匹配中的KMP算法的实现 模式匹配是计算机科学领域中的一个研究热点,串的模式匹配算法是其中的一个重要分支。在模式匹配中,KMP算法是一个非常重要的算法,它可以高效地实现串的模式匹配。下面我们将详细介绍...

    BF算法与kmp算法实现串匹配.docx

    ### KMP算法实现串匹配 #### 1. KMP算法概述 KMP算法(Knuth-Morris-Pratt algorithm)是一种改进的字符串匹配算法,它避免了在匹配失败时对模式串的重复比较。该算法的核心在于利用已有的匹配信息生成一个前缀表...

    KMP算法实现子串与多个主串的匹配

    在KMP算法中,我们主要关注两个字符串:模式串(子串,要寻找的字符串)和文本串(主串,要查找的字符串)。假设模式串为P,文本串为T,我们要找出模式串P在文本串T中所有出现的位置。 1. **构建部分匹配表**:这...

    《字符串模式匹配KMP算法》教学课例设计[归纳].pdf

    通过本课例设计,学生将了解KMP算法的应用普遍性、实现机制和时间复杂度,并掌握计算next值的方法和判断算法优劣的方法。 一、教学目标 * 让学生了解KMP算法应用的普遍性,如在文字处理软件中的查找和替换操作。 *...

    kmp算法-基于C语言kmp算法实现的字符串匹配.zip

    《C语言实现的KMP算法详解》 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由D.E.Knuth、V.R.Morris和J.H.Pratt三位学者于1977年提出。在计算机科学中,字符串匹配是查找一个字符串(模式)在另一个...

    kmp算法-基于Python的kmp算法实现抄袭检测.zip

    在Python中实现KMP算法,可以用于进行抄袭检测,比如比较两个文本是否存在相同的子串,从而判断是否存在抄袭行为。 **算法原理** KMP算法的核心在于构造一个部分匹配表(也称为失配表),它记录了前缀和后缀相同的...

Global site tag (gtag.js) - Google Analytics