`
Michaelmatrix
  • 浏览: 209075 次
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

字符串查找

 
阅读更多

字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。两个算法在最坏情况下均具有线性的查找时间。但是在实用上,KMP算法并不比最简单的c库函数strstr()快多少,而BM算法则往往比KMP算法快上3-5倍。

但是,最坏的情况下,BM的时间复杂度貌似也是n×n。

具体就不说了,BM算法是通过往后跳动主文本字符串来实现快速非回溯查找的,跳动的算法就是用程序中的这句来实现的,下面:

  1. i=i+m-min(j,1+last(p,T[i]));

而last是一个求文本字符串中的字符在查找字符串里面出现的最后位置。

这个算法很麻烦,呵呵,可以的话百度一下。

整个代码如下:

  1. #include<string.h>
  2. intlast(char*p,charc){//找到c在p中最后匹配的位置,没有就返回-1
  3. intlength=strlen(p),count=0;
  4. char*pp=p+length-1;
  5. while(pp>=p)
  6. {
  7. if(*pp==c)
  8. {
  9. returnlength-count-1;
  10. }
  11. pp--;
  12. count++;
  13. }
  14. return-1;
  15. }
  16. intmin(inta,intb){
  17. return(a<=b)?a:b;
  18. }
  19. intBM_index(char*T,char*p){
  20. intn=strlen(T);
  21. intm=strlen(p);
  22. inti=m-1,j=m-1;
  23. while(i<=n-1)
  24. {
  25. if(T[i]==p[j])
  26. {
  27. if(j==0)
  28. {
  29. returni;
  30. }
  31. else
  32. i--,j--;
  33. }
  34. else{
  35. i=i+m-min(j,1+last(p,T[i]));//往后跳,取决于最后一次匹配的字符的位置
  36. j=m-1;
  37. }
  38. }
  39. return-1;
  40. }
  41. int_tmain(intargc,_TCHAR*argv[])
  42. {
  43. char*p="woainizz!izzzzzz--zzzzut";
  44. inta=BM_index(p,"zzzzut");//结果18,没有问题
  45. return0;
  46. }


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics