首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 软件考试 > 复习指导 >

软考程序员辅导(1)

2008-12-15 
串匹配算法(C&assembly)

    Knuth-Morris-Pratt(缩写KMP)串匹配算法是一个基本的串操作算法,在各种含有串操作的程序中广泛使用。
  KMP匹配的最大优点在于——主串无需回溯,故可以用于数据流的匹配,如可顺序读入文件的过程中实现匹配,考试,大提示同时它也是各种匹配算法中速度最快的。
  此处给出了算法的C代码。另外,还写了一段汇编优化的参考代码,虽无太大用处但仍可作为汇编优化的参考。
  #define _USEASM_
  //求模式串的Next数组
  // p: 模式串
  // lp: 模式串长度
  inline int * getNext(const char * p, int lp=-1)
  {
  if(lp==-1)
  lp=(int)strlen(p);
  //前一个模式串的Next数组
  static int * next=NULL;
  //如果有数据先释放内存
  if(next) delete[] next;
  //为Next数组分配存储空间
  next=new int[lp];
  //计算模式串
  next[0]=-1;
  int i=0; int j=-1;
  while(i<lp-1)
  {
  if(j==-1||p==p[j])
  {
  i++; j++;
  next=j;
  }
  else
  j=next[j];
  }
  return next;
  }
  //Knuth-Morris-Pratt模式匹配算法
  // s: 源串
  // p: 模式串
  int instr(const char * s, const char * p)
  {
  int ls=(int)strlen(s);
  int lp=(int)strlen(p);
  int * next=getNext(p,lp);
  #ifndef _USEASM_
  int i=0; int j=0;
  while(i<ls&&j<lp)
  {
  if(s==p[j])
  { i++; j++; }
  else
  {
  j=next[j];
  if(j==-1) { i++; j++; }
  }
  }
  if(i<ls)
  return (i-j);
  else
  return -1;
  #else
  _asm
  {
  push edi
  push esi
  push ebx
  push ecx
  push edx
  mov edi, dword ptr[s]
  mov esi, dword ptr[p]
  mov edx, dword ptr

热点排行