字符串近似匹配算法

cnn_505 2008-11-06 02:43:26
字符串近似匹配算法
算法的限制:(m-k)*(k+2) <= 64, 这里m是子串的长度。那个64是因为哦用了64位整数来编码自动机的状态。如果允许两个错误,则子串最长为18个字符,对一般应用来说足够了。


谁能给解释下啊
char* amatch(const char* text, const char* pat, int k) //在text中查找pat,允许错误k次;
{
  int m = strlen(pat);
  assert(m-k>0);
  assert((m-k)*(k+2)<= 64);
  int j;
  __int64 Din = 0;
  __int64 M1 = 0;
  __int64 M2 = 0;
  __int64 M3 = 0;
  __int64 G = 1 << k;
  int onekp1 = (1 << (k+1)) - 1;
  for (j=0; j<m-k; j++)
  {
   Din = (Din << (k+2))|onekp1;
   M1 = (M1 << (k+2))|1;
   if (j < m-k-1)
    M2 = (M2 << (k+2)) | 1;
  }
  M2=(M2<<(k+2))|onekp1;
  __int64 D=Din;
  const char* s=text;
  int c=*s++;
  while(c)
  {
   int found=0;
   const char* sp=pat;
   for(j=0;j<k+1;j++)
   {
    int cp=*sp++;
    if(c==cp)
    {
     found=1;
     break;
    }
   }
   if(found)
   {
    do
    {
     __int64 tc = 0;
     const char* sp = pat;
     for (j=0; j<m; j++)
     {
      int cp = *sp++;
      if (c!=cp)
      c|=(1<<j);
     }
     __int64 Tc = 0;
     for (j=0; j<m-k; j++)
     Tc = (Tc<<(k+2))|((tc>>j)&onekp1);
     __int64 x = (D>>(k+2))|Tc;
     D=((D<<1)|M1)&((D<<(k+3))|M2)&(((x+M1)^x)>>1)&Din;
     if((D & G) == 0)
      return (char*)s;
     if(D != Din)
      c = *s++;
    }
    while ( D != Din && c);
  }
  if (c)
   c = *s++;
}
return NULL;
}
...全文
252 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
liubuweiright 2008-11-06
  • 打赏
  • 举报
回复
牛,顶一下

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧