字串模式匹配
【定義】是求第乙個字串(模式串 )在第二個字串(主串)中的位置。
一.簡單模式匹配演算法
【演算法描述】 從主串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.折半...