資料結構 基於改進KMP演算法的檔案字串查詢

2021-10-06 21:08:28 字數 3067 閱讀 5304

建立乙個字元檔案。從鍵盤輸入字元檔名以及子串,程式首先求取子串的nextval陣列,然後用改進kmp演算法在檔案中查詢子串,最後在螢幕上顯示輸出子串在檔案中的匹配次數。若檔案中無子串,輸出匹配次數為0。

串、改進kmp演算法、字串查詢、模式匹配。

用字元陣列,定義兩個字串:主串s和子串t。主串通過檔案輸入儲存,子串通過控制台輸入。

串的模式匹配演算法,與子串定位的演算法概念相同,即在主串s中查詢子串t(稱為模式)第一次出現的起始位置。

通過改進kmp演算法,可以使得檔案一次掃瞄的條件下,不遺漏地找到所有子串與主串成功匹配的位置下標,並記錄成功匹配的總次數。

#include#includeusing namespace std;

void read(char *filename,char *s) //讀取資料,filename代入不同的檔名,s為主串

while (1) //讀入字元,儲存在主串中

s[i] = '\0';

cout << "主串為: "; //輸出主串

for (i = 0; i < strlen(s); i++)

cout << s[i];

cout << endl;

infile.close();

}void get_next(char *t, int next) //求next陣列,t為子串

}void get_nextval(char *t, int nextval, int next) //求nextval陣列,t為子串

nextval[strlen(t)] = next[strlen(t)]; //nextval[m]即為next[m]的值

}int index_kmp(char *s, char *t, int nextval, int &num) /*kmp演算法:子串的模式匹配,s為主

串,t為子串,num記錄匹配的次數*/

else

j = nextval[j];

if (!t[j])

cout << i - j << " "; //i - j為每次匹配的位置下標

j = nextval[strlen(t)]; //匹配成功後,j就從nextval[m]開始繼續查詢

num++; //num記錄匹配的次數

} }if(flag == 1) //flag恒為1表示沒有一次成功的匹配

cout << endl;

return location; //返回第一次匹配的位置下標

}int main()

get_next(t, next);

cout << "next陣列為: ";

for (i = 0; i < strlen(t) + 1; i++) //next陣列多乙個元素,用來記錄子串回溯的位置

cout << next[i] << " ";

get_nextval(t, nextval, next);

cout << endl << "nextval陣列為: ";

for (i = 0; i < strlen(t) + 1; i++) //nextval[m]即為next[m]的值,記錄子串回溯的位置

cout << nextval[i] << " ";

cout << endl;

location = index_kmp(s, t, nextval, num);

if (location != -1) //location不為1表示匹配成功

return 0;

}

(1)程式輸入:主串s:   bacbababadababacambabacaddababacasdsd

子串t:    ababaca

程式輸出:

第一次出現的起始位置:10

匹配次數: 2

(2)程式輸入:

主串s:   aaaaaaaaaaaaa

子串t:    aaa

程式輸出:

第一次出現的起始位置:0

匹配次數: 11

(3)程式輸入:

主串s:   abcbabcbabcbabcba

子串t:    abcba

程式輸出:

第一次出現的起始位置:0

匹配次數: 4

(4)程式輸入:

主串s:   abcbabcbabcbabcba

子串t:    abcde

程式輸出:

匹配失敗!

資料結構 改進的KMP演算法

ps 若不清楚kmp演算法的執行過程,可參考資料結構 kmp演算法 如果我們要對下面的主串p和模式串p進行匹配 步驟一 i 3,j 3 模式串 abab 對應的 next 陣列為 1 0 0 1 0 0 1 2整體右移一位,初值賦為 1 當模式串 p 和主串 s 進行匹配時,發現b跟c失配,於是模式...

資料結構 KMP演算法

求串的模式值next n 定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元相同,且 j的前面的 1 k個字元與開頭的 1 k個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6...

資料結構 KMP演算法

在我的理解,kmp演算法最核心的同時最難理解的是這個next 函式。但是,next 的值是挺好求的,難在哪呢?這個函式難在邏輯。理解起來很費勁,但真的很好用,並且這個函式的結果很好求。例如求模式串t ababaaa 的next j 的函式值 是這樣的,當j 0,next 0 1,對於任何子串,第乙個...