資料結構 查詢IV

2021-07-28 08:15:14 字數 2694 閱讀 4724

字串模式匹配

定義】是求第乙個字串(模式串 )在第二個字串(主串)中的位置。

一.簡單模式匹配演算法

【演算法描述】 從主串s指定字元開始(一般為第乙個)和模式串t的第1個字元比較,若相等,則繼續逐個比較後續字元,直到t中的每個字元依次和s中的乙個連續字串行相等,則稱匹配成功;如果比較過程中有某對字元不相等,則從主串

s的下乙個字元再重新和

t的第乙個字元比較。如果

s中的字元都比完了仍然沒有匹配成功,則稱匹配不成功。

【偽**】

intindex(sstring s,sstring t)

int i=1,j=1;

while(iif(s[i]==t[i])

++i;

++j;

}else

i=i-j+2;

j=1;

if(j>t[0])                               //表示t中字元被逐個比較完畢

一. kmp演算法

【改進】每當一趟匹配過程中出現字元不等時,不需回溯i指標,而是利用已得到的「部分匹配」的結果將模式串向右」滑動「 盡可能遠的一段距離後繼續進行比較。

假設原始串為s,長度為n,模式串為t,長度為m.目前匹配到如下位置。

假設長度為j-1的s串對應結果已經求出,即next[ j-1 ]的函式值k已經求出,現在要求next[j]的函式值,由於

1~k-1

的子串與

j-k~j-1

的子串是匹配的。下面需分兩種情況討論:

1.        模式串下標k處的字元與j-1處字元匹配,即1~k位置的子串與j-k~j-1位置的子串匹配,則next[j]=k+1,即next[j]=next[j-1]+1

2.        模式串下標k處字元與j-1處不匹配,此時我們要做的是等效於向前移動s2串,消除j-1處的不匹配,移動到哪個位置合適呢?顯然是next[k]。因為這其實又是一次模式串匹配的問題,假設next[ k ]=k』 (next[k]

表示當模式串匹配到

t[k]

遇到失敗時,在模式串中需要重新和主串匹配的位置),相當於找到了s串中這麼一對子串 1~k』-1和 j-1-(k』+1)~j-1是匹配的, 回到1,否則回到2

3)將s[j-1]與s[k]進行比較:

a.如果相等,則該next[j]=k+1

b.如果不等,令k=next[k],若k不等於0,跳到3;若k等於0,next[j]=1(1

表示模式串第乙個字元)

【普通版】

void get_next(char t,int next)

inti=1;

next[1]=0;                  //next[1]初始化,next陣列定義的

intj=0;

while(i<=t[0])

if(j==0||t[i]==t[j])     //j=0情況是模式串需重新開始比對

++i;

++j;

next[i]=j;

else

j=next[j];

【增強版】

void get_nextval(char t,int next)

inti=1;

next[1]=0;

intj=0;

while(i<=t[0]-'0')

if(j==0||t[i]==t[j])

++i;

++j;

if(t[i]!=t[j])                //避免子串中重複出現一系列字元

next[i]=j;

else

next[i]=next[j];

else

j=next[j];

int kmp(char s,char t,int next,intpos)

//利用模式串t的next函式求t在主串s第pos個字元之後的位置

//其中t非空,1<=posinti=pos;

intj=1;

while(i<=s[0]&&j<=t[0])

if(j==0||s[i]==t[j])    //j=0情況是模式串重新回到了第乙個字元的位置

++i;

++j;

else

j=next[j];

if(j>t[0])

returni-t[0];

else

return0;

【小結】儘管簡單模式匹配演算法時間複雜度為o(n*m),kmp時間複雜度為o(m+n),但在一般情況下,簡單模式實際時間執行近似o(n+m),因此至今仍被採用。kmp演算法,僅僅是在主串和子串有很多部分匹配時,才顯得快很多,主要優點是主串不回溯。

查詢 資料結構

分類 資料結構與演算法 c c 2012 07 24 16 17 614人閱讀收藏 舉報幾種查詢演算法 順序查詢,折半查詢,分塊查詢,雜湊表 一 順序查詢的基本思想 從表的一端開始,向另一端逐個按給定值kx 與關鍵碼進行比較,若找到,查詢成功,並給出資料元素在表中的位置 若整個表檢測完,仍未找到與k...

資料結構 查詢

查詢 searching 也稱 檢索,查表,就是在大量的資訊集中尋找乙個特定的資訊元素。查詢就是根據 給定的關鍵字值,在 查詢表中確定乙個關鍵字等於給定的 記錄或資料元素。若存在這樣的資料元素,則稱查詢成功的,否則查詢不成功。查詢是許多重要的電腦程式中 最耗費時間的部分,查詢演算法的優劣密切關係著查...

資料結構 查詢

一.靜態查詢表 靜態查詢表是僅對查詢表進行查詢操作,而不能改變其中資料的線性表,可以是基於陣列的順序儲存或以線性鍊錶儲存。靜態查詢表主要有順序表 有序順序表和索引順序表三種。1.順序查詢 函式模型 int seqsearch element list,int searchnum,int n 2.折半...