国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

字符串近似匹配算法

2019-11-17 05:22:17
字體:
來源:轉載
供稿:網友

  字符串的近似匹配,就是答應在匹配時有一定的誤差,比如在字串“以前高手好久不見”中找“以前是高手”也能成功。具體地說,錯誤可以有三種類型:加字符(以前也是高手)、漏字符(以前高手)和替換字符(以前石膏手)。下面的函數在text中查找子串pat,最多答應有k個錯誤。返回的是匹配的終點(我還沒想好如何確定起點,呵呵)。
至于算法的原理,現在一下子說不清楚,只能說這是一個非確定性有限自動機,以后有時間的話再具體介紹。有愛好的話可以自己去看文章《Faster ApPRoximate String Matching》, Algorithmica (1999) 23: 127-158。

算法的限制:(m-k)*(k+2) <= 64, 這里m是子串的長度。那個64是因為哦用了64位整數來編碼自動機的狀態。假如答應兩個錯誤,則子串最長為18個字符,對一般應用來說足夠了。

好了,廢話少說,看算法吧。看不懂?沒事了,哦也是半懂半不懂的。

char* amatch(const char* text, const char* pat, int 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;



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 驻马店市| 安泽县| 潼关县| 时尚| 南郑县| 辰溪县| 霍城县| 元阳县| 宝鸡市| 潍坊市| 阳谷县| 乐清市| 保亭| 临桂县| 塔河县| 中山市| 哈巴河县| 德保县| 西安市| 周至县| 定日县| 澄城县| 广东省| 新河县| 保定市| 丹凤县| 柳州市| 赞皇县| 潞西市| 沙洋县| 虎林市| 天水市| 扎鲁特旗| 广平县| 淅川县| 阿拉善右旗| 蒲城县| 鸡泽县| 道孚县| 修水县| 迁安市|