KMP演算法自己整理(精簡版)

2021-08-06 04:20:53 字數 1745 閱讀 5912

int violentmatch(char* s, char* p)  

else

} //匹配成功,返回模式串p在文字串s中的位置,否則返回-1

if (j == plen)

return i - j; //當前位置不要+1

else

return -1;

}

knuth-morris-pratt 字串查詢演算法,簡稱為 「kmp演算法」,常用於在乙個文字串s內查詢乙個模式串p 的出現位置,這個演算法由donald knuth、vaughan pratt、james h. morris三人於2023年聯合發表,故取這3人的姓氏命名此演算法。

核心:kmp演算法的核心就是避免不必要的回溯,回溯問題由模式串決定,不是由目標(主)串決定!

前字尾和next陣列求法:

next為此元素之前的字首和字尾包含最大元素個數+1第乙個元素預設0

字首:此元素前去掉結尾

字尾:此元素前去掉開頭

比較方法:同時從兩端開始比較直到不等(對稱比較)

注:next陣列在此基礎上+1

next陣列結果如下:

移位的個數用next代替k陣列進行求解,核心**:

下標代表i,next代表j(失配後可能繼續失配,不斷回溯直到0)

void get_next( string t, int *next )

else

}// 因為字首是固定的,字尾是相對的。

}

#include 

typedef char* string;

void get_next( string t, int *next )

else

}else

}}// 返回子串t在主串s第pos個字元之後的位置

// 若不存在,則返回0

int index_kmp( string s, string t, int pos )

else

}if( j > t[0] )

else

}

通過遞推求得next 陣列:

void getnext(char* p,int next)  

else

} }

優化過後的next 陣列求法:

//優化過後的next 陣列求法  

void getnextval(char* p, int next)

else

} }

kmp搜尋演算法:

int kmpsearch(char* s, char* p)  

else

} if (j == plen)

return i - j;

else

return -1;

}

詳細理解原

python 遺傳演算法精簡版

精簡版遺傳演算法,演算法中僅採用變異運算元而沒有使用交叉運算元,但是進化依然很有效 精簡版遺傳演算法,演算法中僅採用變異運算元而沒有使用交叉運算元,但是進化依然很有效 target list welcome to charset ascii lowercase parent choice chars...

猴王演算法精簡版 Python實現

乙個猴王演算法,網上所列太過繁瑣,問題很簡單描述如下,猴王演算法 一群猴子圍成一圈,從某乙隻開始數,數到m只剔除之,後面的接著從一開始數,數到m剔除之,依次類推,剩下的最後乙隻為猴王 因為剛學習了python,所以用她來編碼,很優秀的程式語言哦 usr bin python coding utf 8...

AsyncTask原理精簡版

asynctask有三個主要的方法 onpreexecute doinbackground string.params onpostexecute 建立asynctask物件需要重寫乙個類繼承asynctask,因為asynctask本身是抽象類 new asynctask execute para...