锘??xml version="1.0" encoding="utf-8" standalone="yes"?> KMP綆楁硶 KMP綆楁硶鏄竴縐嶆敼榪涚殑瀛楃涓插尮閰嶇畻娉曪紝姝ょ畻娉曞彲浠ュ湪O(n+m)鐨勬椂闂存暟閲忕駭涓婂畬鎴愪覆鐨勬ā寮忓尮閰嶆搷浣滐紝鍩烘湰鎬濇兂鏄紝姣忓綋鍖歸厤榪囩▼涓嚭鐜板瓧絎︿覆姣旇緝涓嶇瓑鏃訛紝涓嶉渶鍥炴函鎸囬拡錛岃屾槸鍒╃敤宸茬粡寰楀埌鐨?#8220;閮ㄥ垎鍖歸厤”緇撴灉灝嗘ā寮忓悜鍙?#8220;婊戝姩”灝藉彲鑳借繙鐨勪竴孌佃窛紱伙紝鎹緪榪涜姣旇緝銆?/font> 瀹氫箟錛?/font> 鈶犮瑕佹悳绱㈢殑鍏抽敭瀛楃涓?nbsp;key K1K2......Km銆?/font> 鈶°琚悳绱㈢殑婧愬瓧絎︿覆 source S1S2.....Sn銆?/font> u 閽堝瑕佹煡鎵劇殑鍏抽敭瀛楀瓧絎︿覆鏋勯犲け鏁堝嚱鏁癴(s)錛岃鍑芥暟鐨勫姛鑳藉氨鏄湪姣旇緝褰?/font>Ki != Sj鐨勬椂鍊欒綆楀嚭浠嶬鐨勭澶氬皯涓瓧絎﹀紑濮嬮噸鏂版瘮杈冦?/font> 浣垮緱K1K2...Kf(s)鏄渶闀跨殑鏃㈡槸K1K2...Ks鐨勭殑鐪熷墠緙錛屽張鏄?/font>K1K2...Ks鐨勫悗緙鐨勫瓧涓?/font>銆備篃灝辨槸璇村鏋滄垜浠瘯鍥劇敤涓涓枃鏈覆x鍖歸厤K1K2......Km錛?/font>騫朵笖鎴戜滑宸茬粡鍖歸厤浜嗗墠i涓瓧絎︼紝浣嗗尮閰岾i+1鐨勬椂鍊欏け璐ワ紝涔熷氨鏄x鐨勪笅涓涓綅緗笉鏄疜i+1錛岄偅涔坒(s)灝辨槸鍙兘鍜屾垜浠綋鍓嶄綅緗負緇撳熬鐨勬枃鏈覆鍖歸厤鐨勬渶闀跨殑K1K2......Km鐨勫墠緙鍜屽悗緙y銆備篃灝辨槸璇存枃鏈?/font>x鐨勪笅涓涓綅緗拰Kf(s)姣旇緝錛?/font>X褰撳墠浣嶇疆涔嬪墠鐨刦(s)涓瓧絎﹀拰K1..Kf(s)鏄尮閰嶇殑銆傛墍浠ョ洿鎺ヤ粠Kf(s)涔嬪悗榪涜姣旇緝銆?/font> 綆楁硶濡備笅錛?/font> t = 0; f(1) = 0; for (i = 1; i < m; i++) { while(t > 0 && (Ki+1 != Kt+1)) t = f(t); if(Ki+1 == Kt+1) { t = t + 1; f(i+1) = t; } else f(i+1) = 0; } 瀵逛簬涓?/font>"a b a b a a"鐨勮綆梖(s)鐨勮繃紼嬪涓嬶細 s f(s) 褰撳墠瀛楃涓?/span> 璇存槑 1 0 a 鏃犵湡鍓嶇紑 2 0 ab 鏃犵湡鍓嶇紑 3 1 aba "a"鏄?aba"鐨勭湡鍓嶇紑鍜屽悗緙 4 2 abab "ab"鏄?abab"鐨勭湡鍓嶇紑鍜屽悗緙 5 3 ababa "aba"鏄?ababa"鐨勭湡鍓嶇紑鍜屽悗緙 6 1 ababaa "a"鏄?ababaa"鐨勭湡鍓嶇紑鍜屽悗緙 u 閽堟鏌?/font>S1S2.....Sn鏄惁鍖呭惈鍏抽敭瀛?/font>K1K2......Km鐨勭畻娉?/font>銆?/font> s = 0; for (i = 1; i <= n i++) { // 涓嬫爣浠?寮濮?/font> while (s > 0 && Si != Ks+1) s = f(s); if(Si == Ks+1) s = s + 1; if(s == n) return "yes"; } return "no";
1銆佹棤鐢ㄧ鍙峰強鏃犵敤浜х敓寮忕殑鍒犻櫎
鏃犵敤絎﹀彿錛氳鏈変竴鏂囨硶G[S]= 錛圴N 錛孷T 錛孭錛孲錛夛紝璇碐涓殑涓涓鍙稾∈V鏄湁鐢ㄧ殑鏄寚X鑷沖皯鍑虹幇鍦ㄤ竴涓彞瀛愮殑鎺ㄥ榪囩▼涓紝鍗蟲弧瓚籌細
瀛樺湪α錛?#946;∈V*錛屾湁S=*>αXβ
瀛樺湪ω∈VT* 錛?#945;Xβ=*>ω
鍚﹀垯X涓烘棤鐢ㄧ鍙?/span>
璁炬湁鏂囨硶G[S]= 錛圴N 錛孷T 錛孭錛孲錛夛紝棣栧厛鐢ㄧ畻娉?.1鏀歸犺鏂囨硶鐨勫埌G1[S]= 錛圴N1 錛孷T 錛孭1錛孲錛夛紝浣垮緱瀵逛簬姣忎竴涓猉∈VN1錛岄兘鏈?#969;∈VT*錛孹=*>ω
綆楁硶1錛?nbsp;
(1) 鍒嗗埆緗甐N1錛孭1涓?#934;銆?/span>
(2) 瀵筆涓瘡涓涓駭鐢熷紡A→δ錛岃嫢δ∈VT*錛屽垯灝咥鏀懼叆VN1涓?/span>
(3) 瀵筆涓瘡涓涓駭鐢熷紡A→X1 X2……XK錛岃嫢姣忎竴涓猉i 閮藉睘浜嶸T鎴朧N1錛屽垯灝咥鏀懼叆VN1涓?/span>
(4) 閲嶅鈶㈢洿鑷砎N1涓嶅澶с?/span>
(5) 瀵逛簬P涓殑姣忎竴涓駭鐢熷紡B→Y1 Y2……Yn 錛岃嫢B鍙婃瘡涓涓猋i 錛岄兘灞炰簬VN1∪VT 錛屽垯灝咮→Y1 Y2……Yn錛屾斁鍏1涓?nbsp;
鍏舵錛屽浠ョ粰鏂囨硶G[S]錛岃嫢鎵ц綆楁硶2.2鍙緱鍒頒竴絳変環鏂囨硶G’=錛圴N’錛?nbsp;VT’ 錛孭’錛孲錛変嬌寰楀浠諱竴X∈VN’∪ VT’閮藉瓨鍦?#945;錛?#946;∈錛圴N’∪ VT’錛夋湁S=*>αXβ.
綆楁硶2:
1.鍒嗗埆緗甐N’銆?nbsp;VT’銆丳’涓?#966;
2.灝哠 鏀懼叆VN’涓?/span>
3.瀵逛簬G涓換浣曞瀷濡侫→α1|……|αm鐨勪駭鐢熷紡錛岃嫢A∈VN’鍒欏皢α1……αm 涓殑鍏ㄩ儴闈炵粓緇撶鏀懼叆VN’涓紝緇堢粨絎︽斁鍏T’涓?/span>
4.閲嶅鈶㈢洿鑷砎N’銆?nbsp;VT’涓嶅澶т負姝€?/span>
5.灝哖涓乏鍙抽儴浠呭惈VN’∪ VT’涓鍙風殑鎵鏈変駭鐢熷紡鏀懼叆P’ 涓?nbsp;
2銆?#949;鈥斾駭鐢熷紡鐨勬秷闄?/span>
鏈夌殑鍒嗘瀽鏂規硶瑕佹眰鏂囨硶涓笉鑳藉惈鏈?#949;鈥斾駭鐢熷紡錛屽洜姝ら渶瑕佹敼閫犳枃娉曚嬌涔嬩笉鍚?#949;鈥斾駭鐢熷紡銆?/span>
濡傛灉璇█涓嶅惈鏈?#949;鍙ュ瓙錛屽垯鍙湁鍔炴硶娑堥櫎鏂囨硶涓殑鍏ㄩ儴ε鈥斾駭鐢熷紡錛屽惁鍒欎笉鍙兘鍏ㄩ儴娑堥櫎錛屼絾鎴戜滑甯屾湜鍙湁鍦ㄧ┖鍙ュ瓙鐨勬帹瀵間腑鐢ㄥ埌ε鈥斾駭鐢熷紡錛屽叾浠栬鍙ョ殑鎺ㄥ榪囩▼涓笉浼氫嬌鐢?#949;鈥斾駭鐢熷紡銆傛晠瀵瑰惈鏈夌┖鍙ュ瓙鐨勬枃娉曪紝鎴戜滑甯屾湜鍙湁鏂囨硶寮濮嬬S→ε榪欐牱涓涓駭鐢熷紡騫朵笖S涓嶅嚭鐜板湪鍏跺畠浠諱綍浜х敓寮忕殑鍙抽儴銆?/span>
綆楁硶3錛?/span>
鎵懼嚭鎵鏈夎兘瀵煎嚭ε鐨勯潪緇堢粨絎︺?/span>
1.鏋勯燱1={A|浜х敓寮廇→ε∈P}
2.鏋勯犻泦鍚堝簭鍒梂K+1= WK∪{B|B→β∈P錛屼笖β∈WK錛孠≥1}
WK+1鏄竴涓湁闄愰泦錛岃鏈鍚庣殑WK+1涓篧銆?/span>
褰揝∈W鏃訛紝ε∈L錛圙[S]錛夈?/span>
璁炬湁涓鏂囨硶G[S]= 錛圴N 錛孷T 錛孭錛孲錛夛紝褰?#949;涓嶅睘浜庤鏂囨硶鎵鎻忚堪鐨勮璦鏃訛紝鍙瀯閫犳枃娉曪細
G’=錛圴N錛孷T錛孭’錛孲錛夛紝浣垮緱L錛圙’錛?L錛圙錛夛紝G’涓嶅惈鏈?#949;浜х敓寮忥細
綆楁硶4:
1.鍒╃敤W灝哣N 鍒嗕負涓や釜瀛愰泦W鍙奦N -W銆?/span>
2.璁続→X1 X2……XK∈P錛屾寜涓嬮潰瑙勫垯灝嗘墍鏈夊瀷濡侫→Y1 Y2……YK 鐨勪駭鐢熷紡鏀懼叆P’涓紝瀵逛簬涓鍒?≤i≤k錛?/span>
a錛庤嫢Xi 涓嶅睘浜嶹錛屽垯鍙朰i = Xi
b錛庤嫢Xi ∈W錛屽垯鍒嗗埆鍙朰i 涓篨i涓?#949;錛屼絾鏄嫢鎵鏈塜i鍧囧睘浜嶹錛屽嵈涓嶈兘鎶婃墍鏈塝i 鍙栦負ε銆?nbsp;
璁炬湁涓鏂囨硶G[S]= 錛圴N 錛孷T 錛孭錛孲錛夛紝褰?#949;灞炰簬璇ユ枃娉曟墍鎻忚堪鐨勮璦鏃訛紝鍙瀯閫犳枃娉曪細
G1=錛圴N1 錛孷T 錛孭1錛孲’錛夛紝浣垮緱L錛圙1錛?L錛圙錛夛紝P1涓櫎S’→ε澶栦笉鍐嶅惈鏈夊叾瀹?#949;浜х敓寮忥紝騫朵笖S’涓嶅嚭鐜板湪浠諱綍浜х敓寮忕殑鍙寵竟銆?/span>
綆楁硶5錛?/span>
鑻涓嶅嚭鐜板湪浠諱綍浜х敓寮忕殑鍙抽儴錛屽垯鍙洿鎺ョ敤綆楁硶2.4娑堥櫎ε浜х敓寮忥紝鍐嶅姞鍏→ε錛屽惁鍒欙細
1錛庡紩鍏ユ柊鐨勯潪緇堢粨絎’錛?nbsp;VN1= VN ∪{ S’}
2錛庢瀯閫燩’ =P∪{ S’→α| S→α∈P}
3錛庡鏂囨硶G1=錛圴N1 錛孷T 錛孭1錛孲’錛夛紝鎵ц綆楁硶4錛屽啀鍔犲叆S’→ε銆?nbsp;
3銆佸崟浜х敓寮忕殑娑堥櫎
A→B錛孉,B∈VN 姝ょ被浜х敓寮忚縐頒負鍗曚駭鐢熷紡銆?/span>
鍋囧畾鏂囨硶涓笉鍚湁ε浜х敓寮忋?/span>
綆楁硶6錛?/span>
璁綱N ={ A1 ...... AN } 瀵規瘡涓涓狝i 錛?≤i≤n錛夋瀯閫犻泦鍚堝簭鍒?/span>
W1( Ai錛?{Ai}錛?nbsp;
WK+1錛圓i 錛? WK錛圓i 錛?#8746;{D|C→D∈P錛孋∈WK錛圓i 錛夛紝D∈VN }
K≥1錛岃闆嗗悎搴忓垪瀛樺湪涓涓猨錛屾湁
Wj錛圓i 錛? Wj+1錛圓i 錛?.....
浠錛坕錛? Wj錛圓i 錛?/span>
W錛坕錛?{B| Ai =>B錛孊∈VN }
鏋勯燩’={ Ai →α|B→α∈P錛孊∈W錛坕錛夛紝α涓嶆槸鍗曚釜闈炵粓緇撶}(瀵逛簬A1鍒癆n鐨刄鎿嶄綔),姝ゆ椂P′涓凡涓嶅惈浠諱綍鍗曚駭鐢熷紡銆?/span>