KMP算法的实现

用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本身就有问题?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值