字符串匹配算法的比较(BF算法/KMP算法/jdk自带的indexOf方法)

自己实现了BF算法(暴力算法)、KMP算法,在jdk1.8中与自带的进行性能比较。结果是jdk自带的果然厉害。

public class StringTest01 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 10000000; i++){
            sb.append("1xxabcdefghij4k");
        }
        String s1 = sb.append("xxabcdefghijk").toString();
        String s2 = "xxabcdefghijk";

        long t1 = System.currentTimeMillis();
        System.out.println("    answer="+bfSearch(s1,s2));
        long t2 = System.currentTimeMillis();
        System.out.println("bftime="+(t2-t1));

        int[] next = kmpNext(s2);
        int index = kmpSearch(s1, s2, next);
        System.out.println("    answer=" + index);
        long t3 = System.currentTimeMillis();
        System.out.println("kmptime="+(t3-t2));

        System.out.println("    answer="+s1.indexOf(s2));
        long t4 = System.currentTimeMillis();
        System.out.println("jdktime="+(t4-t3));

    }

    public static int bfSearch(String s1, String s2){
        for (int i = 0; i < s1.length(); i++){
            for (int j = 0; j < s2.length(); j++){
                if (s1.charAt(i+j) != s2.charAt(j)){
                    break;
                }
                if (j == s2.length() -1){
                    return i;
                }
            }
        }
        return -1;
    }


    public static int kmpSearch(String str1, String str2, int[] next) {
        for(int i = 0, j = 0; i < str1.length(); i++) {
            while( j > 0 && str1.charAt(i) != str2.charAt(j)) {
                j = next[j-1];
            }
            if(str1.charAt(i) == str2.charAt(j)) {
                j++;
            }
            if(j == str2.length()) {
                return i - j + 1;
            }
        }
        return  -1;
    }

    public static  int[] kmpNext(String dest) {
        int[] next = new int[dest.length()];
        next[0] = 0;
        for(int i = 1, j = 0; i < dest.length(); i++) {
            while(j > 0 && dest.charAt(i) != dest.charAt(j)) {
                j = next[j-1];
            }
            if(dest.charAt(i) == dest.charAt(j)) {
                j++;
            }
            next[i] = j;
        }
        return next;
    }
}

结果:

    answer=150000000
bftime=1313
    answer=150000000
kmptime=891
    answer=150000000
jdktime=377

 

posted on 2021-04-22 16:38  青锋剃刀  阅读(446)  评论(0编辑  收藏  举报