• 凭借对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);
        }
        
    }
  • 相关阅读:
    接口性能测试方案
    如何选择自动化测试框架
    一维和二维前缀和
    高精度 加减乘除
    归并排序 快速排序
    链表
    二分查找
    表达式求值
    c++ const问题小记
    虚继承总结
  • 原文地址:https://www.cnblogs.com/guangshan/p/4898588.html
Copyright © 2020-2023  润新知