暴力匹配演算法和
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 翻...