锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍘熸枃鍦板潃錛?a >http://blog.aulin.no/compiling-sphinx-110beta-on-windows
涓嬮潰鏄紩瀵煎ぇ瀹跺浣曞湪windows涓婄紪璇憇phinx 1.10beta
1. 涓嬭澆sphinx婧愮爜(http://sphinxsearch.com/downloads/sphinx-1.10-beta.tar.gz)
娉細鏈鏂扮増鏈湪錛?a >http://sphinxsearch.com/downloads/archive/ 涓?br />
2. 鍥犱負sphinx浣跨敤鍒癕ySQL, LibExpat and LibIConv,鍥犳鍦ㄧ紪璇戜箣鍓嶉渶瑕侀厤緗繖浜涘簱錛?br /> 涓嬭澆MySQL鐨勫紑鍙戠幆澧?a >http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.52-win32.msi/from/http://mysql.borsen.dk/錛屽畨瑁呭紑鍙戠粍浠?br /> 涓嬭澆LibExpat(http://garr.dl.sourceforge.net/project/expat/expat_win32/2.0.1/expat-win32bin-2.0.1.exe)
涓嬭澆LibIConv (http://netcologne.dl.sourceforge.net/project/gnuwin32/libiconv/1.9.2-1/libiconv-1.9.2-1.exe)
3. 鍦╯hpinx.h涓彲浠ラ厤緗拰縐婚櫎sphinx闇瑕佺殑緇勪歡,濡傚彲浠ョЩ闄ゅPostgreSQL 鐨勬敮鎸?/p>
4. 鍦╲isual studiao 08 涓墦寮 Sphinx08.sln
5. 娣誨姞mysql 鐨刬nclude璺緞(C:\Program Files (x86)\MySQL\MySQL Server 5.1\include) to all projects (鍙沖嚮 - Properties - Configuration Properties - C/C++ - General - Additional Include Directories).
6. 娣誨姞mysql鐨刲ib璺緞(C:\Program Files (x86)\MySQL\MySQL Server 5.1\lib\opt) to all projects excluding "libsphinx" (鍙沖嚮 - Properties - Configuration Properties - Linker - General - Additional Library Directories)
7. 鍦ㄩ櫎浜唋ibsphinx鐨勬墍鏈夊伐紼嬩腑錛屾坊鍔燣ibExpat鐨勮礬寰?C:\Program Files (x86)\Expat 2.0.1\Bin)(鍙沖嚮 - Properties - Configuration Properties - Linker - General - Additional Library Directories)
8. 鍦ㄩ櫎浜唋ibsphinx鐨勬墍鏈夊伐紼嬩腑錛屾坊鍔燣ibIConv 鐨勮礬寰?C:\Program Files (x86)\GnuWin32\lib)(鍙沖嚮 - Properties - Configuration Properties - Linker - General - Additional Library Directories)
9. 緙栬瘧B(tài)uild! (F6)
shuffle綆楁硶錛屾垜鎶婁粬鍙仛媧楃墝綆楁硶錛屽畠鐨勭洰鏍囨濂戒笌鍚勭鐨剆ort綆楁硶鐩稿弽錛屽嵆鎶婁竴涓湁搴?鎴栬呮棤搴?鐨勪竴緋誨垪鍏冪礌鎵撲貢錛屼互婊¤凍闇姹傘?br>
涓句釜涓や緥瀛愶紝澶у閮界煡閬撴墤鍏嬬墝錛屾垜浠瘡嬈¢兘闇瑕佸湪鎽哥墝涔嬪墠鎶婄墝媧楁帀錛岀敤鏉ヨ姣忎釜浜烘懜鍒版瘡寮犵墝鐨勬鐜囧敖閲忕浉絳夛紝澧炲姞娓告垙鐨勯殢鏈烘у拰涔愯叮錛涜繕鏈夐煶棰戞挱鏀懼櫒錛屾湁涓浜涗漢涓嶅枩嬈㈤『搴忔挱鏀撅紝鑰屽枩嬈嬌鐢ㄩ殢鏈烘挱鏀?鍏跺疄闅忔満鎾斁鍒嗕負涓ょ,random鍜宻huffle錛屽悗鏂囦細浠嬬粛鍒?錛屾瘮濡俰Pod Shuffle鐨勫崠鐐逛箣涓灝辨槸“浣犳案榪滀笉鐭ラ亾浣犲皢瑕佸惉鍒扮殑涓嬩竴棣栨瓕鏇叉槸浠涔?#8221;銆傝嚦灝戯紝濡傛灉瑕佹ā鎷熸墤鍏嬬墝娓告垙錛屾垨鑰呭仛闊抽鎾斁鍣紝閮借浣跨敤shuffle綆楁硶錛岃屼簩鑰呯殑shuffle綆楁硶鍗存湁涓浜涘尯鍒紝涓涓槸涓嬈℃х殑媧楃墝錛屽彟涓涓垯鏄瘡嬈″彇涓棣栨瓕銆傞偅涔堟庝箞瀹炵幇浠栦滑鍛紵
鎵戝厠鐗岀殑shuffle綆楁硶錛?br>
涓嬮潰涓轟簡鏂逛究鍜屽鏄撹鎳傦紝鎴戦兘鐢ㄦ墤鍏嬬墝鏉ヤ綔渚嬪瓙錛氭涓婃湁n寮犵墝錛屽茍涓斿妗屽瓙涓婄殑鐗岃繘琛屾爣鍙鳳紝浠?鐩村埌n-1銆傛垜浠殑鐩殑鏄礂榪欎簺鐗屻?br>
涓涓瘮杈冨鏄撴兂鍒扮殑鏂規(guī)硶鏄紝妗屽瓙涓婃湁n寮犳墤鍏嬬墝錛屾垜絎琲嬈′粠妗屽瓙涓婄瓑姒傜巼闅忔満鍙栦竴寮犳墤鍏嬬墝錛屼綔涓烘礂鐗屽悗鐗屽爢鐨勭i寮犳墤鍏嬬墝錛岄偅涔堣繖涓畻娉曞疄鐜拌搗鏉ュ簲璇ユ槸榪欐牱鐨勶細
浼唬鐮侊細
for i <- 0 to n - 1
do d <- Random mod (n - i)
shuffle[i] <- deck[d]
deck[d] <- deck[n - i]
鍏朵腑錛宒eck鏄礂鐗屽墠鐨勫簭鍒?0~n-1)錛宻huffle鏄礂鐗屽悗鐨勫簭鍒?0~n-1)錛岀i嬈?浠?寮濮嬫暟)鍦ㄥ墿涓嬬殑n-i寮犵墝閲岀瓑姒傜巼鐨勫彇涓寮犵墝錛屾妸瀹冩斁鍒皊huffle閲屻傝宒eck[d] = deck[n - i]榪欏彞杈懼埌鐨勬晥鏋滄槸鍒犻櫎鍙栬繃鐨勭墝銆?br>
榪欎釜鏂規(guī)硶鐨勬椂闂村鏉傚害鏄疧(n)錛屽凡緇忓彲浠ユ帴鍙椾簡錛屼絾榪欎釜鏂規(guī)硶榪樹笉澶熷ソ錛屽洜涓烘垜浠渶瑕佷袱涓暱搴︿負n鏁扮粍銆傚叾瀹炲彲浠ュ緢瀹規(guī)槗寰楀緱鍒頒笅闈㈢殑鏂規(guī)硶錛岃В鍐崇┖闂寸殑闂錛?br>浼唬鐮侊細
for i <- 0 to n - 1
do d <- Random mod (n - i)
swap(deck[d], deck[n - i])
榪欐牱錛岃繖涓畻娉曠殑閬撶悊灝辨湁浜涘儚閫夋嫨鎺掑簭浜嗭紝絎琲嬈?浠?寮濮嬫暟)紜畾絎琻-i涓厓绱犵殑鍘熶綅緗紝騫朵笖浜ゆ崲涓や釜浣嶇疆涓婄殑鍏冪礌銆傚畠鐨勫鏉傝浠嶇劧鏄疧(n)錛岃屽彧闇瑕?涓澶栫殑絀洪棿鏉ュ偍瀛樹氦鎹㈢敤鐨勪復(fù)鏃跺彉閲忋?br>榪欎釜鏂規(guī)硶宸茬粡鏄竴涓瘮杈冨ソ鐨勮В鍐蟲柟娉曚簡(鑷繁璁や負)錛屽鏋滀綘榪樿兘鍐欏嚭鏇村ソ鐨剆huffle綆楁硶錛岃鍛婅瘔鎴戙?br>
鎴戠浉淇″媧楃墝榪欑涓滆タ鏈変簡瑙g殑浜洪兘涓嶄細鐢ㄨ繖鏍風(fēng)殑鏂規(guī)硶鏉ユ礂鐗岋細鍙﹀瀵規(guī)瘡寮犵墝鍋氫竴涓爣璁幫紝鍗蟲槸鍚︽娊榪囪繖寮犵墝錛氱劧鍚庣i嬈″湪n寮犵墝閲岄殢鏈烘娊涓涓紝濡傛灉榪欏紶鐗屾浘緇忚鎶借繃錛岄偅涔堟妸瀹冩斁鍥炲幓錛岄噸澶嶆娊鍙栵紝鐩村埌鎶藉埌涓寮犳病琚娊榪囩殑鐗岋紝灝嗚繖寮犵墝鏍囪涓烘娊鍙栬繃鐨勭墝錛岀劧鍚庡湪綰鎬笂鐨勭i涓湴鏂硅涓嬭繖寮犵墝銆傚湪璁$畻鏈洪噷榪欐牱瀹炵幇錛?br>
浼唬鐮侊細
for i <- 0 to n - 1
do d <- Random mod n
while did[d] = 1
do d = Random mod n
did[d] <- 1
shuffle[i] <- deck[d]
鐪嬩簡鎻忚堪錛屼綘涓瀹氬氨浼氳寰楄繖縐嶆柟娉曞疄鍦ㄦ槸閬忎簡錛屼笉浠呴夯鐑︼紝鑰屼笖浼氭湁涓涓櫡闃憋紝閭e氨鏄湪鏌愭鍙栫墝鐨勬椂鍊欙紝涔熻浼氳繍姘斿樊姘歌繙涔熷彇涓嶅埌娌℃湁琚彇榪囩殑閭e紶鐗岋紝瀵艱嚧紼嬪簭榪愯鐨勪笉紜畾鎬с傜劧鑰岋紝鍦ㄥ垵瀛﹁呭綋涓紝鍗存湁涓嶅皯鏄敤榪欑鏂規(guī)硶瀹炵幇鐨剆huffle鐨勩備釜浜鴻涓猴紝鍦ㄨ璁$畻娉曠殑鏃跺欙紝瓚婄畝鍗曘佽秺鎺ヨ繎鐢熸椿鐨勬ā鍨嬶紝灝辮秺瀹規(guī)槗璁捐鍑哄ソ鐨勭畻娉曪紝鑰屼笖綆楁硶鐨勬弿榪頒篃鏇存帴榪戝疄闄呯敓媧匯傚洜姝わ紝璁捐綆楁硶鐨勬椂鍊欙紝濡傛灉鑳藉線騫蟲椂鐢熸椿鐨勬柟闈㈡兂錛?鎬繪槸浜嬪崐鍔熷嶇殑銆?br>
闄勪笂鎴戣嚜宸卞疄鐜扮殑涓涓被qsort鐨剆huffle綆楁硶
// element_Size is the size of each element
void swap(void const *element1, void const *element2, size_t element_Size)
{
char *temp = new char,
*elem1, *elem2;
elem1 = (char *)element1;
elem2 = (char *)element2;
for(int i = 0; i < element_Size; i++, elem1++, elem2++){
*temp = *elem1;
*elem1 = *elem2;
*elem2 = *temp;
}
delete temp;
}
// array_Size is the size of array,
// element_Size is the size of each element in array
void shuffle(void const *array, size_t array_Size, size_t element_Size)
{
void *element1, *element2;
srand(time(0));
for(int i = 0; i < array_Size / element_Size; i++){
element1 = (char *)array + i * element_Size;
element2 = (char *)array + rand(i * element_Size,
array_Size - element_Size, element_Size);
swap(element1, element2, element_Size);
}
}
鎾斁鍣ㄧ殑shuffle綆楁硶錛?
鍓嶉潰璇磋繃鎾斁鍣ㄧ殑闅忔満鎾斁鏈変袱縐嶏紝涓縐嶅彨Random,涓縐嶅彨Shuffle(鎴戣嚜宸辯悊瑙g殑......)錛屼笅闈㈣В閲婅繖涓ょ鏂規(guī)硶鐨勪笉鍚屻?/p>
瀛﹁繃姒傜巼鐨勪漢閮借鐭ラ亾鏈夋斁鍥炵殑鎶藉彇鐨勬蹇點傝涓湁n涓笉鍚岀殑灝忕悆錛屾瘡嬈℃娊鍙栦竴涓皬鐞冿紝鐒跺悗鏀懼洖錛屾瘡涓嬈″彇鐨勬椂鍊欐鐜囬兘鏄浉鍚岀殑銆傝繖姝f槸鎾斁鍣╮andom綆楁硶鐨勫師鐞嗭紝榪欑綆楁硶瀹炵幇璧鋒潵寰堢畝鍗曪紝涓棣栨瓕緇撴潫浠ュ悗錛屽彧闇瑕侀殢鏈洪夊彇涓嬩竴棣栨瓕灝辮浜嗐?br>浣嗘槸榪欐牱鍋氭湁涓浜涚己鐐癸細1錛屾湁涓瀹氱殑姒傜巼浣垮緱榪炵畫閫夊彇鐨勪袱棣栨瓕鏄悓涓棣栨瓕錛屾垜鐩鎬俊騫朵笉鏄墍鏈変漢閮藉笇鏈涘湪shuffle妯″紡涓嬭繛緇惉鍚屼竴棣栨瓕鍚э紝褰撶劧涔熸湁瑙e喅鍔炴硶錛岄偅灝辨槸澧炲姞灞傚驚鐜垽鏂紝濡傛灉閫変笂鍚屼竴棣栨瓕錛屽垯閲嶆柊閫夛紝鑰岃繖鏍峰張浼氶噸韞堥偅涓緢鐑傜殑媧楃墝綆楁硶鐨勮杈欍?錛屽綋鍚畬涓棣栨瓕鐨勬椂鍊欙紝瑙夊緱榪樻兂鍐嶅惉涓閬嶏紝鎬庝箞鍔烇紵鎸変笅“涓婁竴棣?#8221;錛屼綘浼氬彂鐜拌繖鏃跺惉鍒扮殑姝屾洸宸茬粡涓嶆槸鍒氭墠閭d竴棣栨兂鍚瓕鏇蹭簡錛屽洜涓鴻繖縐嶆柟娉曞彧鐭ラ亾褰撳墠鐨勭姸鎬侊紝鑰屼笉鐭ラ亾榪囧幓鐨勬挱鏀劇姸鎬併傛庝箞鍔烇紵涓縐嶅姙娉曟槸澧炲姞涓涓槦鍒楀彨鍋?#8220;鍒氭墠鎾斁鍒楄〃”錛屾妸鎾斁榪囩殑姝屾洸鎸夌収欏哄簭鍌ㄥ瓨鍦ㄥ垪琛ㄩ噷銆?錛屾湁涓瀹氭鐜囧湪寰堥暱鐨勪竴孌墊椂闂村唴錛屾挱鏀懼櫒涓嶅仠鐨勫湪閲嶅鎾斁涓ら姝屾洸A鍜孊鎴栬呯被浼兼儏鍐碉紝灝卞儚榪欐牱錛?..-A-B-A-B-A-B-...銆傝繖縐嶆儏鍐典篃鏄緢璁ㄥ帉鐨勶紝鍙槸濡備綍閬垮厤鍛紵鎴戣兘鎯沖埌鐨勫姙娉曟槸澧炲姞鍒ゆ柇錛岀湅榪欓姝屾槸涓嶆槸鍦ㄥ垪琛ㄧ殑鏈鍚庡嚑欏歸噷錛屽鏋滃湪灝變笉閫夎繖棣?.....
浣嗘槸榪欎簺姒傜巼閮藉皬鐨勫彲鎬滐紝瀵逛簬涓涓挱鏀懼櫒鐨剅andom鍑芥暟鏉ヨ錛岃兘澶熻冭檻鍒頒互涓婄殑鍑犵偣錛屽凡緇忚兘澶熷仛鍒拌凍澶焤andom鍜屼漢鎬у寲浜嗐傚彧瑕佽兘澶熷悎鐞嗙殑閫夋嫨鍙傛暟錛岃冭檻鍒頒竴浜涚壒孌婃儏鍐?姣斿鏋佸皬鐨勬挱鏀懼垪琛?錛屼互鍙婅冭檻鐢ㄦ埛鐨勫績鐞嗭紝灝辮兘鍋氬嚭涓涓瘮杈冨ソ鐨剅andom鍑芥暟銆?/p>
涓嬮潰璁叉垜璁捐鐨勬挱鏀懼櫒shuffle綆楁硶錛宻huffle綆楁硶鑳藉寰堝ぇ紼嬪害涓婇伩鍏峳andom綆楁硶鐨勭己闄鳳紝鍦ㄧ┖闂存椂闂翠笂閮藉緢鑺傜害錛岃屼笖鑳藉杈懼埌姣旇緝鐞嗘兂鐨勯殢鏈哄寲鏁堟灉銆傚畠鐨勫ぇ浣撴濊礬鏄繖鏍風(fēng)殑錛?/p>
鎴戜滑浣跨敤涓涓殣鍚殑shuffle鎾斁鍒楄〃(涓涓驚鐜槦鍒?鏉ュ偍瀛樻瓕鏇茬殑欏哄簭錛屽茍鐢ㄤ竴涓寚閽堣〃紺烘鍦ㄦ挱鏀劇殑姝屾洸(璁頒綔"^")錛屾瘮濡傚綋鍓嶇殑鎾斁鍒楄〃鏄繖鏍風(fēng)殑錛?/p>
ABCDEFGHIJKLMN
^
鍗崇幇鍦ㄦ湁14棣栨瓕錛屽皢瑕佹挱鏀句綅緗?鐨勬瓕鏇?姝e湪鎾斁浣嶇疆14鐨勬瓕鏇?錛屾垜浠涓洪槦鍒楀ご鍜屽熬鏄浉榪炵殑錛屽嵆N鍚庨潰鐨勫厓绱犳槸A錛岄偅涔堣繖鏍峰鎴愪簡涓涓驚鐜槦鍒椼?br>鍦ㄦ挱鏀句箣鍓嶏紝鎴戜滑鍦ㄥ墠7(7=14*0.5錛岃繖涓瘮渚嬪彲浠ラ殢渚塊夛紝褰撶劧瓚婂ぇ闅忔満鎬ц秺澶э紝浣嗚兘鍚庨鐨勬鏁拌秺灝?涓綅緗腑錛岄殢鏈哄彇涓涓竴棣栨瓕錛屾妸瀹冨拰灝嗚鎾斁鐨勯偅涓綅緗殑姝屾洸浜ゆ崲銆傚亣璁炬垜浠夌殑鏄疎錛屽垯闃熷垪鍙樻垚榪欐牱錛?/p>
EBCDAFGHIJKLMN
^
鐒跺悗鎾斁E銆侲鎾斁瀹屼簡浠ュ悗(鎴栬呴夋嫨涓嬩竴棣栨椂)錛岄噸澶嶅垰鎵嶇殑鍔ㄤ綔錛屽嵆鍦˙CDAFGH涓殢鏈洪変竴涓紝浜ゆ崲錛屾瘮濡傞夊埌H錛屽垯闃熷垪鍙樻垚錛?br>EHCDAFGBIJKLMN
^
鐒跺悗鎾斁H銆傝繖鏍鳳紝涓涓猻huffle綆楁硶鍒濇瀹屾垚浜嗐?/p>
姣斿鏌愪竴鏃跺埢鎾斁鍣ㄧ殑鐘舵佹槸榪欐牱錛?br>EHCDAFGBIJKLMN
^
鍒欐垜浠湪LMNEHCD涓夋嫨涓涓紝姣斿閫夋嫨鍒癏錛岄偅涔堜氦鎹㈠茍鎾斁錛屾垚涓猴細
ELCDAFGBIJKHMN
^
浣嗘槸濡傛灉鐢ㄦ埛閫夋嫨涓婁竴棣栨庝箞鍔炲憿?鎴戜滑鍙互鍐嶈褰曚竴涓寚閽堟寚鍚戞渶鏂皊huffle閫夋嫨鍑烘潵鐨勯偅棣栨瓕鏇?璁頒綔"*")錛屾病鏈夐夋嫨榪囧墠涓棣栫殑鏃跺欙紝瀹冧笌鎾斁鎸囬拡鎸囧悜鍚屼竴涓綅緗傚綋閫夋嫨鍓嶄竴棣栫殑鏃跺欙紝浠呯Щ鍔ㄦ寚閽坁錛岃屼笉縐誨姩*錛屾瘮濡備笂涓涓緥瀛愭挱鏀劇殑鏃跺欐寜涓嬪墠涓棣栦互鍚庯紝鎴愪負錛?/p>
ELCDAFGBIJKHMN
^*
榪欐椂鍊欐挱鏀劇殑K姝eソ鏄垰鎵嶆挱鏀劇殑閭d竴棣栵紝褰撶劧榪欒揪鍒頒簡鎴戠殑鐩殑錛屽嵆鍙互閫夊埌鍒氭墠鎾斁鐨勬洸鐩紝褰撶劧濡傛灉鍐嶄竴嬈¢夋嫨涓婁竴棣栵紝灝變細鍙樻垚錛?/p>
ELCDAFGBIJKHMN
^ *
榪欐椂鍊欏鏋滄寜涓嬩竴棣栵紝搴旇鍒ゆ柇^鎸囧悜鐨勬槸涓嶆槸鍜?鎸囧悜鐨勭浉鍚岋紝濡傛灉鐩稿悓錛屽氨鎸夌収鏈鏃╀粙緇嶇殑shuffle綆楁硶榪涜闅忔満閫夊彇錛屼笉鐩稿悓灝辯畝鍗曠殑縐誨姩^錛屽嵆鎴愪負錛?/p>
ELCDAFGBIJKHMN
^*
浼唬鐮侊細
function keypress(key)
if key = NEXT
if p1 = p2
do p1 <- p1 + 1
p2 <- p2 + 1
k = Random mod (length / 2)
swap(p1, (p1 + k) mod length)
play(p2)
else
do p2 <- (p2 + 1) mod length
play(p2)
if key = PREV
do p2 <- (p2 + length - 1) mod length
play(p2)
榪欎釜鎾斁鍣ㄧ殑shuffle綆楁硶姣旇緝綆鍗曞疄鐢紝鑰屼笖鑺傜害鍐呭瓨寮閿(榪欏mp3 walkman涔嬬被鐨勪笢瑗挎槸鍗佸垎閲嶈鐨?錛屽綋鐒朵篃鏈変釜灝忕己鐐癸紝灝辨槸褰揯鍓嶇Щ澶氭鍥炲埌*浠ュ悗錛屽啀鎸変笅涓棣栵紝鍒欎細閲嶆柊寮濮媠huffle錛屼絾鏄瓕鏇叉暟鐩緢澶氱殑鎯呭喌涓嬶紝榪欎釜緙虹偣騫朵笉鏄偅涔堥噸瑕併?br>榪欎釜綆楁硶鍦ㄥ垰寮濮嬪惉鐨勬椂鍊欙紝騫朵笉鏄緢闅忔満錛屽彲鏄殢鐫鍚殑嬈℃暟鐨勫澶氾紝闃熷垪浼氳秺鏉ヨ秺涔憋紝杈懼埌涓涓猻huffle鐨勬晥鏋溿?br>褰撶劧錛屼篃鍙互鍦ㄧ涓嬈″榪欎釜鍒楄〃鎾斁涔嬪墠錛屼嬌鐢ㄦ墤鍏嬬墝鐨剆huffle綆楁硶(瑙佹湰鏂囩涓閮ㄥ垎)榪涜涓嬈huffle錛岃繖鏍鳳紝鍒氬紑濮嬫挱鏀劇殑鏃跺欏垪琛ㄥ氨鏄殢鏈虹殑銆?br>閫氳繃鍘熺悊鎴戜滑鍙互鐪嬪埌錛屽浜庡垰鍚繃鐨勯偅棣栨瓕鏉ヨ錛屼笉緇忚繃length / 2嬈★紝鏄笉浼氬啀涓嬈″惉鍒扮殑錛屽洜姝ゅ緢澶х▼搴︿笂閬垮厤浜唕andom綆楁硶鐨勭己闄楓傝繖涓猯ength / 2鐨勫弬鏁板彲浠ユ寜鐓у叿浣撴儏鍐甸夋嫨錛屽彲浠ユ槸甯告暟錛屼篃鍙互鏄殢鏈烘暟錛屼篃鍙互鏄拰闀垮害鏈夊叧鐨勪竴涓暟銆?nbsp;
鎷夋櫘鎷夋柉鍙樻崲錛圠aplace Transform)錛屾槸宸ョ▼鏁板涓父鐢ㄧ殑涓縐嶇Н鍒嗗彉鎹€?br> 瀹冩槸涓虹畝鍖栬綆楄屽緩绔嬬殑瀹炲彉閲忓嚱鏁板拰澶嶅彉閲忓嚱鏁伴棿鐨勪竴縐嶅嚱鏁板彉鎹€傚涓涓疄鍙橀噺鍑芥暟浣滄媺鏅媺鏂彉鎹紝騫跺湪澶嶆暟鍩熶腑浣滃悇縐嶈繍綆楋紝鍐嶅皢榪愮畻緇撴灉浣滄媺鏅媺鏂弽鍙樻崲鏉ユ眰寰楀疄鏁板煙涓殑鐩稿簲緇撴灉錛屽線寰姣旂洿鎺ュ湪瀹炴暟鍩熶腑姹傚嚭鍚屾牱鐨勭粨鏋滃湪璁$畻涓婂鏄撳緱澶氥傛媺鏅媺鏂彉鎹㈢殑榪欑榪愮畻姝ラ瀵逛簬姹傝В綰挎у井鍒嗘柟紼嬪挨涓烘湁鏁堬紝瀹冨彲鎶婂井鍒嗘柟紼嬪寲涓哄鏄撴眰瑙g殑浠f暟鏂圭▼鏉ュ鐞嗭紝浠庤屼嬌璁$畻綆鍖栥傚湪緇忓吀鎺у埗鐞嗚涓紝瀵規(guī)帶鍒剁郴緇熺殑鍒嗘瀽鍜岀患鍚堬紝閮芥槸寤虹珛鍦ㄦ媺鏅媺鏂彉鎹㈢殑鍩虹涓婄殑銆?br> 寮曞叆鎷夋櫘鎷夋柉鍙樻崲鐨勪竴涓富瑕佷紭鐐癸紝鏄彲閲囩敤浼犻掑嚱鏁頒唬鏇垮井鍒嗘柟紼嬫潵鎻忚堪緋葷粺鐨勭壒鎬с傝繖灝變負閲囩敤鐩磋鍜岀畝渚跨殑鍥捐В鏂規(guī)硶鏉ョ‘瀹氭帶鍒剁郴緇熺殑鏁翠釜鐗規(guī)э紙瑙佷俊鍙鋒祦紼嬪浘銆佸姩鎬佺粨鏋勫浘錛夈佸垎鏋愭帶鍒剁郴緇熺殑榪愬姩榪囩▼錛堣濂堝鏂壒紼沖畾鍒ゆ嵁銆佹牴杞ㄨ抗娉曪級錛屼互鍙婄患鍚堟帶鍒剁郴緇熺殑鏍℃瑁呯疆錛堣鎺у埗緋葷粺鏍℃鏂規(guī)硶錛夋彁渚涗簡鍙兘鎬с?br> 鎷夋櫘鎷夋柉鍙樻崲鍦ㄥ伐紼嬪涓婄殑搴旂敤錛氬簲鐢ㄦ媺鏅媺鏂彉鎹㈣В甯稿彉閲忛綈嬈″井鍒嗘柟紼嬶紝鍙互灝嗗井鍒嗘柟紼嬪寲涓轟唬鏁版柟紼嬶紝浣塊棶棰樺緱浠ヨВ鍐熾傚湪宸ョ▼瀛︿笂錛屾媺鏅媺鏂彉鎹㈢殑閲嶅ぇ鎰忎箟鍦ㄤ簬錛氬皢涓涓俊鍙蜂粠鏃跺煙涓婏紝杞崲涓哄棰戝煙錛坰鍩燂級涓婃潵琛ㄧず錛涘湪綰挎х郴緇燂紝鎺у埗鑷姩鍖栦笂閮芥湁騫挎硾鐨勫簲鐢ㄣ?/p>
錛堥槄璇繪湰鏂囦箣鍓嶈鍏堜簡瑙d簩鍙夋悳绱㈡爲錛?span lang=EN-US>
綰㈤粦鏍戯紙Red-Black Tree錛?span lang=EN-US>
綰㈤粦鏍戯紙Red-Black Tree錛夋槸浜屽弶鎼滅儲鏍戯紙Binary Search Tree錛夌殑涓縐嶆敼榪涖傛垜浠煡閬撲簩鍙夋悳绱㈡爲鍦ㄦ渶鍧忕殑鎯呭喌涓嬪彲鑳戒細鍙樻垚涓涓摼琛?/span>錛堝綋鎵鏈夎妭鐐規(guī)寜浠庡皬鍒板ぇ鐨勯『搴忎緷嬈℃彃鍏ュ悗錛夈傝岀孩榛戞爲鍦ㄦ瘡涓嬈℃彃鍏ユ垨鍒犻櫎鑺傜偣涔嬪悗閮戒細鑺?span lang=EN-US>O錛?span lang=EN-US>log N錛夌殑鏃墮棿鏉ュ鏍戠殑緇撴瀯浣滀慨鏀癸紝浠?span style="COLOR: red">淇濇寔鏍戠殑騫寵 銆備篃灝辨槸璇達紝綰㈤粦鏍戠殑鏌ユ壘鏂規(guī)硶涓庝簩鍙夋悳绱㈡爲瀹屽叏涓鏍鳳紱鎻掑叆鍜屽垹闄よ妭鐐圭殑鐨勬柟娉曞墠鍗婇儴鍒嗚妭涓庝簩鍙夋悳绱㈡爲瀹屽叏涓鏍鳳紝鑰屽悗鍗婇儴鍒嗘坊鍔犱簡涓浜涗慨鏀規(guī)爲鐨勭粨鏋勭殑鎿嶄綔銆?span lang=EN-US>
綰㈤粦鏍戠殑姣忎釜鑺傜偣涓婄殑灞炴ч櫎浜嗘湁涓涓?span lang=EN-US>key銆?span lang=EN-US>3涓寚閽堬細parent銆?span lang=EN-US>lchild銆?span lang=EN-US>rchild浠ュ錛?span style="COLOR: red">榪樺浜嗕竴涓睘鎬э細color銆?/span>瀹冨彧鑳芥槸涓ょ棰滆壊錛氱孩鎴栭粦銆傝岀孩榛戞爲闄や簡鍏鋒湁浜屽弶鎼滅儲鏍戠殑鎵鏈夋ц川涔嬪錛岃繕鍏鋒湁浠ヤ笅4鐐規(guī)ц川錛?span style="COLOR: red">錛堜負浠涔堝彧瑕佽繖浜涙ц川灝辮兘瑙e喅榪欎釜闂錛屽叾瀹炶繕鏄竴涓棶棰橈級
1. 鏍硅妭鐐規(guī)槸榛戣壊鐨勩?span lang=EN-US>
2. 絀鴻妭鐐規(guī)槸榛戣壊鐨勶紙綰㈤粦鏍戜腑錛屾牴鑺傜偣鐨?span lang=EN-US>parent浠ュ強鎵鏈夊彾鑺傜偣lchild銆?span lang=EN-US>rchild閮戒笉鎸囧悜NULL錛岃屾槸鎸囧悜涓涓畾涔夊ソ鐨勭┖鑺傜偣錛夈?span lang=EN-US>
3. 綰㈣壊鑺傜偣鐨勭埗銆佸乏瀛愩佸彸瀛愯妭鐐歸兘鏄粦鑹層?span lang=EN-US>
4. 鍦ㄤ換浣曚竴媯靛瓙鏍戜腑錛屾瘡涓鏉′粠鏍硅妭鐐瑰悜涓嬭蛋鍒扮┖鑺傜偣鐨勮礬寰勪笂鍖呭惈鐨勯粦鑹茶妭鐐規(guī)暟閲忛兘鐩稿悓銆?span lang=EN-US>
濡備笅鍥懼氨鏄竴媯電孩榛戞爲錛?span lang=EN-US>
鏈変簡榪欏嚑鏉¤鍒欙紝灝卞彲浠ヤ繚璇佹暣媯墊爲鐨勫鉤琛★紝涔熷氨絳変簬淇濊瘉浜嗘悳绱㈢殑鏃墮棿涓?span lang=EN-US>O錛?span lang=EN-US>log N錛夈?span lang=EN-US>
浣嗘槸鍦ㄦ彃鍏ャ佸垹闄よ妭鐐瑰悗錛屽氨鏈夊彲鑳界牬鍧忎簡綰㈤粦鏍戠殑鎬ц川銆傛墍浠ユ垜浠鍋氫竴浜涙搷浣滄潵鎶婃暣媯墊爲淇ˉ濂姐備笅闈㈡垜灝辨潵浠嬬粛涓涓嬨?span lang=EN-US>
棣栧厛鏈変竴涓澶囩煡璇嗭紝閭e氨鏄妭鐐圭殑Left-Rotate鍜?span lang=EN-US>Right-Rotate鎿嶄綔銆傛墍璋?span lang=EN-US>Left-Rotate(x)灝辨槸鎶婅妭鐐?span lang=EN-US>x鍚戝乏涓嬫柟鍚戠Щ鍔ㄤ竴鏍鹼紝鐒跺悗璁?span lang=EN-US>x鍘熸潵鐨勫彸瀛愯妭鐐逛唬鏇垮畠鐨勪綅緗傝?span lang=EN-US>Right-Rotate褰撶劧灝辨槸鎶?span lang=EN-US>Left-Rotate宸︺佸彸浜掑弽涓涓嬨傚涓嬪浘錛?span lang=EN-US>
娉ㄦ剰錛?span lang=EN-US>Left-Rotate(x)鍚庯紝x鐨勫彸瀛愭爲鍙樻垚浜嗗師鏉?span lang=EN-US>y鐨勫乏瀛愭爲錛?span lang=EN-US>Right-Rotate鍙嶄箣銆傛濊冧竴涓嬶紝榪欐牱涓嬈″彉鎹㈠悗錛屼粛鐒?span style="COLOR: red">婊¤凍浜屽弶鎼滅儲鏍戠殑鎬ц川錛?span style="COLOR: red">涓簭閬嶅巻騫舵病鏈夋敼鍙?/span>錛夈傚湪綰㈤粦鏍戠殑鎻掑叆銆佸垹闄や腑錛岃鐢ㄥ埌寰堝Left-Rotate鍜?span lang=EN-US>Right-Rotate鎿嶄綔銆?span lang=EN-US>
//鎶婁竴涓妭鐐瑰悜宸︿笅鏂圭Щ涓鏍鹼紝騫惰浠栧師鏉ョ殑鍙沖瓙鑺傜偣浠f浛瀹冪殑浣嶇疆銆?/span>
void leftRotate(RBTNode* node)
{
RBTNode* right = node->rchild;
node->rchild = right->lchild;
node->rcount = right->lcount;
node->rchild->parent = node;
right->parent = node->parent;
if (right->parent == m_null) {
m_root = right;
}
else if (node == node->parent->lchild) {
node->parent->lchild = right;
}
else {
node->parent->rchild = right;
}
right->lchild = node;
right->lcount += node->lcount + 1;
node->parent = right;
}
//鎶婁竴涓妭鐐瑰悜鍙充笅鏂圭Щ涓鏍鹼紝騫惰浠栧師鏉ョ殑宸﹀瓙鑺傜偣浠f浛瀹冪殑浣嶇疆銆?/span>
inline void rightRotate(RBTNode* node) {
RBTNode* left = node->lchild;
node->lchild = left->rchild;
node->lcount = left->rcount;
node->lchild->parent = node;
left->parent = node->parent;
if (left->parent == m_null) {
m_root = left;
}
else if (node == node->parent->lchild) {
node->parent->lchild = left;
}
else {
node->parent->rchild = left;
}
left->rchild = node;
left->rcount += node->rcount + 1;
node->parent = left;
}
涓銆?鎻掑叆
鎻掑叆棣栧厛鏄寜閮ㄥ氨鐝簩鍙夋悳绱㈡爲鐨勬彃鍏ユ楠わ紝鎶婃柊鑺傜偣z鎻掑叆鍒版煇涓涓彾鑺傜偣鐨勪綅緗笂銆?span lang=EN-US>
鎺ヤ笅鏉ユ妸z鐨勯鑹茶鎴?span style="COLOR: red">綰㈣壊銆?span style="COLOR: red">涓轟粈涔堬紵榪樿寰楃孩榛戞爲鐨勬ц川鍚楋紝浠庢牴鑺傜偣鍚戜笅鍒扮┖鑺傜偣鐨勬瘡涓鏉¤礬寰勪笂鐨勯粦鑹茶妭鐐規(guī)暟瑕佺浉鍚屻傚鏋滄柊鎻掑叆鐨勬槸榛戣壊鑺傜偣錛岄偅涔堝畠鎵鍦ㄧ殑璺緞涓婂氨澶?span style="COLOR: red">鍑轟簡涓涓粦鑹茬殑鑺傜偣浜嗐傛墍浠ユ柊鎻掑叆鐨勮妭鐐逛竴瀹氳璁炬垚綰㈣壊銆備絾鏄繖鏍峰彲鑳藉張鏈変竴涓煕鐩撅紝濡傛灉z鐨勭埗鑺傜偣涔熸槸綰㈣壊錛屾庝箞鍔烇紝鍓嶉潰璇磋繃綰㈣壊鑺傜偣鐨勫瓙鑺傜偣蹇呴』鏄粦鑹層傚洜姝ゆ垜浠鎵ц涓嬮潰涓涓凱浠g殑榪囩▼錛岀О涓?span lang=EN-US>Insert-Fixup錛屾潵淇ˉ榪欐5綰㈤粦鏍戙?span lang=EN-US>
鍦?span lang=EN-US>Insert-Fixup涓紝姣忎竴嬈¤凱浠g殑寮濮嬶紝鎸囬拡z涓瀹氶兘鎸囧悜涓涓孩鑹茬殑鑺傜偣銆傚鏋?span lang=EN-US>z->parent鏄粦鑹詫紝閭f垜浠氨澶у姛鍛婃垚浜嗭紱濡傛灉z->parent鏄孩鑹詫紝鏄劇劧榪欏氨榪濊繑浜嗙孩榛戠殑鏍戞ц川錛岄偅涔堟垜浠鎯沖姙娉曟妸z鎴栬?span lang=EN-US>z->parent鍙樻垚榛戣壊錛屼絾榪欒寤虹珛鍦ㄤ笉鐮村潖綰㈤粦鏍戠殑鍏朵粬鎬ц川鐨勫熀紜涓娿?span lang=EN-US>
榪欓噷鍐嶅紩鍏ヤ袱涓寚閽堬細grandfather錛屾寚鍚?span lang=EN-US>z->parent->parent錛屼篃灝辨槸z鐨勭埛鐖?span lang=EN-US>(鏄劇劧鐢變簬z->parent涓虹孩鑹詫紝grandfather涓瀹氭槸榛戣壊)錛?span lang=EN-US>uncle錛屾寚鍚?span lang=EN-US>grandfather闄や簡z->parent涔嬪鐨勫彟涓涓瓙鑺傜偣錛屼篃灝辨槸z鐨勭埗浜茬殑鍏勫紵錛屾墍浠ュ彨uncle銆?span lang=EN-US>
錛堜負浜嗚璇濇柟渚匡紝鎴戜滑榪欓噷閮藉亣璁?span lang=EN-US>z->parent鏄?span lang=EN-US>grandfather鐨勫乏瀛愯妭鐐癸紝鑰?span lang=EN-US>uncle鏄?span lang=EN-US>grandfather鐨勫彸瀛愯妭鐐廣傚鏋滈亣鍒扮殑瀹為檯鎯呭喌涓嶆槸榪欐牱錛岄偅涔熷彧瑕佹妸鎵鏈夋搷浣滀腑鐨勫乏銆佸彸浜掑弽灝卞彲浠ヤ簡銆傦級
鍦ㄦ瘡涓嬈¤凱浠d腑錛屾垜浠彲鑳介亣鍒頒互涓嬩笁縐嶆儏鍐點?span lang=EN-US>
Case 1. uncle涔熸槸綰㈣壊銆傝繖鏃跺彧瑕佹妸z->parent鍜?span lang=EN-US>uncle閮借鎴愰粦鑹詫紝騫舵妸grandfather璁炬垚綰㈣壊銆傝繖鏍蜂粛鐒剁‘淇濅簡姣忎竴鏉¤礬寰勪笂鐨勯粦鑹茶妭鐐規(guī)暟涓嶅彉銆傜劧鍚庢妸z鎸囧悜grandfather錛屽茍寮濮嬫柊涓杞殑榪唬銆傚涓嬪浘錛?span lang=EN-US>
娉?span lang=EN-US>1錛氭垜浠彲浠ョ湅鍑哄乏杈圭殑鍥撅紝鍚勬潯璺緞鍖呭惈榛戦鑹茬殑鏁扮洰鏄紜殑錛屽彧鏄鑹蹭笉瀵硅屽凡錛屾垜浠妸瀹冨垎鎴愪袱杈規(guī)潵鐪嬶紝鍗沖埌鑺傜偣D搴旇鍖呭惈N+1涓粦鑹茶妭鐐癸紝鍏朵腑榪欎釜1鏄?span lang=EN-US>C錛岃?span lang=EN-US>N鏄?span lang=EN-US>C浠ヤ笂鐨勯粦鑹茶妭鐐逛釜鏁般傚悓鐞?span lang=EN-US>A涔熷簲璇ユ槸N+1錛?span lang=EN-US>B涔熸槸N+1錛岃皟鏁翠互鍚庯紝鐪嬬湅鎴戜滑紜疄娌℃湁鏀瑰彉鍒?span lang=EN-US>A銆?span lang=EN-US>B銆?span lang=EN-US>D鐨勬墍鍖呭惈鐨勯粦鑹茶妭鐐規(guī)暟銆備笅闈㈢殑鎯呭喌涔熷彲浠ュ悓鏍風(fēng)殑鏂規(guī)硶鏉ュ垎鏋愩?span lang=EN-US>
Case 2. uncle鏄粦鑹詫紝騫朵笖z鏄?span lang=EN-US>z->parent鐨勫彸瀛愯妭鐐廣傝繖鏃舵垜浠彧瑕佹妸z鎸囧悜z->parent錛岀劧鍚庡仛涓嬈?span lang=EN-US>Left-Rotate(z)銆傚氨鍙互鎶婃儏鍐佃漿鍖栨垚Case 3銆?span lang=EN-US>
Case 3. uncle鏄粦鑹詫紝騫朵笖z鏄?span lang=EN-US>z->parent鐨勫乏瀛愯妭鐐廣傚埌浜嗚繖涓姝ワ紝鎴戜滑灝卞墿鏈鍚庝竴姝ヤ簡銆傚彧瑕佹妸z->parent璁炬垚榛戣壊錛屾妸grandfather璁炬垚綰㈣壊錛屽啀鍋氫竴嬈?span lang=EN-US>Right-Rotate(grandfather)錛屾暣媯墊爲灝變慨琛ュ畬姣曚簡銆傚彲浠ユ濊冧竴涓嬶紝榪欐牱涓嬈℃搷浣滀箣鍚庯紝紜疄婊¤凍浜嗘墍鏈夌孩榛戞爲鐨勬ц川銆?span lang=EN-US>Case 2鍜?span lang=EN-US>Case 3濡備笅鍥撅細
鍙嶅榪涜榪唬錛岀洿鍒版煇涓嬈¤凱浠e紑濮嬫椂z->parent涓洪粦鑹茶屽憡緇堬紝涔熷氨鏄綋閬囧埌Case 3鍚庯紝鍋氬畬瀹冭屽憡緇堛?span lang=EN-US>
void insertFixup(RBTNode* insertNode) {
RBTNode* p = insertNode;
while (p->parent->color == RED) {
//z->parent鏄?/span>grandfather鐨勫乏瀛愯妭鐐?/span>,涓嬮潰鏄笁縐嶆儏鍐?/span>
if (p->parent == p->parent->parent->lchild) {
RBTNode* parentRight = p->parent->parent->rchild;
if (parentRight->color == RED) {
p->parent->color = BLACK;
parentRight->color = BLACK;
p->parent->parent->color = RED;
p = p->parent->parent;
}
else {
if (p == p->parent->rchild) {
p = p->parent;
leftRotate(p);
}
p->parent->color = BLACK;
p->parent->parent->color = RED;
rightRotate(p->parent->parent);
}
}
else {
RBTNode* parentLeft = p->parent->parent->lchild;
if (parentLeft->color == RED) {
p->parent->color = BLACK;
parentLeft->color = BLACK;
p->parent->parent->color = RED;
p = p->parent->parent;
}
else {
if (p == p->parent->lchild) {
p = p->parent;
rightRotate(p);
}
p->parent->color = BLACK;
p->parent->parent->color = RED;
leftRotate(p->parent->parent);
}
}
}
m_root->color = BLACK;
}
浜屻佸垹闄?span lang=EN-US>
璁╂垜浠潵鍥為【涓涓嬩簩鍙夋悳绱㈡爲鐨勫垹闄よ妭鐐?span lang=EN-US>z鐨勮繃紼嬶細濡傛灉z娌℃湁瀛愯妭鐐癸紝閭d箞鐩存帴鍒犻櫎鍗沖彲錛涘鏋?span lang=EN-US>z鍙湁涓涓瓙鑺傜偣錛岄偅涔堣榪欎釜瀛愯妭鐐規(guī)潵浠f浛z鐨勪綅緗紝鐒跺悗鎶?span lang=EN-US>z鍒犻櫎鍗沖彲錛涘鏋?span lang=EN-US>z鏈変袱涓瓙鑺傜偣錛岄偅涔堟壘鍒?span lang=EN-US>z鍦ㄤ腑搴忛亶鍘嗕腑鐨勫悗緇ц妭鐐?span lang=EN-US>s錛堜篃灝辨槸浠?span lang=EN-US>z->rchild寮濮嬪悜宸︿笅鏂逛竴鐩磋蛋鍒板簳鐨勯偅涓涓妭鐐癸級錛屾妸s鐨?span lang=EN-US>key璧嬪肩粰z鐨?span lang=EN-US>key錛岀劧鍚庡垹闄?span lang=EN-US>s銆?span lang=EN-US>
綰㈤粦鏍戜腑鍒犻櫎涓涓妭鐐?span lang=EN-US>z鐨勬柟娉曚篃鏄鍏堟寜閮ㄥ氨鐝互涓婄殑榪囩▼銆?span lang=EN-US>
鎸夌収浜屽弶鎼滅儲鏍戠殑鍒犻櫎鏂規(guī)硶鍒犻櫎鑺傜偣錛屽鏋滃垹闄よ妭鐐規(guī)槸綰㈣壊鐨?/span>錛岄偅騫?span style="COLOR: red">涓嶄細鏀瑰彉綰㈤粦鏍戠殑鎬ц川銆傚鏋滃垹闄ょ殑鑺傜偣鏄?span style="COLOR: red">榛戣壊鐨?/span>錛岄偅涔堟樉鐒跺畠鎵鍦ㄧ殑璺緞涓婂氨灝戜竴涓粦鑹茶妭鐐癸紝閭d箞綰㈤粦鏍戠殑鎬ц川灝辮鐮村潖浜?/span>銆傝繖鏃舵垜浠氨瑕佹墽琛屼竴涓О涓?span lang=EN-US>Delete-Fixup鐨勮繃紼嬶紝鏉ヤ慨琛ヨ繖媯墊爲銆備笅闈㈡垜灝辨潵璁茶В涓涓嬨?span lang=EN-US>
涓涓妭鐐硅鍒犻櫎涔嬪悗錛屼竴瀹氭湁涓涓畠鐨勫瓙鑺傜偣浠f浛浜嗗畠鐨勪綅緗紙鍗充嬌鏄彾鑺傜偣琚垹闄ゅ悗錛屼篃浼氭湁涓涓┖鑺傜偣鏉ヤ唬鏇垮畠鐨勪綅緗傚墠闈㈣榪囷紝鍦ㄧ孩榛戞爲涓紝絀鴻妭鐐規(guī)槸涓涓疄闄呭瓨鍦ㄧ殑鑺傜偣銆傦級銆傛垜浠氨璁炬寚閽?span lang=EN-US>x鎸囧悜榪欎釜浠f浛浣嶇疆鐨勮妭鐐廣?span lang=EN-US>
鏄劇劧錛屽鏋?span lang=EN-US>x鏄孩鑹茬殑錛岄偅涔堟垜浠彧瑕佹妸瀹冭鎴愰粦鑹詫紝瀹冩墍鍦ㄧ殑璺緞涓婂氨閲嶆柊澶氬嚭浜嗕竴涓粦鑹茶妭鐐癸紝閭d箞綰㈤粦鏍戠殑鎬ц川灝辨弧瓚充簡銆?span lang=EN-US>
鐒惰岋紝濡傛灉x鏄粦鑹茬殑錛岄偅鎴戜滑灝辮鍋囨兂x涓婅儗璐熶簡2涓崟浣嶇殑榛戣壊銆傞偅涔堢孩榛戞爲鐨勬ц川涔熷悓鏍蜂笉鐮村潖錛屼絾鏄垜浠鎵懼埌鏌愪竴涓孩鑹茬殑鑺傜偣錛屾妸x涓?span lang=EN-US>“瓚呰澆”鐨勮繖1涓崟浣嶇殑榛戣壊涓㈢粰瀹冿紝榪欐牱鎵嶇畻瀹屾垚銆?span lang=EN-US>Delete-Fixup鍋氱殑灝辨槸榪欎釜宸ヤ綔銆?span lang=EN-US>
娉細鍒犻櫎浜嗕竴涓粦鑹茶妭鐐逛互鍚庯紝閬嶅巻鍒拌妭鐐逛竴涓嬬殑鍙跺瓙鑺傜偣姣旈亶鍘嗗叾浠栧垎鏀殑鍙跺瓙鑺傜偣鐨勯粦鑹茶妭鐐規(guī)暟灝卞皯浜嗕竴涓紝榪欏氨瑕佹槸鎵懼埌涓涓孩鑹詫紝鎶婅繖涓妭鐐規(guī)崲鎴愰粦鑹叉潵鎷熻ˉ榪欎釜鍒犻櫎鐨勯粦鑹茶妭鐐癸紝浣垮緱閬嶅巻鍒板彾瀛愯妭鐐圭粡榪囬粦鑹茶妭鐐圭殑鏁扮洰涓鏍楓?span lang=EN-US>
Delete-Fixup鍚屾牱鏄竴涓驚鐜凱浠g殑榪囩▼銆傛瘡涓嬈¤凱浠e紑濮嬫椂錛屽鏋滄寚閽?span lang=EN-US>x鎸囧悜涓涓孩鑹茶妭鐐癸紝閭d箞澶у姛鍛婃垚錛屾妸瀹冭鎴愰粦鑹插嵆鍛婄粓銆傜浉鍙嶅鏋?span lang=EN-US>x榛戣壊錛岄偅涔堟垜浠氨浼氶潰瀵?span style="COLOR: red">浠ヤ笅4縐嶆儏鍐?/span>銆?span lang=EN-US>
榪欓噷寮曞叆鍙︿竴涓寚閽?span lang=EN-US>w錛屾寚鍚?span lang=EN-US>x鐨勫厔寮熴傝繖閲屾垜浠兘榛樿x鏄?span lang=EN-US>x->parent鐨勫乏瀛愯妭鐐癸紝鍒?span lang=EN-US>w鏄?span lang=EN-US>x->parent鐨勫彸瀛愯妭鐐廣傦紙濡傛灉瀹為檯閬囧埌鐩稿弽鐨勬儏鍐碉紝鍙鎶婃墍鏈夋搷浣滀腑鐨勫乏銆佸彸浜掑弽涓涓嬪氨鍙互浜嗐傦級
Case 1. w鏄孩鑹層傝繖鏃舵垜浠牴鎹孩榛戞爲鐨勬ц川鍙互鑲畾x->parent鏄粦鑹層?span lang=EN-US>w->lchild鏄粦鑹層傛垜浠妸x->parent涓?span lang=EN-US>w鐨勯鑹蹭簰鎹紝鐒跺悗鍋氫竴嬈?span lang=EN-US>Left-Rotate(x->parent)銆傚仛瀹屼箣鍚?span lang=EN-US>x灝辨湁浜嗕竴涓柊鐨勫厔寮燂細鍘?span lang=EN-US>w->lchild錛屽墠闈㈣榪囧畠涓瀹氭槸榛戣壊鐨勩傞偅涔堟垜浠氨鍦ㄤ笉鐮村潖綰㈤粦鏍戞ц川鐨勫墠鎻愪笅錛屾妸Case 1杞崲鎴愪簡Case2銆?span lang=EN-US>3銆?span lang=EN-US>4涓殑涓涓紝涔熷氨鏄?span lang=EN-US>w鏄粦鑹茬殑鎯呭喌銆傛濊冧竴涓嬶紝榪欐牱鍋氫笉浼氭敼鍙樻瘡鏉¤礬寰勪笂榛戣壊鑺傜偣鐨勪釜鏁幫紝濡備笅鍥撅細
娉細鍙互鐪嬪嚭榪欐牱鍙樺寲浠ュ悗灝卞彉鎴愪簡Case2浜嗐?span lang=EN-US>
Case 2. w鏄粦鑹詫紝騫朵笖w鐨勪袱涓瓙鑺傜偣閮芥槸榛戣壊銆傝繖鏃舵垜浠彧瑕佹妸w璁炬垚綰㈣壊銆傜劧鍚庢妸x縐誨埌x->parent錛屽紑濮嬩笅涓杞凱浠o紙娉ㄦ剰錛岄偅“瓚呰澆”鐨?span lang=EN-US>1鍗曚綅鐨勯粦鑹插緇堟槸璺熺潃鎸囬拡x璧扮殑錛岀洿鍒?span lang=EN-US>x璧板埌浜嗕竴涓孩鑹茶妭鐐逛笂鎵嶈兘鎶婂畠“鍗鎬笅”錛夈傛濊冧竴涓嬶紝榪欎竴嬈℃搷浣滀笉浼氱牬鍧忕孩榛戞爲鐨勬ц川銆傚涓嬪浘錛堝浘涓妭鐐?span lang=EN-US>B涓嶄竴瀹氭槸綰㈣壊錛屼篃鍙兘鏄粦鑹詫級錛?span lang=EN-US>
娉細榪欓噷鍙鎶?span lang=EN-US>B鍙樻垚綰㈣壊灝卞ぇ鍔熷憡鎴愪簡銆?span lang=EN-US>
Case 3. w鏄粦鑹詫紝騫朵笖w鐨勪袱涓瓙鑺傜偣宸︾孩鍙抽粦銆傝繖鏃舵垜浠妸w涓?span lang=EN-US>w->lchild鐨勯鑹蹭簰鎹紝鐒跺悗鍋?span lang=EN-US>Right-Rotate(w)銆傛濊冧竴涓嬶紝榪欐牱鍋氫箣鍚庝笉浼氱牬鍧忕孩榛戞爲鐨勬ц川銆傝繖鏃?span lang=EN-US>x鐨勬柊鐨勫厔寮熷氨鏄師w->lchild銆?span style="COLOR: red">鑰?span lang=EN-US>Case 3琚漿鍖栨垚浜?span lang=EN-US>Case 4銆?/span>
Case 4. w鏄粦鑹詫紝騫朵笖w鐨勫彸瀛愯妭鐐規(guī)槸綰㈣壊銆備竴浣嗛亣鍒?span lang=EN-US>Case 4錛屽氨鑳滃埄鍦ㄦ湜浜嗐傛垜鐪嬩笅闈竴寮犲浘銆傚厛鎶?span lang=EN-US>w涓?span lang=EN-US>x->parent鐨勯鑹蹭簰鎹紝鍐嶅仛Left-Rotate(x->parent)銆傝繖鏃跺浘涓妭鐐?span lang=EN-US>E錛堜篃灝辨槸鍘?span lang=EN-US>w->rchild錛夋墍鍦ㄧ殑璺緞灝辮偗瀹氬皯浜嗕竴涓粦鑹詫紝鑰?span lang=EN-US>x鎵鍦ㄧ殑璺緞鍒欏浜嗕竴涓粦鑹層傞偅涔堟垜浠氨鎶?span lang=EN-US>x涓婂浣欑殑1涓崟浣嶇殑榛戣壊涓㈢粰E灝卞彲浠ヤ簡銆傝嚦姝わ紝Delete-Fixup灝遍『鍒╁畬鎴愪簡銆?span lang=EN-US>
娉細閫氳繃娉?span lang=EN-US>1鎴戜滑鍙互鐪嬪嚭闂鍦?span lang=EN-US>Case4鍚庡凡緇忚В鍐充簡銆?span lang=EN-US>
void delFixup(RBTNode* delNode) {
RBTNode* p = delNode;
while (p != m_root && p->color == BLACK) {
if (p == p->parent->lchild) {//宸﹁竟鎯呭喌錛屼互涓嬫槸鍥涚涓嶅悓鐨?/span>Case
RBTNode* sibling = p->parent->rchild;
if (sibling->color == RED) {
sibling->color = BLACK;
p->parent->color = RED;
leftRotate(p->parent);
sibling = p->parent->rchild;
}
if (sibling->lchild->color == BLACK
&& sibling->rchild->color == BLACK
) {
sibling->color = RED;
p = p->parent;
}
else {
if (sibling->rchild->color == BLACK) {
sibling->lchild->color = BLACK;
sibling->color = RED;
rightRotate(sibling);
sibling = sibling->parent;
}
sibling->color = sibling->parent->color;
sibling->parent->color = BLACK;
sibling->rchild->color = BLACK;
leftRotate(sibling->parent);
p = m_root;
}
}
else {//鍙寵竟鎯呭喌
RBTNode* sibling = p->parent->lchild;
if (sibling->color == RED) {
sibling->color = BLACK;
p->parent->color = RED;
rightRotate(p->parent);
sibling = p->parent->lchild;
}
if (sibling->lchild->color == BLACK
&& sibling->rchild->color == BLACK
) {
sibling->color = RED;
p = p->parent;
}
else {
if (sibling->lchild->color == BLACK) {
sibling->rchild->color = BLACK;
sibling->color = RED;
leftRotate(sibling);
sibling = sibling->parent;
}
sibling->color = sibling->parent->color;
sibling->parent->color = BLACK;
sibling->lchild->color = BLACK;
rightRotate(sibling->parent);
p = m_root;
}
}
}
p->color = BLACK;
}
By 鍒樻湭楣?span lang=EN-US>(pongba)
C++鐨勭綏嫻(http://blog.csdn.net/pongba)
TopLanguage(http://groups.google.com/group/pongba)
鐩綍
0. 鍓嶈█
1. 鐚滄暟瀛?span lang=EN-US>
2. 縐扮悆
3. 鎺掑簭
3.1 涓轟粈涔堝爢鎺掓瘮蹇帓鎱?span lang=EN-US>
3.2 涓轟粈涔堝揩鎺掑叾瀹炰篃涓嶆槸閭d箞蹇?span lang=EN-US>
3.3 鍩烘帓鍙堜負浠涔堥偅涔堝揩鍛?span lang=EN-US>
4. 淇℃伅璁猴紒淇℃伅璁猴紵
5. 灝忕粨
0. 鍓嶈█
鐭ラ亾榪欎釜鐞嗚鏄湪TopLanguage涓婄殑涓嬈¤璁猴紝鍏堟槸g9杞簡David MacKay鐨勪竴綃囨枃绔?/span>錛岀劧鍚庡紩鍙戜簡鐗涗漢浠殑涓鍦哄叧浜庝俊鎭鐨勮璁?/font>銆?span lang=EN-US>Anyway錛屾濡?span lang=EN-US>g9寰堜箙浠ュ墠鍦?span lang=EN-US>Blog閲岄潰鎵璇?/font>鐨勶細
鏈夋椂鏃犵煡鏄銆備亢鐪嬪埌涓鐐規(guī)柊椴滅殑縐戞櫘涔熻兘瑙夊緱閫犲寲紲炲銆傚垰鎵嶈Gerald Jay Sussman錛?span lang=EN-US>SICP浣滆咃級鐨勬枃绔狅紝Building Robust Systems – an essay錛岀珶鐒跺績濡傚皬楣夸貢鎾烇紝鎵嬪績婀挎鼎錛屼豢浣?jīng)绗竴嬈℃彙浣忓垵鎭嬫儏浜烘俯鏌旂殑鎵嬨?span lang=EN-US>
鑰岀湅鍒?span lang=EN-US>MacKay鐨勮繖綃囨枃绔犳垜涔熸湁榪欑鎰熻鈥斺?/span>浠ュ墠妯$硦鐨勪笢瑗垮拷鐒舵湁浜嗘繁鍒葷殑瑙i噴錛屼竴鍒囬】鏃跺彉寰楁槑鐧芥棤姣斻傚師鏉ョ湅闂鐨勮搴︽垨灞傞潰鑳藉甯︽潵榪欎箞澶х殑鍙樺寲銆傚啀涓嬈″嵃璇佷簡瓚婃槸娣卞埢鐨勫師鐞嗗線寰瓚婃槸綆鍗曞拰寮哄ぇ銆傛墍浠ヨ錛屽湡槌栦篃鏈夊湡槌栫殑騫哥:P
榪欑瘒鏂囩珷鐩稿綋浜?span lang=EN-US>MacKay鍘熸枃鐨勭櫧璇濇枃鐗堛?span lang=EN-US>MacKay鍦ㄥ師鏂囦腑鐢ㄥ埌浜嗕俊鎭鐨勭煡璇嗭紝鍚庤呭湪鎴戠湅鏉ュ茍涓嶆槸蹇呴』鐨勶紝灝界璁$畻鐨勬椂鍊欐柟渚匡紝浣嗕笌鏈川鏃犲叧銆傛墍浠ユ垜鐢ㄥぇ鐧借瘽瑙i噴浜嗕竴閫氥?
1. 鐚滄暟瀛?
鎴戜滑鍏堟潵鐜╀竴涓寽鏁板瓧娓告垙錛氭垜蹇冮噷榛樺康涓涓?span lang=EN-US>1~64涔嬮棿鐨勬暟錛屼綘鏉ョ寽錛堜綘鍙兘闂瓟妗堟槸“鏄?span lang=EN-US>”鎴?span lang=EN-US>“鍚?span lang=EN-US>”鐨勯棶棰橈級銆備負浜嗕繚璇佷笉璁哄湪浠涔堟儏鍐典笅閮借兘浠ュ敖閲忓皯鐨勬鏁扮寽涓紝浣犲簲璇ラ噰鍙栦粈涔堢瓥鐣ュ憿錛熷緢鏄劇劧錛屼簩鍒嗐傚厛鏄寽鏄笉鏄綅浜?span lang=EN-US>1~32涔嬮棿錛屾帓闄ゆ帀涓鍗婂彲鑳芥э紝鐒跺悗瀵瑰尯闂寸戶緇簩鍒嗐傝繖縐嶇瓥鐣ヨ兘澶熶繚璇佹棤璁烘暟瀛楁庝箞璺熶綘鎹夎糠钘忥紝閮借兘鍦?span lang=EN-US>log_2{n}嬈′互鍐呯寽涓傜敤綆楁硶鐨勬湳璇潵璇村氨鏄畠鐨勪笅鐣屾槸鏈濂界殑銆?
鎴戜滑鍐嶆潵鍥為【涓涓嬭繖涓父鎴忔墍钑村惈鐨勬湰璐細涓轟粈涔堣繖縐嶇瓥鐣ュ叿鏈夋渶浼樹笅鐣岋紵絳旀涔熷緢綆鍗曪紝榪欎釜絳栫暐鏄鉤琛$殑銆傚弽涔嬪鏋滅瓥鐣ヤ笉鏄鉤琛$殑錛屾瘮濡傞棶鏄笉鏄湪1~10涔嬮棿錛岄偅涔堜竴鏃﹀彂鐜頒笉鏄湪1~10涔嬮棿鐨勮瘽灝變細鍓╀笅姣?span lang=EN-US>N/2鏇村鐨勫彲鑳芥ч渶瑕佸幓鑰冨療浜嗐?
寰愬鍦ㄨ璁轟腑鎻愬埌錛岃繖縐嶇瓥鐣ョ殑鏈川鍙互姒傛嫭鎴?span lang=EN-US>“璁╂湭鐭ヤ笘鐣屾棤鏈哄彲涔?span lang=EN-US>”銆傚畠鏄病鏈?span lang=EN-US>“寮辯偣鐨?span lang=EN-US>”錛岀瓟妗堢殑浠諱綍涓涓垎鏀兘鏄瓑姒傜巼鐨勩傚弽涔嬶紝涓鏃︽煇涓垎鏀暣鍚殑鍙兘鎬ф洿澶氾紝褰撴儏鍐佃惤鍒伴偅涓垎鏀笂鐨勬椂鍊欎綘灝遍儊闂蜂簡銆傛瘮濡傜寽鏁板瓧娓告垙鏈緋熺硶鐨勭瓥鐣ュ氨鏄竴涓竴涓殑鐚滐細鏄?span lang=EN-US>1鍚楋紵鏄?span lang=EN-US>2鍚楋紵... 鍥犱負榪欑鐚滄硶鏈宸殑鎯呭喌涓嬮渶瑕?span lang=EN-US>64嬈℃墠鑳界寽瀵癸紝涓嬬晫闈炲父緋熺硶銆備簩鍒嗘悳绱負浠涔堝ソ錛屽氨鏄洜涓哄畠姣忔閮藉皢鍙兘鎬ф帓闄や竴鍗婂茍涓旀棤璁哄浣曢兘鑳芥帓闄や竴鍗婏紙瀹冩槸鏈緋熸儏鍐典笅琛ㄧ幇鏈濂界殑錛夈?
2. 縐扮悆
12涓皬鐞冿紝鍏朵腑鏈変竴涓槸鍧忕悆銆傛湁涓鏋跺ぉ騫熾傞渶瑕佷綘鐢ㄦ渶灝戠殑縐版鏁版潵紜畾鍝釜灝忕悆鏄潖鐨勫茍涓斿畠鍒板簳鏄交榪樻槸閲嶃?
榪欎釜闂鏄竴閬撴祦浼犲凡涔呯殑鏅哄姏棰樸傜綉緇滀笂涔熸湁寰堝璁茶В錛岃繕鏈夋硾鍖栧埌N涓悆鐨勬儏鍐典笅鐨勪弗鏍艱瘉鏄庛備篃鏈夐浂鏄熺殑涓浜涘湴鏂規(guī)彁鍒頒粠淇℃伅璁虹殑瑙掑害鏉ョ湅寰呮渶浼樿В娉曘傛湰鏉ユ垜涓鐩磋涓鴻繖閬撻鐩櫎浜嗚瘯閿欎箣澶栨病鏈夊叾瀹冮珮濡欑殑鎬濊礬浜嗭紝鍙兘涓涓釜鏂規(guī)硶璇曪紝騫跺敖閲忎粠緇撴灉涓鎵句俊鎭紝鐒跺悗鐪嬬湅鍝鏂規(guī)鏈灝戙?
鐒惰岋紝瀹為檯涓婂畠鐨勭‘鏈夊叾瀹冪殑鎬濊礬錛屼竴涓洿鏈川鐨勬濊礬錛岃屼笖鏍規(guī)湰鐢ㄤ笉鐫淇℃伅璁鴻繖涔堟嫍鍙g殑鐭ヨ瘑銆?
鎴戜滑鍏堝洖欏句竴涓嬬寽鏁板瓧娓告垙銆備負浜嗕繚璇佷換浣曟儏鍐典笅浠ユ渶灝戞鏁扮寽涓紝鎴戜滑鐨勭瓥鐣ユ槸姣忔閮芥帓闄ゆ伆濂戒竴鍗婄殑鍙兘鎬с傜被姣斿埌縐扮悆闂涓婏細鍧忕悆鍙兘鏄?span lang=EN-US>12涓悆涓殑浠繪剰涓涓紝榪欏氨鏄?span lang=EN-US>12縐嶅彲鑳芥э紱鑰屽叾涓瘡縐嶅彲鑳芥т笅鍧忕悆鍙兘杞諱篃鍙兘閲嶃備簬鏄?span lang=EN-US>“鍧忕悆鏄摢涓悆錛屾槸杞繪槸閲?span lang=EN-US>”榪欎釜闂鐨勭瓟妗堝氨鏈?span lang=EN-US>12×2=24縐嶅彲鑳芥с傜幇鍦ㄦ垜浠敤澶╁鉤鏉ョО鐞冿紝灝辯瓑鍚屼簬瀵硅繖24縐嶅彲鑳芥у彂闂紝鐢變簬澶╁鉤鐨勮緭鍑虹粨鏋滄湁涓夌“騫寵 銆佸乏鍊俱佸彸鍊?span lang=EN-US>”錛岃繖灝辯浉褰撲簬鎴戜滑鐨勯棶棰樻湁涓変釜絳旀錛屽嵆鍙互灝嗘墍鏈夌殑鍙兘鎬у垏鎴愪笁浠斤紝鏍規(guī)嵁鐚滄暟瀛楁父鎴忕殑鍚彂錛屾垜浠簲褰撳敖閲忚榪欎笁涓垎鏀鐜囧潎絳夛紝鍗沖鉤鍧囧垏鍒嗘墍鏈夌殑鍙兘鎬т負涓夌瓑浠姐傚姝や竴鏉ョ殑璇濅竴嬈$О閲忓氨鍙互灝嗙瓟妗堢殑鍙兘鎬х緝鍑忎負鍘熸潵鐨?span lang=EN-US>1/3錛屼笁嬈″氨鑳界緝鍑忎負1/27銆傝屾誨叡鎵嶆湁24縐嶅彲鑳芥э紝鎵浠ョ悊璁轟笂鏄畬鍏ㄥ彲浠?span lang=EN-US>3嬈$О鍑烘潵鐨勩?
濡備綍縐扮殑鎸囧鍘熷垯鏈変簡錛屾瀯閫犱竴涓О鐨勭瓥鐣ュ氨涓嶆槸浠涔堝お鍥伴毦鐨勪簨鎯呬簡銆傞鍏堜笉濡ㄨВ閲婁竴涓嬩負浠涔堟渶鐩磋鐨勭О娉曚笉鏄渶浼樼殑鈥斺?銆?span lang=EN-US>6縐幫細鍦?span lang=EN-US>6銆?span lang=EN-US>6縐扮殑鏃跺欙紝澶╁鉤騫寵 鐨勫彲鑳芥ф槸0銆傚垰鎵嶈浜嗭紝鏈浼樼瓥鐣ュ簲璇ヤ嬌寰楀ぉ騫充笁縐嶇姸鎬佺殑姒傜巼鍧囩瓑錛岃繖鏍鋒墠鑳戒笁絳夊垎絳旀鐨勬墍鏈夊彲鑳芥с?
涓轟簡鏇存竻妤氱殑鐪嬪緟榪欎釜闂錛屾垜浠笉濡ㄥ亣璁炬湁6涓悆錛屾潵鑰冭檻涓涓?span lang=EN-US>3銆?span lang=EN-US>3縐板拰2銆?span lang=EN-US>2縐扮殑鍖哄埆錛?
鍦ㄦ湭縐頒箣鍓嶏紝涓鍏辨湁12縐嶅彲鑳芥э細1杞匯?span lang=EN-US>1閲嶃?span lang=EN-US>2杞匯?span lang=EN-US>2閲嶃?span lang=EN-US>...銆?span lang=EN-US>6杞匯?span lang=EN-US>6閲嶃傜幇鍦ㄥ皢1銆?span lang=EN-US>2銆?span lang=EN-US>3鍙鋒斁鍦ㄥ乏杈癸紝4銆?span lang=EN-US>5銆?span lang=EN-US>6鏀懼湪鍙寵竟3銆?span lang=EN-US>3縐頒簡涔嬪悗錛屼笉澶變竴鑸у亣璁懼ぉ騫沖乏鍊撅紝閭d箞灝忕悆鐨勫彲鑳芥у氨鍙樻垚浜嗗師鏉ョ殑涓鍗婏紙6縐嶏級錛?span lang=EN-US>1閲嶃?span lang=EN-US>2閲嶃?span lang=EN-US>3閲嶃?span lang=EN-US>4杞匯?span lang=EN-US>5杞匯?span lang=EN-US>6杞匯傚嵆榪欑縐版硶鑳芥帓闄や竴鍗婂彲鑳芥с?
鐜板湪鍐嶆潵鐪?span lang=EN-US>2銆?span lang=EN-US>2縐版硶錛屽嵆1銆?span lang=EN-US>2鏀懼乏杈癸紝3銆?span lang=EN-US>4鏀懼彸杈癸紝鍓╀笅鐨?span lang=EN-US>5銆?span lang=EN-US>6涓嶇О錛屾斁涓杈廣傚亣璁劇粨鏋滄槸澶╁鉤騫寵 錛岄偅涔堝彲鑳芥у墿涓?span lang=EN-US>鈥斺?縐嶏細5閲嶃?span lang=EN-US>5杞匯?span lang=EN-US>6閲嶃?span lang=EN-US>6杞匯傚亣璁懼ぉ騫沖乏鍊撅紝鍙兘鎬т篃鍓╀笅4縐嶏細1閲嶃?span lang=EN-US>2閲嶃?span lang=EN-US>3杞匯?span lang=EN-US>4杞匯傚彸鍊懼拰宸﹀劇殑鎯呭喌綾諱技銆傛諱箣錛岃繖縐嶇О娉曪紝涓嶇澶╁鉤緇撴灉濡備綍錛屾儏鍐甸兘琚垜浠緝?yōu)畯鍒颁簡鍘熸潵鐨勪笁鍒嗕箣涓錛佹垜浠厖鍒嗗埄鐢ㄤ簡“澶╁鉤鐨勭粨鏋滅姸鎬佸彲鑳芥湁涓夌”榪欎釜鏉′歡鏉ヤ笁絳夊垎鎵鏈夊彲鑳芥э紝鑰屼笉鏄簩絳夊垎銆?
璇村埌榪欓噷錛屽墿涓嬬殑浜嬫儏灝卞疄鍦ㄥ緢綆鍗曚簡錛氱浜屾縐版硶錛屽彧瑕佽鐫榪欐牱涓涓寚瀵兼濇兂鈥斺?/span>浣犻夋嫨鐨勭О娉曞繀欏諱嬌寰楀綋澶╁鉤騫寵 鐨勬椂鍊欑瓟妗堝墿涓嬬殑鍙兘鎬у拰澶╁鉤宸﹀撅紙鍙沖撅級鐨勬椂鍊欑瓟妗堝墿涓嬬殑鍙兘鎬т竴鏍峰銆傚疄闄呬笂錛岃繖絳夊悓浜庝綘寰楅夋嫨涓縐嶇О娉曪紝浣垮緱澶╁鉤杈撳嚭涓夌緇撴灉鐨勬鐜囨槸鍧囩瓑鐨勶紝鍥犱負澶╁鉤杈撳嚭鏌愪釜緇撴灉鐨勬鐜囧氨絳夊悓浜庢墍鏈夋敮鎸佽繖涓粨鏋滐紙宸﹀俱佸彸鍊俱佸鉤琛★級鐨勭瓟妗堝彲鑳芥х殑鍜岋紝騫朵笖絳旀鐨勬瘡涓彲鑳芥ч兘鏄瓑姒傜巼鐨勩?
MacKay鍦ㄤ粬鐨勪功銆?span lang=EN-US>Information Theory: Inference and Learning Algorithms銆嬶紙浣滆呭紑鏀懼厤璐圭數(shù)瀛愪功錛夐噷闈?span lang=EN-US>4.1鑺備笓闂ㄨ浜嗚繖涓О鐞冮棶棰橈紝榪樼敾浜嗕竴寮犱笉閿欑殑鍥撅紝鎴戝氨鐓ф妱浜嗭細
鍥句腑“1+”鏄寚“1鍙峰皬鐞冧負閲?span lang=EN-US>”榪欎竴鍙兘鎬с備竴寮濮嬩竴鍏辨湁24縐嶅彲鑳芥с?span lang=EN-US>4銆?span lang=EN-US>4縐頒簡涔嬪悗涓嶇鍝鎯呭喌錛堝垎鏀級錛屽墿涓嬫潵鐨勫彲鑳芥ф繪槸4縐嶃傝繖鏄竴涓畬緹庣殑涓夊垎銆傜劧鍚庡姣忎釜鍒嗘敮鏋勯犵浜屾縐版硶錛岃繖閲屼綘鍙紼嶅姞婕旂畻灝卞彲浠ュ彂鐜幫紝鍒嗘敮1涓婄殑絎簩嬈$О娉曪紝鍗?span lang=EN-US>“1銆?span lang=EN-US>2銆?span lang=EN-US>6瀵?span lang=EN-US>3銆?span lang=EN-US>4銆?span lang=EN-US>5”榪欑縐版硶錛屽ぉ騫寵緭鍑轟笁縐嶇粨鏋滅殑鍙兘鎬ф槸鍧囩瓑鐨勶紙涓ユ牸鏉ヨ鏄嚑涔庡潎絳夛級銆傝繖灝辨槸涓轟粈涔堣繖涓О娉曡兘澶熷湪鏈鍧忕殑鎯呭喌涓嬩篃鑳借〃鐜版渶濂界殑鍘熷洜錛屾病鏈夊摢涓垎鏀槸瀹冪殑寮辯偣錛屽畠蹇呯劧鑳藉皢鎯呭喌緙╁皬鍒板師鏉ョ殑1/3銆?
3. 鎺掑簭
鐢ㄥ墠闈㈢殑鐪嬮棶棰樿瑙掞紝鎺掑簭鐨勬湰璐ㄥ彲浠ヨ繖鏍鋒潵琛ㄨ堪錛氫竴緇勬湭鎺掑簭鐨?span lang=EN-US>N涓暟瀛楋紝瀹冧滑涓鍏辨湁N!縐嶉噸鎺掞紝鍏朵腑鍙湁涓縐嶆帓鍒楁槸婊¤凍棰樻剰鐨勶紙璀浠庡ぇ鍒板皬鎺掑垪錛夈傛崲鍙ヨ瘽璇達紝鎺掑簭闂鐨勫彲鑳芥т竴鍏辨湁N!縐嶃備換浣曞熀浜庢瘮杈冪殑鎺掑簭鐨勫熀鏈搷浣滃崟鍏冮兘鏄?span lang=EN-US>“姣旇緝a鍜?span lang=EN-US>b”錛岃繖灝辯浉褰撲簬鐚滄暟瀛楁父鎴忛噷闈㈢殑涓涓棶鍙ワ紝鏄劇劧榪欎釜闂彞鐨勭瓟妗堝彧鑳芥槸“鏄?span lang=EN-US>”鎴?span lang=EN-US>“鍚?span lang=EN-US>”錛屼竴涓彧鏈変袱縐嶈緭鍑虹殑闂鏈澶氬彧鑳藉皢鍙兘鎬х┖闂村垏鎴愪袱鍗婏紝鏍規(guī)嵁涓婇潰鐨勬濊礬錛屾渶浣?jīng)_垏娉曞氨鏄垏鎴?span lang=EN-US>1/2鍜?span lang=EN-US>1/2銆備篃灝辨槸璇達紝鎴戜滑甯屾湜鍦ㄦ瘮杈冧簡a鍜?span lang=EN-US>b鐨勫ぇ灝忓叧緋諱箣鍚庯紝濡傛灉鍙戠幇a<b鐨勮瘽鍓╀笅鐨勬帓鍒楀彲鑳芥у氨鍙樻垚N!/2錛屽鏋滃彂鐜?span lang=EN-US>a>b涔熸槸鍓╀笅N!/2縐嶅彲鑳芥с傜敱浜庡亣璁炬瘡縐嶆帓鍒楃殑姒傜巼鏄潎絳夌殑錛屾墍浠ヨ繖涔熷氨鎰忓懗鐫鏀寔a<b鐨勬帓鍒椾竴鍏辨湁N!/2涓紝鏀寔a>b鐨勪篃鏄?span lang=EN-US>N!/2涓紝鎹㈣█涔嬶紝a<b鐨勬鐜囩瓑浜?span lang=EN-US>a>b鐨勬鐜囥?
鎴戜滑甯屾湜姣忔鍦ㄦ瘮杈?span lang=EN-US>a鍜?span lang=EN-US>b鐨勬椂鍊欙紝a<b鍜?span lang=EN-US>a>b鐨勬鐜囨槸鍧囩瓑鐨勶紝榪欐牱鎴戜滑灝辮兘淇濊瘉鏃犺濡備綍閮借兘灝嗗彲鑳芥х緝?yōu)畯湄撳師鏉ョ殑涓鍗婁簡錛佹渶浼樹笅鐣屻?
涓涓洿鎺ョ殑鎺ㄨ鏄紝濡傛灉姣忔閮藉儚涓婇潰榪欐牱鐨勫畬緹庢瘮杈冿紝閭d箞N涓厓绱犵殑N!縐嶅彲鑳芥帓鍒楀彧闇瑕?span lang=EN-US>log_2{N!}灝辨帓鏌ョ帺浜嗭紝鑰?span lang=EN-US>log_2{N!}榪戜技浜?span lang=EN-US>NlogN銆傝繖姝f槸蹇帓鐨勫鏉傚害銆?
3.1 涓轟粈涔堝爢鎺掓瘮蹇帓鎱?
鍥為【涓涓嬪爢鎺掔殑榪囩▼錛?
1. 寤虹珛鏈澶у爢錛堝爢欏剁殑鍏冪礌澶т簬鍏朵袱涓効瀛愶紝涓や釜鍎垮瓙鍙堝垎鍒ぇ浜庡畠浠悇鑷笅灞炵殑涓や釜鍎垮瓙... 浠ユ綾繪帹錛?
2. 灝嗗爢欏剁殑鍏冪礌鍜屾渶鍚庝竴涓厓绱犲璋冿紙鐩稿綋浜庡皢鍫嗛《鍏冪礌錛堟渶澶у鹼級鎷胯蛋錛岀劧鍚庡皢鍫嗗簳鐨勯偅涓厓绱犺ˉ涓婂畠鐨勭┖緙猴級錛岀劧鍚庤閭f渶鍚庝竴涓厓绱犱粠欏朵笂寰涓嬫粦鍒版伆褰撶殑浣嶇疆錛堥噸鏂頒嬌鍫嗘渶澶у寲錛夈?
3. 閲嶅絎?span lang=EN-US>2姝ャ?
榪欓噷鐨勫叧閿棶棰樺氨鍦ㄤ簬絎?span lang=EN-US>2姝ワ紝鍫嗗簳鐨勫厓绱犺偗瀹氬緢灝忥紝灝嗗畠鎷垮埌鍫嗛《鍜屽師鏈睘浜庢渶澶у厓绱犵殑涓や釜瀛愯妭鐐規(guī)瘮杈冿紝瀹冩瘮瀹冧滑澶х殑鍙兘鎬ф槸寰箮鍏跺井鐨勩傚疄闄呬笂瀹冭偗瀹氬皬浜庡叾涓殑涓涓効瀛愩傝屽ぇ浜庡彟涓涓効瀛愮殑鍙兘鎬ч潪甯稿皬銆備簬鏄紝榪欎竴嬈℃瘮杈冪殑緇撴灉灝辨槸姒傜巼涓嶅潎絳夌殑錛屾牴鎹墠闈㈢殑鍒嗘瀽錛屾鐜囦笉鍧囩瓑鐨勬瘮杈冩槸涓嶆槑鏅虹殑錛屽洜涓哄畠騫朵笉鑳戒繚璇佸湪緋熺硶鎯呭喌涓嬩篃鑳藉皢闂鐨勫彲鑳芥у墛鍑忓埌鍘熸湰鐨?span lang=EN-US>1/2銆傚彲浠ユ兂鍍忎竴縐嶆瀬绔儏鍐碉紝濡傛灉a鑲畾灝忎簬b錛岄偅涔堟瘮杈?span lang=EN-US>a鍜?span lang=EN-US>b灝變細浠涔堜俊鎭篃寰椾笉鍒?span lang=EN-US>鈥斺?/span>鍘熸湰鍓╀笅澶氬皯鍙兘鎬ц繕鏄墿涓嬪灝戝彲鑳芥с?
鍦ㄥ爢鎺掗噷闈㈡湁澶ч噺榪欑榪戜箮鏃犳晥鐨勬瘮杈冿紝鍥犱負琚嬁鍒板爢欏剁殑閭d釜鍏冪礌鍑犱箮鑲畾鏄緢灝忕殑錛岃岄潬榪戝爢欏剁殑鍏冪礌鍙堝嚑涔庤偗瀹氭槸寰堝ぇ鐨勶紝灝嗕竴涓緢灝忕殑鏁板拰涓涓緢澶х殑鏁版瘮杈冿紝緇撴灉鍑犱箮鑲畾鏄?span lang=EN-US>“灝忎簬”鐨勶紝榪欏氨鎰忓懗鐫闂鐨勫彲鑳芥у彧琚帓闄ゆ帀浜嗗緢灝忎竴閮ㄥ垎銆?
榪欏氨鏄負浠涔堝爢鎺掓瘮杈冩參錛堝爢鎺掕櫧鐒跺拰蹇帓涓鏍峰鏉傚害閮芥槸O(NlogN)浣嗗爢鎺掑鏉傚害鐨勫父緋繪暟鏇村ぇ錛夈?
MacKay涔熸彁渚涗簡涓涓慨鏀圭増鐨勫爢鎺掞細姣忔涓嶆槸灝嗗爢搴曠殑鍏冪礌鎷垮埌涓婇潰鍘伙紝鑰屾槸鐩存帴姣旇緝鍫嗛《錛堟渶澶э級鍏冪礌鐨勪袱涓効瀛愶紝鍗抽夊嚭嬈″ぇ鐨勫厓绱犮傜敱浜庤繖涓や釜鍎垮瓙涔嬮棿鐨勫ぇ灝忓叧緋繪槸寰堜笉紜畾鐨勶紝涓よ呴兘寰堝ぇ錛岃涓嶅ソ鍝釜鏇村ぇ鍝釜鏇村皬錛屾墍浠ヨ繖嬈℃瘮杈冪殑涓や釜緇撴灉灝辨槸姒傜巼鍧囩瓑鐨勪簡銆傚叿浣撳弬鑰?span lang=EN-US>榪欓噷銆?
3.2 涓轟粈涔堝揩鎺掑叾瀹炰篃涓嶆槸閭d箞蹇?
鎴戜滑鑰冭檻蹇帓鐨勮繃紼嬶細闅忔満閫夋嫨涓涓厓绱犲仛“杞村厓绱?span lang=EN-US>”錛屽皢鎵鏈夊ぇ浜庤醬鍏冪礌鐨勭Щ鍒板乏杈癸紝鍏朵綑縐誨埌鍙寵竟銆傛牴鎹繖涓繃紼嬶紝蹇帓鐨勭涓嬈℃瘮杈冨氨鏄皢涓涓厓绱犲拰杞村厓绱犳瘮杈冿紝榪欎釜鏃跺欐樉鑰屾槗瑙佺殑鏄紝“澶т簬”鍜?span lang=EN-US>“灝忎簬”鐨勫彲鑳芥у悇鍗犱竴鍗娿傝繖鏄竴嬈℃紓浜殑姣旇緝銆?
鐒惰岋紝蹇帓鐨勭浜屾姣旇緝?yōu)兏嶉偅涔堥珮鏄庝簡锛氭垜浠笉濡ㄤ护栳u鍏冪礌涓?span lang=EN-US>pivot錛岀涓嬈℃瘮杈冪粨鏋滄槸a1<pivot錛岄偅涔堝彲浠ヨ瘉鏄庣浜屾姣旇緝a2涔熷皬浜?span lang=EN-US>pivot鐨勫彲鑳芥ф槸2/3錛佽繖瀹規(guī)槗璇佹槑錛氬鏋?span lang=EN-US>a2>pivot鐨勮瘽錛岄偅涔?span lang=EN-US>a1錛?span lang=EN-US>a2錛?span lang=EN-US>pivot榪欎笁涓厓绱犱箣闂寸殑鍏崇郴灝卞畬鍏ㄧ‘瀹氫簡鈥斺攁1<pivot<a2錛屽墿涓嬫潵鐨勫厓绱犳帓鍒楃殑鍙兘鎬ф垜浠笉濡ㄨ涓?span lang=EN-US>P錛堜笉闇瑕佸叿浣撶畻鍑烘潵錛夈傝屽鏋?span lang=EN-US>a2<pivot鍛紵閭d箞a1鍜?span lang=EN-US>a2鐨勫叧緋誨氨浠嶇劧鏄笉紜畾鐨勶紝涔熷氨鏄錛岃繖涓垎鏀噷闈㈠惈鏈変袱縐嶆儏鍐碉細a1<a2<pivot錛屼互鍙?span lang=EN-US>a2<a1<pivot銆傚浜庡叾涓換涓縐嶆儏鍐碉紝鍓╀笅鐨勫厓绱犳帓鍒楃殑鍙兘鎬ч兘鏄?span lang=EN-US>P錛屼簬鏄繖涓垎鏀噷闈㈠墿涓嬬殑鎺掑垪鍙兘鎬у氨鏄?span lang=EN-US>2P銆傛墍浠ュ綋a2<pivot鐨勬椂鍊欙紝榪樺墿涓?span lang=EN-US>2/3鐨?nbsp; 鍙兘鎬ч渶瑕佹帓鏌ャ?
鍐嶈繘涓姝ワ紝濡傛灉絎簩姝ユ瘮杈冩灉鐪熷彂鐜?span lang=EN-US>a2<pivot鐨勮瘽錛岀涓夋姣旇緝?yōu)鏇翠笉濡欎簡锛屾ā浠夸笂闈㈢殑鎺ㄧ悊锛?span lang=EN-US>a3<pivot鐨勬鐜囧皢浼氭槸3/4錛?
榪欏氨鏄揩鎺掍篃涓嶉偅涔堝揩鐨勫師鍥狅紝鍥犱負瀹冧篃娌℃湁鍋氬埌姣忔姣旇緝閮借兘灝嗗墿涓嬬殑鍙兘鎬х爫鎺変竴鍗娿?
3.3 楦℃帓涓轟粈涔堝張閭d箞蹇憿錛?
浼犵粺鐨勮В閲婃槸錛?span lang=EN-US>鍩烘帓涓嶆槸鍩轟簬姣旇緝鐨勶紝鎵浠ヤ笉鍏鋒湁鍚庤呯殑灞闄愭с傝瘽鏄病閿欙紝浣嗗叾瀹炶繕鍙互灝嗗畠鍜屽熀浜庢瘮杈冪殑鎺掑簭鍋氫竴涓被姣斻?
鍩烘帓鐨勮繃紼嬩篃璁告槸婧愪簬鎴戜滑鐞嗛『涓鍓墝鐨勮繃紼嬶細濡傛灉浣犳湁N錛?span lang=EN-US>N<=13錛夊紶鐗岋紝涔卞簭錛屽浣曠悊欏哄憿錛熸垜浠亣璞℃涓婃湁鍗佷笁涓綅緗紝鐒跺悗鎴戜滑灝嗘墜閲岀殑鐗屼竴寮犱竴寮犳斁鍑哄幓錛屽鏋滄槸3錛屽氨鏀懼湪浣嶇疆3涓婏紝濡傛灉鏄?span lang=EN-US>J錛屽氨鏀懼湪浣嶇疆11涓婏紝鏀懼畬浜嗕箣鍚庝粠浣嶇疆1鍒頒綅緗?span lang=EN-US>13鏀墮泦鎵鏈夌殑鐗岋紙娌℃湁鐗岀殑浣嶇疆涓婁笉鏀墮泦浠諱綍鐗岋級銆?
鎴戜滑鍙互榪欐牱鏉ョ悊瑙e熀鎺掗珮鏁堢殑鏈川鍘熷洜錛氬亣璁懼墠i寮犵墝閮藉凡緇忔斁鍒頒簡瀹冧滑瀵瑰簲鐨勪綅緗笂錛岀i+1寮犵墝鏀懼嚭鍘葷殑鏃跺欙紝瀹為檯涓婂氨鐩稿綋浜?span lang=EN-US>“涓涓嬪瓙”灝辯‘绔嬩簡瀹冨拰鍓?span lang=EN-US>i寮犵墝鐨勫ぇ灝忓叧緋伙紝鐢?span lang=EN-US>O(1)鐨勬搷浣滃氨灝嗚繖寮犵墝姝g‘鍦版彃鍏ュ埌浜嗗墠i寮犵墝涓殑姝g‘浣嶇疆涓婏紝榪欎釜鏁堟灉灝辯浉褰撲簬鎻掑叆鎺掑簭鐨勭i杞師鏈渶瑕佹瘮杈?span lang=EN-US>O(i)嬈$殑錛岀幇鍦ㄥ彧闇瑕?span lang=EN-US>O(1)浜嗐?
浣嗘槸錛屼負浠涔堝熀鎺掕兘澶熻揪鍒拌繖涓晥鏋滃憿錛熶笂闈㈠彧鏄В閲婁簡榪囩▼錛岃В閲婁簡榪囩▼涓嶄唬琛ㄨВ閲婁簡鏈川銆?
褰?span lang=EN-US>i寮犵墝鏀懼埌浣嶄箣鍚庯紝鏀劇疆絎?span lang=EN-US>i+1寮犵墝鐨勬椂鍊欐湁澶氬皯縐嶅彲鑳芥э紵澶х害i+1縐嶏紝鍥犱負鍓?span lang=EN-US>i寮犵墝灝?span lang=EN-US>13涓綅緗垎鍓叉垚浜?span lang=EN-US>i+1涓尯闂?span lang=EN-US>鈥斺?/span>絎?span lang=EN-US>i+1寮犵墝鍙互钀藉湪浠繪剰涓涓尯闂淬傛墍浠ユ斁緗i+1寮犵墝灝卞ソ姣旀槸璇㈤棶榪欐牱涓涓棶棰橈細“榪欏紶鐗岃惤鍦ㄥ摢涓尯闂村憿錛?span lang=EN-US>”鑰岃繖涓棶棰樼殑絳旀鏈?span lang=EN-US>i+1縐嶅彲鑳芥э紵鎵浠ュ畠?yōu)灏嗗墿涓嬫潵鐨勫彲鑳芥у潎鍒嗘垚浜?span lang=EN-US>i+1浠斤紙鎹㈠彞璇濊錛岀爫鎺変簡i/i+1鐨勫彲鑳芥э紒錛夈傚啀鐪嬬湅鍩轟簬姣旇緝鐨勬帓搴忓惂錛氱敱浜庢瘡嬈℃瘮杈冨彧鏈変袱縐嶇粨鏋滐紝鎵浠ユ渶澶氬彧鑳藉皢鍓╀笅鐨勫彲鑳芥х爫鎺変竴鍗娿?
榪欏氨鏄負浠涔堝熀鎺掕蹇緱澶氥傝屾墍鏈夊熀浜庢瘮杈冪殑鎺掑簭閮介冭劚涓嶄簡NlogN鐨勫鍛姐?
4. 淇℃伅璁猴紒淇℃伅璁猴紵
鏈潵鍛紝MacKay鍐欓偅綃囨枃绔犳槸鎯崇敤淇℃伅璁烘潵瑙i噴涓轟粈涔堝爢鎺掓參錛屼互鍙婁負浠涔堝揩鎺掍篃鎱㈢殑銆?span lang=EN-US>MacKay鍦ㄤ粬鐨勬枃绔犱腑鐨勮В閲婃槸錛屽彧鏈夋彁鍑烘瘡縐嶇瓟妗堢殑姒傜巼閮藉潎絳夌殑闂錛屾墠鑳借幏寰楁渶澶т俊鎭噺銆傜劧鑰岋紝浠旂粏涓鎯籌紝鍏跺疄榪欓噷淇℃伅璁哄茍涓嶆槸鍥狅紝鑰屾槸鏋溿傝繖閲屼笉闇瑕佺敤淇℃伅璁哄氨瀹屽叏鑳藉瑙i噴錛岃屼笖鏇存槑鐧姐備俊鎭鍙槸瀵硅繖涓В閲婄殑涓涓艦寮忓寲銆傚綋鐒訛紝淇℃伅璁哄湪鍏跺畠鍦版柟榪樻槸鏈夊簲鐢ㄧ殑銆備絾榪欓噷鍏跺疄鐢ㄤ笉鐫淇℃伅璁鴻繖涔堥噸閲忕駭鐨勪笢瑗匡紙涔熻鍏蜂綋璁$畻涓浜涙暟鎹殑鏃跺欐槸闇瑕佺殑錛夛紝鑰屾槸鍙渶瑕佷竴縐嶇湅闂鐨勬湰璐ㄨ瑙掞細灝嗘帓搴忛棶棰樼湅鎴愬拰鐚滄暟瀛椾竴鏍鳳紝鏄氳繃闂棶棰樻潵緙╁皬/鎺掗櫎錛?span lang=EN-US>narrow down錛夌粨鏋滅殑鍙兘鎬у尯闂達紝榪欐牱涓鏉ワ紝灝變細鍙戠幇錛?span lang=EN-US>“鏈濂界殑闂”灝辨槸閭d簺鑳藉鍧囧垎鎵鏈夊彲鑳芥х殑闂錛屽洜涓洪偅鏍風(fēng)殑璇濅笉綆¢棶棰樼殑絳旀濡備綍錛岄兘鑳芥帓闄ゆ帀k-1/k錛?span lang=EN-US>k涓洪棶棰樼殑絳旀鏈夊灝戠杈撳嚭鈥斺?/span>鐚滄暟瀛楅噷闈㈡槸2錛岀О鐞冮噷闈㈡槸3錛夌鍙兘鎬э紝鑰屼笉鍧囪 鐨勯棶棰樻諱細鏈変竴涓垨涓浜涚瓟妗堝垎鏀帓闄ゆ帀鐨勫彲鑳芥ц灝忎簬k-1/k銆備簬鏄瓥鐣ョ殑涓嬬晫灝辮鎷栫瘡浜嗐?
5. 灝忕粨
榪欑殑紜槸“灝忕粨”錛屽洜涓轟袱鐐癸細
1. 榪欎釜闂鍙互鏈変俊鎭鐨勭悊璁鴻В閲婏紝鑰屼俊鎭鍒欐槸涓涓浉褰撳ぇ鐨勯鍩熶簡銆?span lang=EN-US>
2. 鏂囦腑鎻愬埌鐨勮繖縐嶇湅闂鐨勮瑙掗櫎浜嗙敤浜庢帓搴忋佺О鐞冿紝榪樿兘澶熻繍鐢ㄥ埌鍝簺闂涓婏紙姣斿鎼滅儲錛夈?span lang=EN-US>
Update(06/13/2008) : 寰愬鍦ㄨ璁轟腑緇х畫鎻愬埌錛?span lang=EN-US>
鍙﹀錛岃繖鍑犲ぉ鎴戦噸鏂版妸TAOCP 絎笁鍗?span lang=EN-US>(絎簩鐗?span lang=EN-US>)緲誨嚭鏉ョ湅浜嗙湅 Knuth 鎬庝箞璇磋繖涓棶棰樼殑, 鍙戠幇鐪熸槸鐗涘ぇ浜嗭細
鍏堣鎬ц兘錛?
pp148, section 5.2.3 璇達細
When N = 1000, the approximate average runiing time on MIX are 160000u for heapsort 130000u for shellsort 80000u for quicksort
榪欓噷, Knuth 鍚屽鍙戠幇涓鑸儏鍐典笅 heapsort 琛ㄧ幇寰堜笉濂?span lang=EN-US>. 浜庢槸錛屽湪涓嬫枃浠栧氨璇達紝涔犻18 (pp156, 闅懼害21)
(R.W.Floyd) During the selection phase of heapsort, the key K tends to be quite small, so that nearly all the comparisons in step H6 find K<K_j. Show how to modify the algorithm so that K is not compared with K_j in the main loop of the computation, thereby nearly cutting the average number of comparisons in half.
絳旀閲岄潰鐨勬柟娉曞拰DMK鐨勬柟娉曟槸涓鏍風(fēng)殑銆?span lang=EN-US>(鎴戣寰?span lang=EN-US>DMK鏄湅浜嗚繖涓鏂囨垨鑰?span lang=EN-US>TAoCP鐨?span lang=EN-US>) 榪欓噷璇?span lang=EN-US> by half錛屽氨姝eソ鍜屽揩鎺掑樊涓嶅浜嗐?
鍐嶈淇℃伅璁哄垎鏋愶細
鍦?span lang=EN-US>5.3.1 (pp181) 楂樼埛鐖峰氨璇?span lang=EN-US>, “鎺掑簭闂鍙互鐪嬫垚鏄竴涓爲涓婄殑楦熷効鎺掓帓绔欑殑闂. (榪樼壒鍦扮敾浜嗕竴媯墊爲), 涓嬩竴孌靛氨璇?span lang=EN-US>, 鍏跺疄榪欎釜涔熸湁絳変環(huán)璇存硶, 灝辨槸淇℃伅璁?span lang=EN-US>, 鎴戜滑浠庣О鐞冮棶棰樿璧?span lang=EN-US>...”
鐒跺悗鍚庨潰涓鐩磋淇℃伅璁哄拰鏈灝忔瘮杈冩帓搴?span lang=EN-US>...
楂樼埛鐖風(fēng)湡涓嶆劎鏄楂樼殑錛屽洤rz..
鎴戜釜浜鴻寰楃畻娉曢噷闈㈡瀬澶т竴閮ㄥ垎鍐呭鏄浣曟湁鏁堝湴榪涜鎼滅儲錛岃繖閲岀殑"鏈夋晥"鍙互鍒嗕負錛氶伩鍏嶄笉蹇呰鐨勮綆楋紙濡侫*瀵昏礬浠ュ強鎵鏈夌殑鍚彂寮忓壀鏋濓級錛岀紦瀛橀噸澶嶈綆楋紙濡傛墍鏈?shy;鐨勫姩鎬佽鍒掞級銆傚綋鐒訛紝鐭ラ亾榪欎簺璺熷叿浣撶殑璁捐鍑轟竴涓畻娉曡嚦灝戣繕鏈夊崄涓囧叓鍗冮噷錛屽彧鑳借鏈変簡榪欎釜澶т綋鐨勬濊礬錛屽氨鍙互浠庤繖涓や釜瑙掑害鍘誨瑙嗘墜澶寸殑闂錛屽線寰鏄細鏈夊惎鍙戞剰涔?shy;鐨勭艦浜嗐傚浣曢伩鍏嶄笉蹇呰鐨勮綆楋紵涔熸湁寰堝 rules of thumb 鍙互閬靛驚錛屽鍚彂寮忓壀鏋濋噷闈㈠氨瑕佹眰鍘昏璁′竴涓渶浼樹笅鐣岋紝鑰屾渶涓鑸殑鎬濊礬鍒欐槸浣垮姴鐬呯瀰闂閲岄潰鏈変粈涔堟潯浠舵槸娌℃湁鍒╃敤鐨勶紝榪欎簺鏉′歡緇勫悎璧鋒潵鍙互寰楀嚭浠涔堟ц川錛屼篃璁告煇涓ц川灝辮兘澶熻鍒╃敤鏉ュ噺鎺変竴澶у爢璁$畻錛岃嚦浜庡浣曚粠棰樼洰鏉′歡鎺ㄥ嚭鏈変環(huán)鍊肩殑鎬ц川錛屾湁涓や釜鍔炴硶錛屼竴鏄瘯閿欙紙鎯沖埌鐨勭粨璁洪兘緇欏啓鍑烘潵錛岄櫠鍝茶僵鍦?Solving Mathematical Problems 閲岄潰灝辨彁鍒拌繃榪欎釜鍔炴硶銆傦級錛涘彟涓涓柟鍚戝垯鏄剳琚嬮噷鎻g潃鎯寵瀹炵幇鐨勭洰鐨勫線鍙嶆柟鍚戝綊綰︺傚浣曠紦瀛橀噸澶嶈綆楋紵綆鍗曠殑鍔ㄦ佽鍒掗棶棰樺fibonacci鏁板垪璁$畻錛屽叾閲嶅璁$畻鏄潪甯告槑鏄劇殑錛岃綆楃殑榪囩▼鏈韓灝辨寚鏄庝簡鍝簺璁$畻鏄噸澶嶇殑錛圓n 欏圭殑璁$畻鏄噸澶嶇殑錛夆斺斿綋鐒訛紝姝e鏃╁墠閭撳悓瀛﹀彂鐨勪竴涓鐩?lt;https://groups.google.com/group/pongba/browse_frm/thread/2ca1f2bda0c8...>閲岄潰璇寸殑錛屽叾瀹瀎ibonacci鏁板垪璁$畻閲岄潰鐨勭嚎鎬у彉鎹㈡湰韜篃鏄湁閲嶅璁$畻鐨勨斺斿悗鑰呬究鏄洿闅愯斀鐨勯噸澶嶈綆椾簡錛屼竴涓?non-trivial 鐨勫姩鎬佽鍒掗棶棰樺線寰娑夊強鍒伴潪甯擱殣钄界殑閲嶅璁$畻錛屾垨鑰呮洿闅劇殑鏄紝浣犻亶鍘嗙粍鍚堢┖闂寸殑鏂瑰紡鍐沖畾浜嗕綘鎵鑳藉緙撳瓨鐨勯噸澶嶈綆楀埌搴曟湁澶氬皯錛屼篃璁告煇涓亶鍘嗘柟寮忎箣涓嬪氨娌℃湁鍔炴硶鍘?shy;緙撳瓨璁$畻銆傚綋鐒訛紝綆楁硶鐨勮寖鐣村叾瀹炴槸寰堝ぇ鐨勶紝綆楁硶鏄竴涓狝I-Complete 鐨勯棶棰橈紝鎵鏈夌殑 Problem-Solving 榪囩▼閮藉彲浠ュ彨鍋氱畻娉曘傚彧鏄湁寰堝瀹為檯褰撲腑鐨勭畻娉曚細鎺夊叆浠ヤ笂涓ょ被鑰屽凡銆?nbsp;
絎簩涓棶棰樻垜涓句竴涓緥瀛愶細涓嶅儚寰堝鐗涗漢鍦ㄩ珮涓拰鏈灝辯珵璧涘鐗屼竴鍫嗭紝鎴戠洿鍒板ぇ鍥涚殑鏃跺欒繕涓嶇煡閬撲粈涔堟槸鍔ㄦ佽鍒掞紝鍥犱負鏈鍥涘勾鎴戜竴鐩村彧瀵瑰簳灞傛妧鏈劅鍏磋叮錛屾渶鍠滄鐪?姣斿 Petzold 鐨勩婄紪鐮佺殑濂ョ銆嬪拰 Richter 鐨勩?NET 妗嗘灦紼嬪簭璁捐銆嬶紙浜嬪疄涓婅繖鏄垜鐪嬬殑絎竴鏈嫳鏂囧師鐗堜功錛夎繖綾諱功銆傜爺涓鐨勬椂鍊欑敱浜庢柟鍚戞槸鑷劧璇█澶勭悊錛岀湅鐨勭涓綃?paper 鏄?Rabiner 鐨? A Tutorial on Hidden Markov Models and Selected Applications in Speech
Recognition 銆侾aper 鐨勫唴瀹瑰掓槸瀹屽叏鑳藉鐞嗚В錛屼絾鏄悊瑙e叾瀹炲彧鏄涓姝ワ紝鎴戝彂鐜扮悊瑙d簡涔嬪悗寰堝揩灝卞繕鎺変簡錛岃繖灝辮鏄庣悊瑙e緱涓嶅娣卞埢銆傛瘮濡傞噷闈㈢殑 Viterbi 綆楁硶錛岃姳浜嗘椂闂村幓鐞嗚В錛屼絾鏄竴杞ご寰堝揩鍙堝繕鎺変簡銆備竴騫村悗鍥犱負鏈虹紭宸у悎錛屽綆楁硶鍙戠敓浜嗕竴孌電煭鏆傜殑鍏磋叮錛屽茍瀛︿範浜嗕竴浜涘熀紜鐨勭畻娉曪紝灝ゅ叾鏄畻娉曠殑鎬濇兂錛屽洜涓烘濇兂鏄湁絀?shy;鐨勶紝浣嗙畻娉曟槸鏃犵┓鐨勶紝灝ゅ叾鏄鐩槸鍋氫笉瀹岀殑銆備箣鍚庝竴孌墊椂闂達紝紕板閥鍙堥渶瑕佺炕涓緲婚┈鍙か妯″瀷錛屾悳鍑哄惔鍐涚殑鏁板涔嬬編浠ュ強閭g瘒 Paper 錛屽彂鐜?Viterbi 綆楁硶鍏跺疄灝辨槸鏈綆鍗曠殑涓綾誨姩鎬佽鍒掞紝鐢變簬瀵逛簬鍔ㄦ佽鍒掔殑鐞嗚В娣卞埢浜嗗緢澶氾紝鎵浠ュ浜?Viterbi 綆楁硶錛屽湪鑴戣閲岄潰璁頒綇鐨勪笉鍐嶆槸浠涔?Forward Variable/Backward Variable
涔嬬被鐨勬妧鏈粏鑺傦紝鑰屾槸瀹冪殑鏈川錛屼簬鏄究涓嶅啀瀹規(guī)槗蹇樻帀錛岃屽嵆渚垮繕鎺夛紝灝卞搴炲姞鑾辨墍璇達紝涔熷彲浠ラ潪甯歌繀閫熺殑灝嗙畻娉曠殑緇嗚妭鑷鏋勫緩鍑烘潵銆?
鍏跺疄鎴戠浉淇¤繖鏍風(fēng)殑渚嬪瓙鏄暟涓嶈儨鏁扮殑錛屾墍浠ユ垜榪欎釜鍙槸綆椾竴涓?Yet Another Example 錛岀敱浜庡鎴戞潵璇存瘮杈冪壒孌婏紝鎵浠ュ嵃璞¤緝涓烘繁鍒匯?
榪欎釜渚嬪瓙鏄叧浜?鐞嗚В"鐨勩傛湁鏃跺欑畻娉曚篃浼氶潪甯告湁鐢紝濡傛湁涓嬈″啓紼嬪簭鏃墮渶瑕佺敤鍒?LCS 鍜?Edit-Distance 錛堣繖鏍風(fēng)殑鏈轟細寰堝皯錛屼絾閬囧埌浜嗘椂濡傛灉涓嶇煡閬撴湁澶氶」寮忓鏉傚害鐨勭畻娉曞氨寰堟?zhèn)叉儴浜嗗Q夛紝鑰屽仛鏈哄櫒瀛︿範鍜屾暟鎹寲鎺樼殑鏇存槸灝戜笉浜嗕竴鍧ㄥ潹鐨勭畻娉曪紝濡傛灉鍏夋槸鐞嗚В鍒漢鐨勫仛娉曠劧鍚庡疄鐜?shy;鍑烘潵錛岄偅涔堝綆楁硶鐨勬濇兂鐨勬妸鎻℃湁鍔╀簬鐞嗚В鍜岃蹇嗭紱濡傛灉闇瑕佽嚜宸辮璁$畻娉曪紝閭e氨闇瑕佺畻娉曞熀紜鐭ヨ瘑鐨勮緟鍔╂墠琛屼簡銆傜粷澶у鏁頒漢搴旇灞炰簬鍓嶈呫?
瀛︿範鍒頒粈涔堢▼搴︼紵鎴戣寰楄浜虹兢鑰屽畾銆傚鏋滃仛搴曞眰寮鍙戙佸簲鐢ㄥ紑鍙戙佺郴緇熷紑鍙戯紝鍙鐭ラ亾涓涓ぇ姒傚氨鍙互浜嗭紝鐭ラ亾緇忓吀鐨勬暟鎹粨鏋勫拰綆楁硶娌℃湁浠諱綍鍥伴毦錛岃屼笖鍙嶆緇忓吀綆楁硶閮芥湁鐜版垚鐨勫簱鍙敤銆傚浜庢湁鍏磋叮鍋氫竴鐐?research 娌捐竟鐨勪簨鎯呯殑浜猴紝鍒欓渶瑕佷簡瑙h繖浜涚畻娉曡儗鍚庣殑涓鑸ф濊礬鏄粈涔堬紝鍚﹀垯鏉ヤ竴涓壒瀹氱殑綆楁硶浣犲氨鐗瑰畾鐨勭悊瑙h蹇嗕竴涓嬶紝鑲畾涓嶇墷闈狅紝鑰屼笖嫻垂澶ц剳璧勬簮銆傚浜庢悶 real deal 鐨?original research 鐨勯偅灝遍渶瑕佸箍娉涚殑鐭ヨ瘑縐瘡浜嗭紝鍏夌煡閬撲竴鑸ф濊礬閮戒笉澶熴?
鍙︿竴鏂歸潰錛屾垜瑙夊緱瀛﹀畬浜嗙粡鍏哥畻娉曪紝娣卞埢鐞嗚В浜嗙畻娉曡儗鍚庣殑涓鑸ф濊礬涔嬪悗錛屽鏋滃啀榪涗竴姝ュ幓鐜╅鐩紝鍋氶搴撱傛晥鐩婂嵈涓嶆槸寰堝ぇ鐨勶紝鍥犱負鍒紓ㄤ簡鏄鐢ㄧ殑錛岀帺棰樼洰鍋氶搴撳氨鏄繘涓姝ョ(鍒鑰屼笉鐢紙涓嶅幓瑙e喅瀹為檯闂錛岃兘澶熶駭鐢熷獎鍝嶅姏鐨勶紝鎴栫敓浜у姏鐨勯棶棰橈級銆傚疄闄呬笂鍋氫簡涓浜涢鐩箣鍚庡氨瀹屽叏娌″繀瑕佽繘涓姝ュ仛棰樼洰浜嗭紝鍥犱負鍋氭潵鍋氬幓錛屾嫾鐨勫熀鏈篃灝?shy;鏄皝鐨勭煡璇嗙Н绱錛堝璺錛夛紝璋佺殑鑰愬績澶э紙鑲嬌鍔插幓紓ㄤ竴閬撻鐩級錛涘疄闄呬笂璋佷篃涓嶆瘮璋佺錛屽埌鏈鍚庡尯鍒氨鍩烘湰涓婃樉闇插湪鐭ヨ瘑縐瘡鍜岃愬績涓婁簡銆傛墍浠ユ帴鐫鍋氾紝鍒涔熶笉浼氱(寰?shy;鏇撮攱鍒╋紝鏇翠綍鍐靛ぇ濂界殑鏃跺厜搴旇鍘誨仛鐐規(guī)湁鎰忎箟鐨勪簨鎯咃紙濡傛灉鏄負浜?fun 鑰屽仛棰樼殑錛岄偅涔堟湁鎰忎箟鐨勪簨鎯呭悓鏍蜂篃鍙互鏄?extremely fun錛夛紝姣斿鎴戣寰楁渶鍚稿紩浜轟篃鏈鏍規(guī)湰鐨勯棶棰樺氨鏄漢宸ユ櫤鑳介棶棰橈紙鎯蟲兂鐪嬶紝浜鴻剳鏄笘鐣屼笂榪勪粖涓烘鎵鐭ユ渶涓哄鏉傜殑緇撴瀯錛岃繖涓粨鏋勫叿澶囦簡璁よ瘑鑷劧鐣?瑙勫緥"鐨勮兘鍔涳紝鍏?shy;澶囦簡璁よ瘑"鑷垜"鐨勮兘鍔涳紝鍏峰浜嗗綊綰沖拰婕旂粠鎺ㄧ悊鐨勮兘鍔涳紝綾繪瘮鐨勮兘鍔涳紝鍏峰浜嗛毦浠ョ疆淇$殑鍚彂寮忔悳绱㈣兘鍔涳紝鍏峰瀹岀編鐨勬ā寮忚瘑鍒兘鍔涳紝鑰屾牴鎹繘鍖栬鐨勮鐐癸紝榪欐牱鐨勭粨鏋?shy;灞呯劧浠呬粎鏄氳繃鍙樺紓鈥斺旂瓫閫夊緱鏉ョ殑錛屽鏋滅湡鏈変笂甯濓紝閭d箞鍒╃敤涓婂笣璧嬩簣鎴戜滑鐨勫ぇ鑴戝幓鐮磋В涓婂笣榪欎釜欏剁駭鐗涢肩▼搴忓憳鍐欑殑紼嬪簭鈥斺斾漢鑴戠殑縐樺瘑錛岃繕鏈夋瘮榪欐洿甯﹀姴鍎跨殑浜嬫儏鍚?shy;錛燂級錛屾墍浠ユ垜瑙夊緱鏈夐偅涔堝ソ鐨勫熀紜鐨勭墰浜猴紝涓嶅幓鐩撮潰鐪熸 fundamental 鐨?problems 錛屽氨鍙儨浜嗭紝欏葷煡棰樼洰鏄案榪滃仛涓嶅畬鐨勶紝涓涓叕鐞嗙郴緇熺殑瀹氱悊涔熸槸姘歌繙鎺ㄥ涓嶅畬鐨勶紝姘歌繙鍙互璁捐鍑洪鐩潵緇欎綘鍋氾紝浣嗘槸鐪熸鐨勯棶棰樺叾瀹炲彧鏈変竴涓傚鏋滅┓涓句笉浜嗕笘鐣屼笂鎵鏈夌殑闂錛岃嚦灝戝彲浠ヤ婦鍑洪偅浜涙湁瓚c佹湁鎰忎箟鐨勯棶棰?)
--
鍒樻湭楣?pongba)
Blog|C++鐨勭綏嫻
http://blog.csdn.net/pongba