字符串匹配-----KMP算法解析

     在OCR软件的测试系统中有一个步骤即是字符串匹配统计字符识别率,接触OCR一年多了,上算法课也学了KMP,前几天突然发现自己根本不了解KMP算法,即决定要搞清楚。在朴素算法和有限自动机的基础上,Knuth-Morris-Pratt三人设计了KMP算法。

     KMP算法关键在于计算Next()函数,其本质是构造了DFA并进行模拟(参考[1]),这可以算是预处理过程,看了很长时间才看懂是怎么回事,在参考[2]有比较详细的解析,在具体实现过程下标的问题需要注意,本文实现了算法导论中的KMP算法(已经过测试):

void ComputeNext(const char * P,int Next[]) { int m = strlen(P); int i = 0; Next[0] = 0; int j = 0; for(i = 1; i < m;i++) { j = Next[i-1]; while (j > 0 && P[j-1] != P[i-1])//此处下标容易错 { j = Next[j-1]; } Next[i] = j+1; } }

     然后再进行搜索,类似于朴素算法:

int KMP(const char * T, const char * P) { int n = strlen(T); int m = strlen(P); int q = 0; int i = 0; int *Next = new int[m]; ComputeNext(P,Next); while (i < n - m+1) { while (q > 0 && P[q-1] != T[i])//此处下标容易错 { q = Next[q-1]; } if(q == m) return i-m+2 ; else { q++; i++; } } return -1; }

在此过程中,发现了网上的几篇对此解释较好的文章,列在了参考中。

短短几行代码,看似简单的一个算法,自有其玄妙之处哈!

 

参考:

   [1] http://blog.csdn.net/liuben/archive/2009/08/04/4409505.aspx;

   [2] http://blogold.chinaunix.net/u2/72470/showart_1716209.html;

   [3] http://skyofcai.blogbus.com/logs/39088627.html;

   [4] 算法导论 chapter32;

   [5] 计算机算法引论--设计与分析技术(科学出版社);

你可能感兴趣的:(算法,测试,出版)