锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
C/C++鏍煎紡鍖栧瓧絎︿覆璇存槑
C++鐨勬牸寮忓寲瀛楃涓茬粡甯哥敤浣滄牸寮忓寲鏁板瓧鐨勮緭鍑恒佸瓧絎︿覆鍚堝茍鍜岃漿鎹㈢瓑絳夊緢澶氬満鍚堛?
1. 鏍煎紡鍖栬瀹氱 鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣 絎﹀彿 浣滅敤 鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹 %d 鍗佽繘鍒舵湁絎﹀彿鏁存暟 %u 鍗佽繘鍒舵棤絎﹀彿鏁存暟 %f 嫻偣鏁?/p>
%s 瀛楃涓?/p>
%c 鍗曚釜瀛楃 %p 鎸?
閽?/a>鐨勫?/p>
%e 鎸囨暟褰㈠紡鐨勬誕鐐規暟 %x, %X 鏃犵鍙蜂互鍗佸叚榪涘埗琛ㄧず鐨勬暣鏁?/p>
%0 鏃犵鍙蜂互鍏繘鍒惰〃紺虹殑鏁存暟 %g 鑷姩閫夋嫨鍚堥傜殑琛ㄧず娉?/p>
鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣 璇存槑: (1). 鍙互鍦?%"鍜屽瓧姣嶄箣闂存彃榪涙暟瀛楄〃紺烘渶澶у満瀹姐?/p>
渚嬪: %3d 琛ㄧず杈撳嚭3浣嶆暣鍨嬫暟, 涓嶅3浣嶅彸瀵歸綈銆?/p>
%9.2f琛ㄧず杈撳嚭鍦哄涓?鐨勬誕鐐規暟, 鍏朵腑灝忔暟浣嶄負2, 鏁存暟浣嶄負6, 灝忔暟鐐瑰崰涓浣? 涓嶅9浣嶅彸瀵歸綈銆?/p>
%8s 琛ㄧず杈撳嚭8涓瓧絎︾殑瀛楃涓? 涓嶅8涓瓧絎﹀彸瀵歸綈銆?/p>
濡傛灉瀛楃涓茬殑闀垮害銆佹垨鏁村瀷鏁頒綅鏁拌秴榪囪鏄庣殑鍦哄, 灝嗘寜鍏跺疄闄呴暱搴﹁緭鍑恒備絾瀵規誕鐐規暟, 鑻ユ暣鏁伴儴鍒嗕綅鏁拌秴榪囦簡璇存槑鐨勬暣鏁頒綅瀹藉害,
灝嗘寜瀹為檯鏁存暟浣嶈緭鍑? 鑻ュ皬鏁伴儴鍒嗕綅鏁拌秴榪囦簡璇存槑鐨勫皬鏁頒綅瀹藉害, 鍒欐寜璇存槑鐨勫搴︿互鍥涜垗浜斿叆杈撳嚭銆?/p>
鍙﹀, 鑻ユ兂鍦ㄨ緭鍑哄煎墠鍔犱竴浜?, 灝卞簲鍦ㄥ満瀹介」鍓嶅姞涓?銆?/p>
渚嬪: %04d 琛ㄧず鍦ㄨ緭鍑轟竴涓皬浜?浣嶇殑鏁板兼椂, 灝嗗湪鍓嶉潰琛?浣垮叾鎬誨搴︿負4浣嶃?/p>
濡傛灉鐢ㄦ誕鐐規暟琛ㄧず瀛楃鎴栨暣鍨嬮噺鐨勮緭鍑烘牸寮? 灝忔暟鐐瑰悗鐨勬暟瀛椾唬琛ㄦ渶澶у搴? 灝忔暟鐐瑰墠鐨勬暟瀛椾唬琛ㄦ渶灝忓搴︺?/p>
渚嬪: %6.9s 琛ㄧず鏄劇ず涓涓暱搴︿笉灝忎簬6涓斾笉澶т簬9鐨勫瓧絎︿覆銆傝嫢澶т簬9, 鍒欑9涓瓧絎︿互鍚庣殑鍐呭灝嗚鍒犻櫎銆?/p>
(2). 鍙互鍦?%"鍜屽瓧姣嶄箣闂村姞灝忓啓瀛楁瘝l, 琛ㄧず杈撳嚭鐨勬槸闀垮瀷鏁般?/p>
渚嬪: %ld 琛ㄧず杈撳嚭long鏁存暟 %lf 琛ㄧず杈撳嚭double嫻偣鏁?/p>
(3). 鍙互鎺у埗杈撳嚭宸﹀榻愭垨鍙沖榻? 鍗沖湪"%"鍜屽瓧姣嶄箣闂村姞鍏ヤ竴涓?-" 鍙峰彲璇存槑杈撳嚭涓哄乏瀵歸綈, 鍚﹀垯涓哄彸瀵歸綈銆?/p>
渚嬪: %-7d 琛ㄧず杈撳嚭7浣嶆暣鏁板乏瀵歸綈 %-10s 琛ㄧず杈撳嚭10涓瓧絎﹀乏瀵歸綈 2. 涓浜涚壒孌婅瀹氬瓧絎?/strong> 鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣 瀛楃 浣滅敤 鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹鈹 \n 鎹㈣ \f 娓呭睆騫舵崲欏?/p>
\r 鍥炶濺 \t Tab絎?/p>
\xhh 琛ㄧず涓涓狝SCII鐮佺敤16榪涜〃紺? 鍏朵腑hh鏄?鍒?涓?6榪涘埗鏁?/p>
鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣 char c, s[20], *p; int a=1234, *i; float f=3.141592653589; double x=0.12345678987654321; p="How do you do"; strcpy(s, "Hello, Comrade"); *i=12; c='\x41'; printf("a=%d\n", a); /*緇撴灉杈撳嚭鍗佽繘鍒舵暣鏁癮=1234*/ printf("a=%6d\n", a); /*緇撴灉杈撳嚭6浣嶅崄榪涘埗鏁癮= 1234*/ printf("a=%06d\n", a); /*緇撴灉杈撳嚭6浣嶅崄榪涘埗鏁癮=001234*/ printf("a=%2d\n", a); /*a瓚呰繃2浣? 鎸夊疄闄呭艱緭鍑篴=1234*/ printf("*i=%4d\n", *i); /*杈撳嚭4浣嶅崄榪涘埗鏁存暟*i= 12*/ printf("*i=%-4d\n", *i); /*杈撳嚭宸﹀榻?浣嶅崄榪涘埗鏁存暟*i=12*/ printf("i=%p\n", i); /*杈撳嚭鍦板潃i=06E4*/ printf("f=%f\n", f); /*杈撳嚭嫻偣鏁癴=3.141593*/ printf("f=6.4f\n", f); /*杈撳嚭6浣嶅叾涓皬鏁扮偣鍚?浣嶇殑嫻偣鏁癴=3.1416*/ printf("x=%lf\n", x); /*杈撳嚭闀挎誕鐐規暟x=0.123457*/ printf("x=%18.16lf\n",
x);/*杈撳嚭18浣嶅叾涓皬鏁扮偣鍚?6浣嶇殑闀挎誕鐐規暟x=0.1234567898765432*/ printf("c=%c\n", c); /*杈撳嚭瀛楃c=A*/ printf("c=%x\n", c); /*杈撳嚭瀛楃鐨凙SCII鐮佸糲=41*/ printf("s[]=%s\n", s); /*杈撳嚭鏁扮粍瀛楃涓瞫[]=Hello, Comrade*/ printf("s[]=%6.9s\n", s);/*杈撳嚭鏈澶?涓瓧絎︾殑瀛楃涓瞫[]=Hello,Co*/ printf("s=%p\n", s); /*杈撳嚭鏁扮粍瀛楃涓查瀛楃鍦板潃s=FFBE*/ printf("*p=%s\n", p); /* 杈撳嚭鎸?
閽?/a>瀛楃涓瞤=How do you do*/ printf("p=%p\n", p); /*杈撳嚭鎸?
閽?/a>鐨勫紁=0194*/ 涓婇潰緇撴灉涓殑鍦板潃鍊煎湪涓嶅悓璁$畻鏈轟笂鍙兘涓嶅悓銆?/p>
int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength);
int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength);
int main()
{
const char* ypSrc = "1";
unsigned char* ypDst;
int ynSrcLength = sizeof ypSrc;
gsmEncode7bit(ypSrc,ypDst,ynSrcLength+1);
system("pause");
}
// 7bit緙栫爜
// 杈撳叆: pSrc - 婧愬瓧絎︿覆鎸囬拡
// nSrcLength - 婧愬瓧絎︿覆闀垮害
// 杈撳嚭: pDst - 鐩爣緙栫爜涓叉寚閽?nbsp;
// 榪斿洖: 鐩爣緙栫爜涓查暱搴?nbsp;
int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nSrc; // 婧愬瓧絎︿覆鐨勮鏁板?nbsp;
int nDst; // 鐩爣緙栫爜涓茬殑璁℃暟鍊?nbsp;
int nChar; // 褰撳墠姝e湪澶勭悊鐨勭粍鍐呭瓧絎﹀瓧鑺傜殑搴忓彿錛岃寖鍥存槸0-7
unsigned char nLeft; // 涓婁竴瀛楄妭孌嬩綑鐨勬暟鎹?nbsp;
// 璁℃暟鍊煎垵濮嬪寲
nSrc = 0;
nDst = 0;
// 灝嗘簮涓叉瘡8涓瓧鑺傚垎涓轟竴緇勶紝鍘嬬緝鎴?涓瓧鑺?nbsp;
// 寰幆璇ュ鐞嗚繃紼嬶紝鐩磋嚦婧愪覆琚鐞嗗畬
// 濡傛灉鍒嗙粍涓嶅埌8瀛楄妭錛屼篃鑳芥紜鐞?nbsp;
while (nSrc < nSrcLength)
{
// 鍙栨簮瀛楃涓茬殑璁℃暟鍊肩殑鏈浣?浣?nbsp;
nChar = nSrc & 7;
// 澶勭悊婧愪覆鐨勬瘡涓瓧鑺?nbsp;
if(nChar == 0)
{
// 緇勫唴絎竴涓瓧鑺傦紝鍙槸淇濆瓨璧鋒潵錛屽緟澶勭悊涓嬩竴涓瓧鑺傛椂浣跨敤
nLeft = *pSrc;
}
else
{
// 緇勫唴鍏跺畠瀛楄妭錛屽皢鍏跺彸杈歸儴鍒嗕笌孌嬩綑鏁版嵁鐩稿姞錛屽緱鍒頒竴涓洰鏍囩紪鐮佸瓧鑺?nbsp;
*pDst = (*pSrc << (8-nChar)) | nLeft;
// 灝嗚瀛楄妭鍓╀笅鐨勫乏杈歸儴鍒嗭紝浣滀負孌嬩綑鏁版嵁淇濆瓨璧鋒潵
nLeft = *pSrc >> nChar;
// 淇敼鐩爣涓茬殑鎸囬拡鍜岃鏁板?nbsp;
pDst++;
nDst++;
}
// 淇敼婧愪覆鐨勬寚閽堝拰璁℃暟鍊?nbsp;
pSrc++;
nSrc++;
}
// 榪斿洖鐩爣涓查暱搴?nbsp;
return nDst;
}
// 7bit瑙g爜
// 杈撳叆: pSrc - 婧愮紪鐮佷覆鎸囬拡
// nSrcLength - 婧愮紪鐮佷覆闀垮害
// 杈撳嚭: pDst - 鐩爣瀛楃涓叉寚閽?nbsp;
// 榪斿洖: 鐩爣瀛楃涓查暱搴?nbsp;
int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
int nSrc; // 婧愬瓧絎︿覆鐨勮鏁板?nbsp;
int nDst; // 鐩爣瑙g爜涓茬殑璁℃暟鍊?nbsp;
int nByte; // 褰撳墠姝e湪澶勭悊鐨勭粍鍐呭瓧鑺傜殑搴忓彿錛岃寖鍥存槸0-6
unsigned char nLeft; // 涓婁竴瀛楄妭孌嬩綑鐨勬暟鎹?nbsp;
// 璁℃暟鍊煎垵濮嬪寲
nSrc = 0;
nDst = 0;
// 緇勫唴瀛楄妭搴忓彿鍜屾畫浣欐暟鎹垵濮嬪寲
nByte = 0;
nLeft = 0;
// 灝嗘簮鏁版嵁姣?涓瓧鑺傚垎涓轟竴緇勶紝瑙e帇緙╂垚8涓瓧鑺?nbsp;
// 寰幆璇ュ鐞嗚繃紼嬶紝鐩磋嚦婧愭暟鎹澶勭悊瀹?nbsp;
// 濡傛灉鍒嗙粍涓嶅埌7瀛楄妭錛屼篃鑳芥紜鐞?nbsp;
while(nSrc<nSrcLength)
{
// 灝嗘簮瀛楄妭鍙寵竟閮ㄥ垎涓庢畫浣欐暟鎹浉鍔狅紝鍘繪帀鏈楂樹綅錛屽緱鍒頒竴涓洰鏍囪В鐮佸瓧鑺?nbsp;
*pDst = ((*pSrc << nByte) | nLeft) & 0x7f;
// 灝嗚瀛楄妭鍓╀笅鐨勫乏杈歸儴鍒嗭紝浣滀負孌嬩綑鏁版嵁淇濆瓨璧鋒潵
nLeft = *pSrc >> (7-nByte);
// 淇敼鐩爣涓茬殑鎸囬拡鍜岃鏁板?nbsp;
pDst++;
nDst++;
// 淇敼瀛楄妭璁℃暟鍊?nbsp;
nByte++;
// 鍒頒簡涓緇勭殑鏈鍚庝竴涓瓧鑺?nbsp;
if(nByte == 7)
{
// 棰濆寰楀埌涓涓洰鏍囪В鐮佸瓧鑺?nbsp;
*pDst = nLeft;
// 淇敼鐩爣涓茬殑鎸囬拡鍜岃鏁板?nbsp;
pDst++;
nDst++;
// 緇勫唴瀛楄妭搴忓彿鍜屾畫浣欐暟鎹垵濮嬪寲
nByte = 0;
nLeft = 0;
}
// 淇敼婧愪覆鐨勬寚閽堝拰璁℃暟鍊?nbsp;
pSrc++;
nSrc++;
}
// 杈撳嚭瀛楃涓插姞涓粨鏉熺
*pDst = '\0';
// 榪斿洖鐩爣涓查暱搴?nbsp;
return nDst;
}
]]>
聽聽 濡傛灉鏈烘埧椹笂瑕佸叧闂ㄤ簡錛屾垨鑰呬綘鎬ョ潃瑕佸拰MM綰︿細錛岃鐩存帴璺沖埌絎叚涓嚜鐒舵銆?br />鎴戜滑榪欓噷璇寸殑KMP涓嶆槸鎷挎潵鏀?
鐢靛獎鐨勶紙铏界劧鎴戝緢鍠滄榪欎釜杞歡錛夛紝鑰屾槸涓縐嶇畻娉曘侹MP綆楁硶鏄嬁鏉ュ鐞嗗瓧絎︿覆鍖歸厤鐨勩傛崲鍙ヨ瘽璇達紝緇欎綘涓や釜瀛楃涓詫紝浣犻渶瑕佸洖絳旓紝B涓叉槸鍚︽槸A涓茬殑瀛愪覆錛圓涓?
鏄惁鍖呭惈B涓詫級銆傛瘮濡傦紝瀛楃涓睞="I'm
matrix67"錛屽瓧絎︿覆B="matrix"錛屾垜浠氨璇碆鏄疉鐨勫瓙涓層備綘鍙互濮斿〾鍦伴棶浣犵殑MM錛氣滃亣濡備綘瑕佸悜浣犲枩嬈㈢殑浜鴻〃鐧界殑璇濓紝鎴戠殑鍚嶅瓧鏄綘鐨勫憡鐧?
璇腑鐨勫瓙涓插悧錛熲?br />聽聽聽聽瑙e喅榪欑被闂錛岄氬父鎴戜滑鐨勬柟娉曟槸鏋氫婦浠嶢涓茬殑浠涔堜綅緗搗寮濮嬩笌B鍖歸厤錛岀劧鍚庨獙璇佹槸鍚﹀尮閰嶃傚亣濡侫涓查暱搴︿負n錛孊涓查暱搴︿負
m錛岄偅涔堣繖縐嶆柟娉曠殑澶嶆潅搴︽槸O
(mn)鐨勩傝櫧鐒跺緢澶氭椂鍊欏鏉傚害杈句笉鍒癿n錛堥獙璇佹椂鍙湅澶翠竴涓や釜瀛楁瘝灝卞彂鐜頒笉鍖歸厤浜嗭級錛屼絾鎴戜滑鏈夎澶氣滄渶鍧忔儏鍐碘濓紝姣斿錛孉=
"aaaaaaaaaaaaaaaaaaaaaaaaaab"錛孊="aaaaaaaab"銆傛垜浠皢浠嬬粛鐨勬槸涓縐嶆渶鍧忔儏鍐典笅O(n)鐨勭畻娉曪紙榪欓噷鍋囪
m<=n錛夛紝鍗充紶璇翠腑鐨凨MP綆楁硶銆?br />聽聽聽聽涔嬫墍浠ュ彨鍋欿MP錛屾槸鍥犱負榪欎釜綆楁硶鏄敱Knuth銆丮orris銆丳ratt涓変釜鎻愬嚭鏉ョ殑錛屽彇
浜嗚繖涓変釜浜虹殑鍚嶅瓧鐨勫ご涓涓瓧姣嶃傝繖鏃訛紝鎴栬浣犵獊鐒舵槑鐧戒簡AVL
鏍戜負浠涔堝彨AVL錛屾垨鑰匓ellman-Ford涓轟粈涔堜腑闂存槸涓鏉犱笉鏄竴涓偣銆傛湁鏃朵竴涓笢瑗挎湁涓冨叓涓漢鐮旂┒榪囷紝閭f庝箞鍛藉悕鍛紵閫氬父榪欎釜涓滆タ騫茶剢灝變笉鐢ㄤ漢鍚?
瀛楀懡鍚嶄簡錛屽厤寰楀彂鐢熶簤璁紝姣斿鈥?x+1闂鈥濄傛壇榪滀簡銆?br />聽聽聽聽涓漢璁や負KMP鏄渶娌℃湁蹇呰璁茬殑涓滆タ錛屽洜涓鴻繖涓笢瑗跨綉涓婅兘鎵懼埌寰堝璧勬枡銆備絾緗戜笂
鐨勮娉曞熀鏈笂閮芥秹鍙婂埌鈥滅Щ鍔?shift)鈥濄佲淣ext鍑芥暟鈥濈瓑姒傚康錛岃繖闈炲父瀹規槗浜х敓璇В錛堣嚦灝戜竴騫村崐鍓嶆垜鐪嬭繖浜涜祫鏂欏涔燢MP鏃跺氨娌℃悶娓呮錛夈傚湪榪?
閲岋紝鎴戞崲涓縐嶆柟娉曟潵瑙i噴KMP綆楁硶銆?br />
聽聽聽聽鍋囧錛孉="abababaababacb"錛孊="ababacb"錛屾垜浠潵鐪嬬湅KMP
鏄庝箞宸ヤ綔鐨勩傛垜浠敤涓や釜鎸囬拡i鍜宩鍒嗗埆琛ㄧず錛孉[i-j+
1..i]涓嶣[1..j]瀹屽叏鐩哥瓑銆備篃灝辨槸璇達紝i鏄笉鏂鍔犵殑錛岄殢鐫i鐨勫鍔爅鐩稿簲鍦板彉鍖栵紝涓攋婊¤凍浠[i]緇撳熬鐨勯暱搴︿負j鐨勫瓧絎︿覆姝eソ鍖歸厤B涓茬殑鍓?
j涓瓧絎︼紙j褰撶劧瓚婂ぇ瓚婂ソ錛夛紝鐜板湪闇瑕佹楠孉[i+1]鍜孊[j+1]鐨勫叧緋匯傚綋A[i+1]=B[j+1]鏃訛紝i鍜宩鍚勫姞涓錛涗粈涔堟椂鍊檍=m浜嗭紝鎴戜滑灝?
璇碆鏄疉鐨勫瓙涓詫紙B涓插凡緇忔暣瀹屼簡錛夛紝騫朵笖鍙互鏍規嵁榪欐椂鐨刬鍊肩畻鍑哄尮閰嶇殑浣嶇疆銆傚綋A[i+1]<>B[j+1]錛孠MP鐨勭瓥鐣ユ槸璋冩暣j鐨勪綅緗?
錛堝噺灝廽鍊鹼級浣垮緱A[i-j+1..i]涓嶣[1..j]淇濇寔鍖歸厤涓旀柊鐨凚[j+1]鎭板ソ涓嶢[i+1]鍖歸厤錛堜粠鑰屼嬌寰梚鍜宩鑳界戶緇鍔狅級銆傛垜浠湅涓鐪嬪綋
i=j=5鏃剁殑鎯呭喌銆?br />
聽聽聽聽i = 1 2 3 4 5 6 7 8 9 鈥︹?br />聽聽聽聽A = a b a b a b a a b a b 鈥?br />聽聽聽聽B = a b a b a c b
聽聽聽聽j = 1 2 3 4 5 6 7
聽聽聽聽姝?
鏃訛紝A[6]<>B[6]銆傝繖琛ㄦ槑錛屾鏃秊涓嶈兘絳変簬5浜嗭紝鎴戜滑瑕佹妸j鏀規垚姣斿畠灝忕殑鍊糺'銆俲'鍙兘鏄灝戝憿錛熶粩緇嗘兂涓涓嬶紝鎴戜滑鍙戠幇錛宩'蹇呴』
瑕佷嬌寰桞[1..j]涓殑澶磈'涓瓧姣嶅拰鏈玧'涓瓧姣嶅畬鍏ㄧ浉絳夛紙榪欐牱j鍙樻垚浜唈'鍚庢墠鑳界戶緇繚鎸乮鍜宩鐨勬ц川錛夈傝繖涓猨'褰撶劧瑕佽秺澶ц秺濂姐傚湪榪欓噷錛孊
[1..5]="ababa"錛屽ご3涓瓧姣嶅拰鏈?涓瓧姣嶉兘鏄?aba"銆傝屽綋鏂扮殑j涓?鏃訛紝A[6]鎭板ソ鍜孊[4]鐩哥瓑銆備簬鏄紝i鍙樻垚浜?錛岃宩鍒欏彉鎴愪簡
4錛?br />
聽聽聽聽i = 1 2 3 4 5 6 7 8 9 鈥︹?br />聽聽聽聽A = a b a b a b a a b a b 鈥?br />聽聽聽聽B =聽聽聽聽 a b a b a c b
聽聽聽聽j =聽聽聽聽 1 2 3 4 5 6 7
聽聽聽聽浠?
涓婇潰鐨勮繖涓緥瀛愶紝鎴戜滑鍙互鐪嬪埌錛屾柊鐨刯鍙互鍙栧灝戜笌i鏃犲叧錛屽彧涓嶣涓叉湁鍏熾傛垜浠畬鍏ㄥ彲浠ラ澶勭悊鍑鴻繖鏍蜂竴涓暟緇凱[j]錛岃〃紺哄綋鍖歸厤鍒癇鏁扮粍鐨勭j涓瓧姣嶈?
絎琷+1涓瓧姣嶄笉鑳藉尮閰嶄簡鏃訛紝鏂扮殑j鏈澶ф槸澶氬皯銆侾[j]搴旇鏄墍鏈夋弧瓚矪[1..P[j]]=B[j-P[j]+1..j]鐨勬渶澶у箋?br />聽聽聽聽鍐嶅悗鏉ワ紝A[7]=B[5]錛宨鍜宩鍙堝悇澧炲姞1銆傝繖鏃訛紝鍙堝嚭鐜頒簡A[i+1]<>B[j+1]鐨勬儏鍐碉細
聽聽聽聽i = 1 2 3 4 5 6 7 8 9 鈥︹?br />聽聽聽聽A = a b a b a b a a b a b 鈥?br />聽聽聽聽B =聽聽聽聽 a b a b a c b
聽聽聽聽j =聽聽聽聽 1 2 3 4 5 6 7
聽聽聽聽鐢變簬P[5]=3錛屽洜姝ゆ柊鐨刯=3錛?br />
聽聽聽聽i = 1 2 3 4 5 6 7 8 9 鈥︹?br />聽聽聽聽A = a b a b a b a a b a b 鈥?br />聽聽聽聽B =聽聽聽聽聽聽聽聽 a b a b a c b
聽聽聽聽j =聽聽聽聽聽聽聽聽 1 2 3 4 5 6 7
聽聽聽聽榪欐椂錛屾柊鐨刯=3浠嶇劧涓嶈兘婊¤凍A[i+1]=B[j+1]錛屾鏃舵垜浠啀嬈″噺灝廽鍊鹼紝灝唈鍐嶆鏇存柊涓篜[3]錛?br />
聽聽聽聽i = 1 2 3 4 5 6 7 8 9 鈥︹?br />聽聽聽聽A = a b a b a b a a b a b 鈥?br />聽聽聽聽B =聽聽聽聽聽聽聽聽聽聽聽聽 a b a b a c b
聽聽聽聽j =聽聽聽聽聽聽聽聽聽聽聽聽 1 2 3 4 5 6 7
聽聽聽聽鐜板湪錛宨榪樻槸7錛宩宸茬粡鍙樻垚1浜嗐傝屾鏃禔[8]灞呯劧浠嶇劧涓嶇瓑浜嶣[j+1]銆傝繖鏍鳳紝j蹇呴』鍑忓皬鍒癙[1]錛屽嵆0錛?br />
聽聽聽聽i = 1 2 3 4 5 6 7 8 9 鈥︹?br />聽聽聽聽A = a b a b a b a a b a b 鈥?br />聽聽聽聽B =聽聽聽聽聽聽聽聽聽聽聽聽聽聽 a b a b a c b
聽聽聽聽j =聽聽聽聽聽聽聽聽聽聽聽聽 0 1 2 3 4 5 6 7
聽聽聽聽緇堜簬錛孉[8]=B[1]錛宨鍙樹負8錛宩涓?銆備簨瀹炰笂錛屾湁鍙兘j鍒頒簡0浠嶇劧涓嶈兘婊¤凍A[i+1]=B[j+1]錛堟瘮濡侫[8]="d"鏃訛級銆傚洜姝わ紝鍑嗙‘鐨勮娉曟槸錛屽綋j=0浜嗘椂錛屾垜浠鍔爄鍊間絾蹇界暐j鐩村埌鍑虹幇A[i]=B[1]涓烘銆?br />聽聽聽聽榪欎釜榪囩▼鐨勪唬鐮佸緢鐭紙鐪熺殑寰堢煭錛夛紝鎴戜滑鍦ㄨ繖閲岀粰鍑猴細j:=0;
for i:=1 to n do
begin
聽聽 while (j>0) and (B[j+1]<>A[i]) do j:=P[j];
聽聽 if B[j+1]=A[i] then j:=j+1;
聽聽 if j=m then
聽聽 begin
聽聽聽聽聽聽writeln('Pattern occurs with shift ',i-m);
聽聽聽聽聽聽j:=P[j];
聽聽 end;
end;
聽聽聽聽鏈鍚庣殑j:=P[j]鏄負浜嗚紼嬪簭緇х畫鍋氫笅鍘伙紝鍥犱負鎴戜滑鏈夊彲鑳芥壘鍒板澶勫尮閰嶃?br />聽聽聽聽榪欎釜紼嬪簭鎴栬姣旀兂鍍忎腑鐨勮綆鍗曪紝鍥犱負瀵逛簬i鍊肩殑涓嶆柇澧炲姞錛屼唬鐮佺敤鐨勬槸for寰幆銆傚洜姝わ紝榪欎釜浠g爜鍙互榪欐牱褰㈣薄鍦扮悊瑙o細鎵弿瀛楃涓睞錛屽茍鏇存柊鍙互鍖歸厤鍒癇鐨勪粈涔堜綅緗?br />
聽聽聽聽鐜板湪錛屾垜浠繕閬楃暀浜嗕袱涓噸瑕佺殑闂錛氫竴錛屼負浠涔堣繖涓▼搴忔槸綰挎х殑錛涗簩錛屽浣曞揩閫熼澶勭悊P鏁扮粍銆?br />聽聽聽聽涓?
浠涔堣繖涓▼搴忔槸O(n)鐨勶紵鍏跺疄錛屼富瑕佺殑浜夎鍦ㄤ簬錛寃hile寰幆浣垮緱鎵ц嬈℃暟鍑虹幇浜嗕笉紜畾鍥犵礌銆傛垜浠皢鐢ㄥ埌鏃墮棿澶嶆潅搴︾殑鎽婅繕鍒嗘瀽涓殑涓昏絳栫暐錛岀畝鍗曞湴璇?
灝辨槸閫氳繃瑙傚療鏌愪竴涓彉閲忔垨鍑芥暟鍊肩殑鍙樺寲鏉ュ闆舵暎鐨勩佹潅涔辯殑銆佷笉瑙勫垯鐨勬墽琛屾鏁拌繘琛岀瘡璁°侹MP鐨勬椂闂村鏉傚害鍒嗘瀽鍙皳鎽婅繕鍒嗘瀽鐨勫吀鍨嬨傛垜浠粠涓婅堪紼嬪簭鐨刯
鍊煎叆鎵嬨傛瘡涓嬈℃墽琛寃hile寰幆閮戒細浣縥鍑忓皬錛堜絾涓嶈兘鍑忔垚璐熺殑錛夛紝鑰屽彟澶栫殑鏀瑰彉j鍊肩殑鍦版柟鍙湁絎簲琛屻傛瘡嬈℃墽琛屼簡榪欎竴琛岋紝j閮藉彧鑳藉姞1錛涘洜姝わ紝鏁翠釜榪囩▼
涓璲鏈澶氬姞浜唍涓?銆備簬鏄紝j鏈澶氬彧鏈塶嬈″噺灝忕殑鏈轟細錛坖鍊煎噺灝忕殑嬈℃暟褰撶劧涓嶈兘瓚呰繃n錛屽洜涓簀姘歌繙鏄潪璐熸暣鏁幫級銆傝繖鍛婅瘔鎴戜滑錛寃hile寰幆鎬誨叡鏈澶氭墽琛?
浜唍嬈°傛寜鐓ф憡榪樺垎鏋愮殑璇存硶錛屽鉤鎽婂埌姣忔for寰幆涓悗錛屼竴嬈or寰幆鐨勫鏉傚害涓篛(1)銆傛暣涓繃紼嬫樉鐒舵槸O(n)鐨勩傝繖鏍風殑鍒嗘瀽瀵逛簬鍚庨潰P鏁扮粍棰勫鐞?
鐨勮繃紼嬪悓鏍鋒湁鏁堬紝鍚屾牱鍙互寰楀埌棰勫鐞嗚繃紼嬬殑澶嶆潅搴︿負O(m)銆?br />聽聽聽聽棰勫鐞嗕笉闇瑕佹寜鐓鐨勫畾涔夊啓鎴怬(m^2)鐢氳嚦O(m^3)鐨勩傛垜浠彲浠ラ?
榪嘝[1],P[2],...,P[j-1]鐨勫兼潵鑾峰緱P[j]鐨勫箋傚浜庡垰鎵嶇殑B="ababacb"錛屽亣濡傛垜浠凡緇忔眰鍑轟簡
P[1],P[2],P[3]鍜孭[4]錛岀湅鐪嬫垜浠簲璇ユ庝箞姹傚嚭P[5]鍜孭[6]銆侾[4]=2錛岄偅涔圥
[5]鏄劇劧絳変簬P[4]+1錛屽洜涓虹敱P[4]鍙互鐭ラ亾錛孊[1,2]宸茬粡鍜孊[3,4]鐩哥瓑浜嗭紝鐜板湪鍙堟湁B[3]=B[5]錛屾墍浠[5]鍙互鐢盤[4]
鍚庨潰鍔犱竴涓瓧絎﹀緱鍒般侾[6]涔熺瓑浜嶱[5]+1鍚楋紵鏄劇劧涓嶆槸錛屽洜涓築[ P[5]+1
]<>B[6]銆傞偅涔堬紝鎴戜滑瑕佽冭檻鈥滈涓姝モ濅簡銆傛垜浠冭檻P[6]鏄惁鏈夊彲鑳界敱P[5]鐨勬儏鍐墊墍鍖呭惈鐨勫瓙涓插緱鍒幫紝鍗蟲槸鍚[6]=P[
P[5] ]+1銆傝繖閲屾兂涓嶉氱殑璇濆彲浠ヤ粩緇嗙湅涓涓嬶細
聽聽聽聽聽聽聽聽1 2 3 4 5 6 7
聽聽聽聽B = a b a b a c b
聽聽聽聽P = 0 0 1 2 3 ?
聽聽聽聽P[5]=3
鏄洜涓築[1..3]鍜孊[3..5]閮芥槸"aba"錛涜孭[3]=1鍒欏憡璇夋垜浠紝B[1]銆丅[3]鍜孊[5]閮芥槸"a"銆傛棦鐒禤[6]涓嶈兘鐢盤[5]
寰楀埌錛屾垨璁稿彲浠ョ敱P[3]寰楀埌錛堝鏋淏[2]鎭板ソ鍜孊[6]鐩哥瓑鐨勮瘽錛孭[6]灝辯瓑浜嶱[3]+1浜嗭級銆傛樉鐒訛紝P[6]涔熶笉鑳介氳繃P[3]寰楀埌錛屽洜涓?
B[2]<>B[6]銆備簨瀹炰笂錛岃繖鏍蜂竴鐩存帹鍒癙[1]涔熶笉琛岋紝鏈鍚庯紝鎴戜滑寰楀埌錛孭[6]=0銆?br />聽聽聽聽鎬庝箞榪欎釜棰勫鐞嗚繃紼嬭窡鍓嶉潰鐨凨MP涓葷▼搴忚繖涔堝儚鍛紵鍏跺疄錛孠MP鐨勯澶勭悊鏈韓灝辨槸涓涓狟涓測滆嚜鎴戝尮閰嶁濈殑榪囩▼銆傚畠鐨勪唬鐮佸拰涓婇潰鐨勪唬鐮佺浼鹼細P[1]:=0;
j:=0;
for i:=2 to m do
begin
聽聽 while (j>0) and (B[j+1]<>B[i]) do j:=P[j];
聽聽 if B[j+1]=B[i] then j:=j+1;
聽聽 P[i]:=j;
end;
聽聽聽聽鏈鍚庤ˉ鍏呬竴鐐癸細鐢變簬KMP綆楁硶鍙澶勭悊B涓詫紝鍥犳榪欑綆楁硶寰堥傚悎榪欐牱鐨勯棶棰橈細緇欏畾涓涓狟涓插拰涓緹や笉鍚岀殑A涓詫紝闂瓸鏄摢浜汚涓茬殑瀛愪覆銆?br />
聽聽聽聽涓插尮閰嶆槸涓涓緢鏈夌爺絀朵環鍊肩殑闂銆備簨瀹炰笂錛屾垜浠繕鏈夊悗緙鏍戯紝鑷姩鏈虹瓑寰堝鏂規硶錛岃繖浜涚畻娉曢兘宸у鍦拌繍鐢ㄤ簡棰勫鐞嗭紝浠庤屽彲浠ュ湪綰挎х殑鏃墮棿閲岃В鍐沖瓧絎︿覆鐨勫尮閰嶃傛垜浠互鍚庢潵璇淬?br />
聽聽聽聽鏄ㄥぉ鍙戠幇涓涓壒鍒檿鐨勪簨錛岀煡閬撴庝箞鍘繪帀BitComet鐨勫箍鍛婂悧錛熸妸鐣岄潰璇█璁炬垚鑻辨枃灝辮浜嗐?br />聽聽聽聽榪樻湁錛岄噾灞辮瘝闇稿拰Dr.eye閮藉彲浠ュ幓鑷潃浜嗭紝Babylon绱犵帇閬撱?img src ="http://www.shnenglu.com/msopengl/aggbug/134106.html" width = "1" height = "1" />
]]>