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

首頁 > 編程 > C > 正文

深入串的模式匹配算法(普通算法和KMP算法)的詳解

2020-01-26 16:04:27
字體:
來源:轉載
供稿:網友
串的定位操作通常稱作串的模式匹配,是各種處理系統中的最重要操作之一。
模式匹配最樸素的算法是回溯法,即模式串跟主串一個字符一個字符的匹配,當模式串中跟主串不匹配時,主串回溯到與模式串匹配開始的下一個位置,模式串回溯到第一個位置,繼續匹配。算法的時間復雜度為O(m*n),算法如下:
復制代碼 代碼如下:

//樸素的串的模式匹配算法,S為主串,T為模式串,即找S中有沒有與T相同的字串
int Index(char *S, char *T, int pos)//pos記錄從哪一位開始匹配可以直接用0代替
{
 int i=pos, j=0;
 while(i <strlen(S) && j <strlen(T))//確保未超出字符串的長度
 {
  if (S[i] == T[j])
      { ++i; ++j;} //如果相同,則繼續向后比較
  else
      {i = i-j+1; j =0;} //如果不同,就回溯,重新查找
 }
 if (j == strlen(T))
  return i-strlen(T); //若匹配成功,返回S中與T字符串相同開始位置的索引
 else return 0; //若匹配不成功,返回0
}

O(m*n)的時間復雜度有點大,于是人們發現了KMP算法,核心思想是:當不匹配發生時,主串不回溯,模式串回溯到“合適”的位置,哪個位置合適,只與模式串有關,所以可以先算出模式串中各個字符,當不匹配發生是,應該回溯到哪個位置。算法整體時間復雜度O(m+m)。
算法如下:
復制代碼 代碼如下:

void GetNext(char* T, int *next)
{
 int i=1,j=0;
 next[1]=0;
 while( i < strlen(T) )
 {
  if (j == 0 || T[i] == T[j])
  {
    ++i; ++j;
    next[i] = j;
  }
  else j = next[j];
 }
}
int KMP(char* S, char* T, int pos)
{
 int i = pos, j = 1;
 while (i)
 {
  if (S[i] == T[j])
  {
   ++ i;  ++ j;
  }
  else
   j = next[j];
 }
 if (j > strlen(T))
  return i-T[0];
 else
  return 0;
}

求next的操作不是最優的,因為他沒有考慮aaaaaaaaaaaaaaaaaaab的情況,這樣前面會出現大量的1,這樣的算法復雜度已經和最初的樸素算法沒有區別了。所以稍微改動一下:
復制代碼 代碼如下:

void GetNextEx(char *T, int *next)
{
 int i=1,j=0; next[1] = 0;
 while(i < strlen(T))
 {
  if (j == 0 || T[i] == T[j])
  {
   ++i; ++j;
   if (T[i] == T[j])
    next[i] = next[j];  //減少回退次數
   else   next[i] = j;  //和上面算法一樣next[i]=j
  }
  else j = next[j];
 }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 称多县| 利辛县| 涟水县| 金山区| 上思县| 囊谦县| 汉寿县| 漳浦县| 庆安县| 洪江市| 澄迈县| 柘荣县| 于都县| 灯塔市| 石台县| 佛学| 武威市| 曲阜市| 汉阴县| 招远市| 依兰县| 平遥县| 杂多县| 凤台县| 镇巴县| 新干县| 黎城县| 高淳县| 通化市| 长寿区| 普格县| 福泉市| 开平市| 惠安县| 阳泉市| 洪江市| 安化县| 泸西县| 曲水县| 庄浪县| 垫江县|