欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2013年05月29日 09:19:02   作者:  
本篇文章是對串的模式匹配算法(普通算法和KMP算法)的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
串的定位操作通常稱作串的模式匹配,是各種處理系統(tǒng)中的最重要操作之一。
模式匹配最樸素的算法是回溯法,即模式串跟主串一個字符一個字符的匹配,當(dāng)模式串中跟主串不匹配時(shí),主串回溯到與模式串匹配開始的下一個位置,模式串回溯到第一個位置,繼續(xù)匹配。算法的時(shí)間復(fù)雜度為O(m*n),算法如下:
復(fù)制代碼 代碼如下:

//樸素的串的模式匹配算法,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;} //如果相同,則繼續(xù)向后比較
  else
      {i = i-j+1; j =0;} //如果不同,就回溯,重新查找
 }
 if (j == strlen(T))
  return i-strlen(T); //若匹配成功,返回S中與T字符串相同開始位置的索引
 else return 0; //若匹配不成功,返回0
}

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

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的操作不是最優(yōu)的,因?yàn)樗麤]有考慮aaaaaaaaaaaaaaaaaaab的情況,這樣前面會出現(xiàn)大量的1,這樣的算法復(fù)雜度已經(jīng)和最初的樸素算法沒有區(qū)別了。所以稍微改動一下:
復(fù)制代碼 代碼如下:

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];  //減少回退次數(shù)
   else   next[i] = j;  //和上面算法一樣next[i]=j
  }
  else j = next[j];
 }
}

相關(guān)文章

  • VC6.0打開文件以及向工程中添加文件時(shí)程序崩潰自動退出解決方法

    VC6.0打開文件以及向工程中添加文件時(shí)程序崩潰自動退出解決方法

    vc6.0程序中,點(diǎn)擊打開文件以及向工程中添加文件時(shí),程序竟然崩潰自動退出了,不知什么原因,安裝相同的vc程序,本本竟然出現(xiàn)此緣故
    2013-01-01
  • c語言執(zhí)行Hello?World背后經(jīng)歷的步驟

    c語言執(zhí)行Hello?World背后經(jīng)歷的步驟

    這篇文章介紹了c語言執(zhí)行Hello?World背后經(jīng)歷的步驟,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • c++ decltype關(guān)鍵字的用法

    c++ decltype關(guān)鍵字的用法

    這篇文章主要介紹了c++ decltype關(guān)鍵字的用法,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-10-10
  • C語言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲

    C語言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例

    C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例

    這篇文章主要介紹了C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這樣的知識,需要的朋友可以參考下
    2017-10-10
  • C語言數(shù)組a和&a的區(qū)別講解

    C語言數(shù)組a和&a的區(qū)別講解

    今天小編就為大家分享一篇關(guān)于C語言數(shù)組a和&a的區(qū)別講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C語言舉例講解i++與++i之間的區(qū)別

    C語言舉例講解i++與++i之間的區(qū)別

    這篇文章主要介紹了C語言中i++和++i的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C++輸入輸出重定向方法示例

    C++輸入輸出重定向方法示例

    這篇文章主要給大家介紹了關(guān)于C++輸入輸出重定向的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • linux c++ 服務(wù)器端開發(fā)面試必看書籍整理

    linux c++ 服務(wù)器端開發(fā)面試必看書籍整理

    這篇文章主要介紹了linux c++ 服務(wù)器端開發(fā)面試必看書籍整理,需要的朋友可以參考下
    2020-02-02
  • C語言字符串與字符數(shù)組面試題中最易錯考點(diǎn)詳解

    C語言字符串與字符數(shù)組面試題中最易錯考點(diǎn)詳解

    這篇文章主要介紹了C語言字符串與字符數(shù)組面試題中最易錯考點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09

最新評論