KMP演算法與樸素模式匹配演算法(C語言)

2021-07-24 04:50:20 字數 3243 閱讀 3215

#include

#define ok 0

#define error -1

#define failed 1

int readfile(char **buffer)

fseek(fp, 0, seek_set);

fseek(fp, 0, seek_end);

length = ftell(fp);

(*buffer) = (char *)malloc(length);

if ((*buffer) == null)

fseek(fp, 0, seek_set);

error = fread((*buffer), sizeof(char), length / sizeof(char), fp);

if (error == 0 )

fclose(fp);

return ok;

}//樸素的模式匹配演算法

intindex(char *buffer, char *check, int

*inx,

int sizebuffer,int sizecheck)

else

}if (j == sizecheck)

*inx = i - sizecheck;

else

return failed;

return ok;

}//kmp模式匹配演算法

//計算next陣列

int compnext(char *check, int

*next, int sizecheck)

else

else

i--;

}

}// for (i = 0; i < sizecheck; i++)

return ok;

}//kmp字元匹配

int index_kmp(char *buffer, char *check,

int sizecheck, int sizebuffer, int

*inx) ;

compnext(check, next, sizecheck);

while (i if (buffer[i] == check[j])

else

}if (j == sizecheck)

*inx = i - sizecheck;

else

return failed;

return ok;

}int main()

while (buffer[i] != '\0')

if (flag == 5)

count++;

flag = 0;

i++;

}printf("the total number is %d\n", count);

printf("the local of them are:\n");

while (error != 1)

inx = inx + 4;

}inx = 0;

error = 0;

printf("the local of them are:\n");

while (error != 1)

inx = inx + 4;

}free(buffer);

return

0;}

本文的**主要包含120行到130行,求取該文字中aware的個數;132行到138行,利用樸素模式匹配方法求著8個單詞的位置;142行到148行利用kmp演算法求8個單詞的位置;

感興趣的朋友可以利用樸素匹配方法和kmp演算法求單詞總數;

下面針對**進行說明:

樸素模式匹配方法:

int

index(char *buffer, char *check, int

*inx,

int sizebuffer,int sizecheck)

else

}if (j == sizecheck)

*inx = i - sizecheck;

else

return failed;

return ok;

}

跳出while迴圈的條件有兩個,i大於等於文件字元總數(sizebuffer)或者j大於匹配字串字元總數(本文是5:aware)。

當有5個字元連續匹配成功,則j為5,跳出迴圈;*inx = i - sizecheck;計算出單詞起始位置。

inx表示開始查詢的位置;

kmp演算法

next陣列的求取

//計算next陣列

int compnext(char *check, int

*next, int sizecheck)

else

else

i--;

}

}// for (i = 0; i < sizecheck; i++)

return ok;

}

kmp程式

//kmp字元匹配

int index_kmp(char *buffer, char *check,

int sizecheck, int sizebuffer, int

*inx) ;

compnext(check, next, sizecheck);

while (i if (buffer[i] == check[j])

else

}if (j == sizecheck)

*inx = i - sizecheck;

else

return failed;

return ok;

}

仔細觀察就會發現,樸素匹配是

else

而kmp演算法是

else
可以看到二者的區別是i值得變化;樸素匹配法回溯的是i值;kmp演算法回溯的是j值;所以對於匹配字串中相同的字串比較多時,kmp演算法的效率會優於樸素匹配;若匹配字串中字元全部不相同,kmp演算法優勢並不明顯。

關於kmp演算法還有改進的方法,以後會繼續討論。

模式匹配演算法 樸素演算法

1.樸素的模式匹配演算法。樸素模式匹配演算法,簡單的說就是迴圈把主串的每個字元作為開頭,與子串去進行匹配。對主串做大迴圈,每個字元為開頭做子串 要匹配的字串 的小迴圈,如果對應字元匹配,則兩字串都向後移位,否則子串又從子串的開頭開始與主串前一步比較的字元開頭的下一位繼續匹配,直到匹配成功或 主串 遍...

模式匹配與KMP演算法

模式匹配的kmp演算法詳解 這種由d.e.knuth,j.h.morris和v.r.pratt同時發現的改進的模式匹配演算法簡稱為kmp演算法。大概學過資訊學的都知道,是個比較難理解的演算法,今天特把它搞個徹徹底底明明白白。注意到這是乙個改進的演算法,所以有必要把原來的模式匹配演算法拿出來,其實理解...

樸素的模式匹配和改進的模式匹配(KMP)演算法說明

樸素的模式匹配和改進的模式匹配 kmp 演算法說明 lewislau 前言 最近複習資料結構,以前老師講的時候居然忽略了串。汗,我們學校的確牛b。某仁兄告訴我,kmp基本是資料結構裡面難度比較大的演算法了,所以掌握了它,至少從心理上給我了很大的鼓舞,但是這個演算法是我詢問老師才掌握的,呵呵。言規正傳...