设为首页 加入收藏

TOP

BM模式匹配算法C语言实现
2014-11-11 15:00:09 来源: 作者: 【 】 浏览:42
Tags:模式 匹配 算法 语言 实现

  #include "messageFormat.h"


  #include


  using namespace std;


  /*int processFile();


  {


  }*/


  /*


  函数:int* MakeSkip(char *, int)


  目的:根据坏字符规则做预处理,建立一张坏字符表


  参数:


  ptrn => 模式串P


  PLen => 模式串P长度


  返回:


  int* - 坏字符表


  */


  int* MakeSkip(char *ptrn, int pLen)


  {


  int i;


  //为建立坏字符表,申请256个int的空间


  /*PS:之所以要申请256个,是因为一个字符是8位,


  所以字符可能有2的8次方即256种不同情况*/


  int *skip = (int*)malloc(256*sizeof(int));


  if(skip == NULL)


  {


  fprintf(stderr, "malloc failed!");


  return 0;


  }


  //初始化坏字符表,256个单元全部初始化为pLen


  for(i = 0; i < 256; i++)


  {


  *(skip+i) = pLen;


  }


  //给表中需要赋值的单元赋值,不在模式串中出现的字符就不用再赋值了


  while(pLen != 0)


  {


  *(skip+(unsigned char)*ptrn++) = pLen--;


  }


  return skip;


  }


  /*


  函数:int* MakeShift(char *, int)


  目的:根据好后缀规则做预处理,建立一张好后缀表


  参数:


  ptrn => 模式串P


  PLen => 模式串P长度


  返回:


  int* - 好后缀表


  */


  int* MakeShift(char* ptrn,int pLen)


  {


  //为好后缀表申请pLen个int的空间


  int *shift = (int*)malloc(pLen*sizeof(int));


  int *sptr = shift + pLen - 1;//方便给好后缀表进行赋值的指标


  char *pptr = ptrn + pLen - 1;//记录好后缀表边界位置的指标


  char c;


  if(shift == NULL)


  {


  fprintf(stderr,"malloc failed!");


  return 0;


  }


  c = *(ptrn + pLen - 1);//保存模式串中最后一个字符,因为要反复用到它


  *sptr = 1;//以最后一个字符为边界时,确定移动1的距离


  pptr--;//边界移动到倒数第二个字符(这句是我自己加上去的,因为我总觉得不加上去会有BUG,大家试试“abcdd”的情况,即末尾两位重复的情况)


  while(sptr-- != shift)//该最外层循环完成给好后缀表中每一个单元进行赋值的工作


  {


  char *p1 = ptrn + pLen - 2, *p2,*p3;


  //该do...while循环完成以当前pptr所指的字符为边界时,要移动的距离


  do{


  while(p1 >= ptrn && *p1-- != c);//该空循环,寻找与最后一个字符c匹配的字符所指向的位置


  p2 = ptrn + pLen - 2;


  p3 = p1;


  while(p3 >= ptrn && *p3-- == *p2-- && p2 >= pptr);//该空循环,判断在边界内字符匹配到了什么位置


  }while(p3 >= ptrn && p2 >= pptr);


  *sptr = shift + pLen - sptr + p2 - p3;//保存好后缀表中,以pptr所在字符为边界时,要移动的位置


  /*


  PS:在这里我要声明一句,*sptr = (shift + pLen - sptr) + p2 - p3;


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言:四方定理 下一篇C语言LRC歌词文件解析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: