字串匹配暴力匹配法和KMP匹配演算法對比

2021-08-14 17:47:15 字數 2587 閱讀 1112

暴力匹配演算法和

kmp

演算法比較:

演算法實現:

#include

#include

#include//

使用fstream

中定義的類及

各種成員函式

#include

#include

#include//

時間函式

using namespace std; //

開闢記憶體空間

int strstr(char* haystack,char* needle) //

暴力演算法

}if(j==len_n)

returni;

}return-1;

}void cal_next(char* source,int* next,intlen)//

求next

的函式(

kmp)

if (source[k + 1] == source[q])//

如果相同,

k++next[q] = k;//

這個是把算的

k的值(就是相同的最大字首和最大字尾長)賦給

next[q]}}

int kmp(char *source, int slen, char*target, int plen)

}return -1;

}int main()//

主函式入口

//生成隨機數

inti;

srand((unsigned)time(null));//

它初始化隨機種子,會提供乙個種子,這個種子會對應乙個隨機數,如果使用相同的種子後面的

rand()

函式會出現一樣的隨機數

for(i=0;i<10000;i++)

fstreaminfile;

infile.open("f3.txt",ios::in);//

讀檔案if(!infile)

chars1[10000];

while(!infile.eof())//

一直讀字元,直到讀到完

infile.close();//

關閉檔案

char

*source=s1;

char * target="ab";

cout<<"

主串是:"《主串

cout<<"

要查詢的字串是

:"《副串

int i1=strlen(source);//

求字串長度

int j1=strlen(target);

clock_tstart,finish;//

時間函式

doubletotaltime;

start=clock();

inta = kmp(source,i1, target,j1);//

傳參函式呼叫

for(intd=0;d<10000000;d++)

if(a==-1)

cout<<"

字串不匹配

"<

else

cout<<"

從第"《個字元開始匹配

"<

finish=clock();

totaltime=(double)(finish-start)/clocks_per_sec;

cout<<"kmp

程式的執行時間為

"<

s"<

clock_tstart1,finish1;//

時間結束

doubletotaltime1;

start1=clock();

int b;

b=strstr(source,target);

for(intc=0;c<10000000;c++)

if(b==-1)

cout<<"

字串不匹配

"<

else

cout<<"

從第"《個字元開始匹配

"<

finish1=clock();

totaltime1=(double)(finish1-start1)/clocks_per_sec;

cout<<"

暴力程式的執行時間為

"《秒!"<

return0;

}輸出結果:

兩個演算法比較分析:

經計算,暴力匹配演算法易知其時間複雜度:

o(n-m)*m

,而kmp

演算法時間複雜度為

: o(n+m)

,兩種演算法同時在

c++同乙個編譯器下多次執行,首先從執行結果和時間複雜度上,

kmp演算法都比暴力演算法好很多,暴力匹配演算法雖然能解決問題,但是在效率上差的很遠,暴力匹配演算法無論是在**量還是在處理問題上,都沒有

kmp演算法高效,

kmp演算法的精髓在於不必要以主串種每乙個元素下標為首都比一邊,而是建立了

next,

以巧妙地演算法跳過了不可能匹配的字串,所以在字元數量較大的情況下構造過程比較複雜,

kmp的

next

陣列構造就快多了,所以

kmp演算法要比暴力匹配演算法好

字串查詢之暴力匹配法

問題描述 在長度為m的字串source中,尋找長度為n的字串target。如果source字串中存在target字串,則返回字串target第一次在字串source中出現的位置 如果不存在,則返回 1。乙個最樸素的想法是使用暴力匹配法 將source中的字元與target中的字元逐一比較,如果sou...

演算法 字串匹配演算法 暴力匹配演算法 KMP演算法

如果當前字元匹配成功,即 str1 i str2 j 則 i j 繼續匹配下乙個字元 如果當前字元匹配失敗,則 i i j 1 j 0 也就是每次匹配失敗時,i回溯,j被置為0 public static void main string args 暴力匹配演算法 public static int...

kmp字串匹配

首先要對模式串進行預處理。預處理過程就是計算出指定位置的字首和字尾的最大相同的長度 啊啊啊啊。估計只有我乙個人能看懂 這個文章說得很清楚 比如說 a a a c b c a a a 0 1 2 0 0 0 1 2 3 void getnext int next,char par 20 int n 翻...