三、統計kmp子串和主串對比的次數
我使用的是這樣的乙個字元儲存結構
#define maxlen 255
typedef
struct
sstring;
那麼,在給字串結構體賦值的時候就無法使用以下形式,而是要用
#include
using
namespace std;
intmain()
如果使用cin來給t這個字串賦值那麼就會出現字元從ch[0]開始儲存
而教材給出的計算next函式和kmp演算法的函式中都是從ch[1]開始考慮的
void
get_next
(sstring t,
int next)
else j=nextp[j];}
}
可以保持原來ch[1]開始比較的方法,通過改變初始化的條件達到目的,kmp則可以保持不變,但是需要使用字元指標和strcpy函式,實現相對複雜,不推薦。
void
get_next
(sstring t,
int next)
else j=nextp[j];}
}//該方法會多出乙個0在next[0]處
將next[0],起始判斷數改為-1,這樣既不影響迴圈向下進行next陣列的賦值,也不用改變t.ch,就可以愉快的套函式啦~~ 2333
void
get_next
(sstring t,
int next)
//計算next的值
else j = next[j];}
}
kmp函式也需要改一些起始變數
int
index_kmp
(sstring s, sstring t,
int pos)
//kmp演算法
else;}
if(j >= t.length)
else
return-1
;}
改進的next陣列相同
這種演算法可以比較整個主串中多個子串比較次及出現的位置,改變迴圈條件其實也可以只返回第一次出現子串的位置和比較次數
int
index_kmp
(sstring s, sstring t,
int pos)
if(i !=
0&& s.ch[i]
== t.ch[j]
)m++;if
(i == j&&i==
0)m++
; i++
; j++;if
(j >= t.length)
} cout <<
"kmp演算法比較次數"
<< m <<
"次"<< endl;
cout <<
"子串在主串**現過"
<< temp <<
"次"<< endl;
for(
int i =
0; i < temp; i++
)}
這一種只需要在兩個判斷條件中統計次數就行
int
index_kmp
(sstring s, sstring t,
int pos)
else;}
cout <<
"kmp演算法中一共比較"
<< m <<
"次"<< endl;
if(j >= t.length)
else
return-1
;}
只是個人**總結與思考,如有錯誤請及時告訴我並予以更正。 KMP演算法 next陣列
通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的 1 void makenext const char p,int next 214 next q k 15 16 現在我著重講...
KMP演算法 NEXT陣列
kmp和next陣列基本上是一起用的,有了next陣列,才有kmp演算法,講道理來說這兩個都是基於最大前字尾和,也就是說需要用到kmp的時候必須先把next陣列先求出來,next陣列就是由所匹配的word的每個子串的前字尾和最大匹配得到的,說實話next陣列的演算法給優化得已經很無解了,以至於至今我...
kmp演算法next例題 KMP演算法next陣列求解
kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...