凭借对KMP算法的了解,用java实现了一下,结果和java自带的字符串indexOf比,性能差了十倍。。。

public class KMP {

    private char[] source = {‘a‘,‘b‘,‘c‘,‘b‘,‘c‘,‘a‘,‘b‘,‘a‘,‘b‘,‘d‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘a‘,‘b‘,‘c‘,‘a‘,‘b‘,‘a‘,‘b‘,‘d‘,‘a‘};

    private char[] target = {‘a‘,‘b‘,‘c‘,‘a‘,‘b‘,‘a‘,‘b‘,‘d‘};

    private int[] getNextArray(char[] target){
        int[] ret = new int[target.length];
        ret[0] = 0;
        for (int i = 1; i < target.length; i++) {
            int offset = ret[i-1];
            while (offset > 0) {
                if (target[i] == target[offset]) {
                    ret[i] = offset + 1;
                    break;
                } else {
                    offset = ret[offset];
                }
            }
            if (offset == 0 && target[i] == target[0]) {
                ret[i] = 1;
            }
        }
        return ret;
    }

    private int indexOf(int[] next) {
        int offset = 0;
        int i = 0;
        while (i < target.length && offset < source.length) {
            if (target[i] == source[offset]) {
                i++;
                offset++;
            } else if (i == 0) {
                offset++;
            } else {
                i = i - 1 < 0 ? 0 : next[i - 1];
            }
        }
        return offset;
    }

    public static void main(String[] args) {
        KMP k = new KMP();
        long now = System.currentTimeMillis();
        for (int i = 0 ; i < 1000000 ; i++) {
            int[] ret = k.getNextArray(k.target);
            k.indexOf(ret);
        }
        System.out.println(System.currentTimeMillis() - now);
    }

}
时间: 2024-10-27 00:30:30

凭借对KMP算法的了解,用java实现了一下,结果和java自带的字符串indexOf比,性能差了十倍。。。的相关文章

KMP算法证明及实现

KMP算法 一.普通的字符串匹配 平时我们在写普通的字符串匹配算法的时候,是拿着要匹配的串去匹配被匹配的串,字符逐个比较,当发现字符失配时,被匹配的字符串的指针要回到前一次开始匹配的指针的下一个位置.这里我们称要去匹配的字符串为模式串P,被匹配的字符串为主串S,即我们拿模式串P去匹配主串S,看看P是否是S的子串. 例如:主串S是"abcabdsfabcdfrt",模式串P是"abcd",开始匹配时,可以看到,S和P的字符串0.1.2位置的字符是相同的,到3位置时出现

KMP算法具体解释(转)

作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解说KMP算法的时候,言语磕磕碰碰,我想,原因有二:1.博客内的东西不常回想,忘了不少:2.便是我对KMP算法的理解还不够彻底,自不用说解说自如,运用自如了.所以,特再写本篇文章.因为此前,个人已经写过关于KMP算法的两篇文章,所以,本文名为:KMP算法之总结篇. 本文分为例如以下六个部分: 第一部分

KMP算法细节及增强KMP算法

preface: 想必,很多人都知道D.E.Knuth与V.R.Pratt和J.H.Morris同时提出所谓的狂拽酷炫屌炸天的KMP算法,在对字符串的匹配(或是字符串的查找)方面表现出比较好的效率,该算法对Brute-Force算法的较大改进,具体地讲就是消除了主串指针的回溯,从而使匹配的时间复杂度从O(N2)降低到O(N+M)(N为文本串的长度,M为模式串长度).其传神之处在于在于针对模式串构造的一个Nest[]数组(该数组只与模式串有关). keyword: KMP算法.增强KMP算法 (扯

KMP算法原理

前几天在看数据结构与算法,里面提到过kmp算法,一个超级经典的字符串匹配算法.虽然网上有一大堆关于kmp算法的介绍文章,但是我看过之后还是“不明觉厉”.所以打算自己写写,大家一起学习吧. 一.关于KMP算法的概念 关于字符串匹配问题,就是在一个大的字符串T中找到一个小的字符串P的位置,并返回P的位置的问题.T称为文本或者目标,P称为模式. KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简

KMP算法及拓展KMP算法

KMP算法用于字符串匹配问题 原有一个主串T和一个要匹配字符串S 对S求next熟组然后进行较少回溯匹配 求next数组.也就是在S串匹配不正确时 进行回溯. 每个next数组指向前一个应该回溯对下标 然后进行匹配  对于每个不匹配字符串重新依据next数组匹配 原文地址:https://www.cnblogs.com/AAAzhuo/p/11764111.html

hdu 2594 java实现字符串KMP算法

Problem Description Homer: Marge, I just figured out a way to discover some of the talents we weren't aware we had. Marge: Yeah, what is it? Homer: Take me for example. I want to find out if I have a talent in politics, OK? Marge: OK. Homer: So I tak

【数据结构&amp;&amp;算法系列】KMP算法介绍及实现(c++ &amp;&amp; java)

KMP算法如果理解原理的话,其实很简单. KMP算法简介 这里根据自己的理解简单介绍下. KMP算法的名称由三位发明者(Knuth.Morris.Pratt)的首字母组成,又称字符串查找算法. 个人觉得可以理解为最小回溯算法,即匹配失效的时候,尽量少回溯,从而缩短时间复杂度. KMP算法有两个关键的地方,1)求解next数组,2)利用next数组进行最小回溯. 1)求解next数组 next数组的取值只与模式串有关,next数组用于失配时回溯使用. 在简单版本的KMP算法中,每个位置 j 的 n

经典KMP算法C++与Java实现代码

前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比较流行的做法是实现一个next()函数,函数本身包含了模式串的局部匹配信息.由于next函数理解起来不太容易,本文同样是基于空间换时间的做法,但将采用另一种代码实现,希望可以更方便读者理解! 测试数据 aseeesatba esat as330kdwejjl_8 jjl_ faw4etoesting

KMP 算法 java实现

KMP算法讲解 我的Java代码实现 package jj4_6; public class KMP { public static boolean contains(String a,String b){ /* * 第一步,对b字符串做一个预处理 */ Integer[] fuzhu = new Integer[b.length()]; for(Integer i= 0;i<b.length();i++){ // i == 3 时 // nowstr = "abab" Stri