ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>
原文地å€åQ?a >http://blog.aulin.no/compiling-sphinx-110beta-on-windows
䏋颿˜¯å¼•导大家如何在windows上编译sphinx 1.10beta
1. 下è²sphinxæºç (http://sphinxsearch.com/downloads/sphinx-1.10-beta.tar.gz)
注:最新版本在åQ?a >http://sphinxsearch.com/downloads/archive/ ä¸?br />
2. å› äØ“sphinx使用到MySQL, LibExpat and LibIConv,å› æ¤åœ¨ç¼–译之å‰éœ€è¦é…¾|®è¿™äº›åº“åQ?br /> 下è²MySQL的开å‘环å¢?a >http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.52-win32.msi/from/http://mysql.borsen.dk/åQŒå®‰è£…å¼€å‘组ä»?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. 在shpinx.hä¸å¯ä»¥é…¾|®å’Œ¿U»é™¤sphinx需è¦çš„¾l„äšg,如å¯ä»¥ç§»é™¤å¯¹PostgreSQL 的支æŒ?/p>
4. 在visual studiao 08 䏿‰“å¼€ Sphinx08.sln
5. æ·ÕdŠ mysql çš„include路径(C:\Program Files (x86)\MySQL\MySQL Server 5.1\include) to all projects (å›_‡» - Properties - Configuration Properties - C/C++ - General - Additional Include Directories).
6. æ·ÕdŠ mysqlçš„lib路径(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. 在除了libsphinx的所有工½E‹ä¸åQŒæ·»åŠ LibExpatçš„èµ\å¾?C:\Program Files (x86)\Expat 2.0.1\Bin)(å›_‡» - Properties - Configuration Properties - Linker - General - Additional Library Directories)
8. 在除了libsphinx的所有工½E‹ä¸åQŒæ·»åŠ LibIConv çš„èµ\å¾?C:\Program Files (x86)\GnuWin32\lib)(å›_‡» - Properties - Configuration Properties - Linker - General - Additional Library Directories)
9. ¾~–译Build! (F6)
shuffle½Ž—法åQŒæˆ‘把他å«åš‹z—牌½Ž—法åQŒå®ƒçš„ç›®æ ‡æ£å¥½ä¸Žå„ç§çš„sort½Ž—法相ååQŒå³æŠŠä¸€ä¸ªæœ‰åº?æˆ–è€…æ— åº?的一¾pÕdˆ—å…ƒç´ æ‰“äØ•åQŒä»¥æ»¡èƒö需求ã€?br>
举个两例åï¼Œå¤§å®¶éƒ½çŸ¥é“æ‰‘克牌åQŒæˆ‘们毋ơ都需è¦åœ¨æ‘¸ç‰Œä¹‹å‰æŠŠç‰Œ‹z—掉åQŒç”¨æ¥è®©æ¯ä¸ªäººæ‘¸åˆ°æ¯å¼ 牌的概率尽é‡ç›¸½{‰ï¼Œå¢žåŠ æ¸¸æˆçš„éšæœºæ€§å’Œä¹è¶£åQ›è¿˜æœ‰éŸ³é¢‘æ’æ”‘Ö™¨åQŒæœ‰ä¸€äº›ähä¸å–œ‹Æ¢é¡ºåºæ’放,而喜‹Æ¢ä‹Éç”¨éšæœºæ’æ”?å…¶å®žéšæœºæ’æ”¾åˆ†äØ“ä¸¤ç§,randomå’ŒshuffleåQŒåŽæ–‡ä¼šä»‹ç»åˆ?åQŒæ¯”如iPod Shuffleçš„å–点之一ž®±æ˜¯“ä½ æ°¸˜qœä¸çŸ¥é“ä½ å°†è¦å¬åˆ°çš„ä¸‹ä¸€é¦–æŒæ›²æ˜¯ä»€ä¹?#8221;。至ž®‘ï¼Œå¦‚æžœè¦æ¨¡æ‹Ÿæ‰‘克牌游æˆåQŒæˆ–者åšéŸ³é¢‘æ’æ”¾å™¨ï¼Œéƒ½è¦ä½¿ç”¨shuffle½Ž—法åQŒè€ŒäºŒè€…çš„shuffle½Ž—æ³•å´æœ‰ä¸€äº›åŒºåˆ«ï¼Œä¸€ä¸ªæ˜¯ä¸€‹Æ¡æ€§çš„‹z—牌åQŒå¦ä¸€ä¸ªåˆ™æ˜¯æ¯‹Æ¡å–一首æŒã€‚那么怎么实现他们呢?
扑克牌的shuffle½Ž—法åQ?br>
下é¢ä¸ÞZº†æ–¹ä¾¿å’Œå®¹æ˜“读懂,我都用扑克牌æ¥ä½œä¾‹ååQšæ¡Œä¸Šæœ‰nå¼ ç‰ŒåQŒåƈ且对桌åä¸Šçš„ç‰Œè¿›è¡Œæ ‡åøP¼Œä»?直到n-1。我们的目的是洗˜q™äº›ç‰Œã€?br>
一个比较容易想到的æ–ÒŽ³•是,桌å上有nå¼ æ‰‘å…‹ç‰ŒåQŒæˆ‘½W¬i‹Æ¡ä»Žæ¡Œåä¸Šç‰æ¦‚çŽ‡éšæœºå–ä¸€å¼ æ‰‘å…‹ç‰ŒåQŒä½œä¸ºæ´—牌åŽç‰Œå †çš„第iå¼ æ‰‘å…‹ç‰ŒåQŒé‚£ä¹ˆè¿™ä¸ªç®—法实现è“væ¥åº”该是˜q™æ ·çš„:
伪代ç :
for i <- 0 to n - 1
do d <- Random mod (n - i)
shuffle[i] <- deck[d]
deck[d] <- deck[n - i]
å…¶ä¸åQŒdeck是洗牌å‰çš„åºåˆ?0~n-1)åQŒshuffle是洗牌åŽçš„åºåˆ?0~n-1)åQŒç¬¬i‹Æ?ä»?开始数)在剩下的n-iå¼ ç‰Œé‡Œç‰æ¦‚率的å–ä¸€å¼ ç‰ŒåQŒæŠŠå®ƒæ”¾åˆ°shuffle里。而deck[d] = deck[n - i]˜q™å¥è¾‘Öˆ°çš„æ•ˆæžœæ˜¯åˆ 除å–过的牌ã€?br>
˜q™ä¸ªæ–ÒŽ³•çš„æ—¶é—´å¤æ‚度是O(n)åQŒå·²¾lå¯ä»¥æŽ¥å—了åQŒä½†˜q™ä¸ªæ–ÒŽ³•˜q˜ä¸å¤Ÿå¥½åQŒå› 为我们需è¦ä¸¤ä¸ªé•¿åº¦äØ“n数组。其实å¯ä»¥å¾ˆå®ÒŽ˜“å¾—å¾—åˆîC¸‹é¢çš„æ–ÒŽ³•åQŒè§£å†³ç©ºé—´çš„问题åQ?br>伪代ç :
for i <- 0 to n - 1
do d <- Random mod (n - i)
swap(deck[d], deck[n - i])
˜q™æ ·åQŒè¿™ä¸ªç®—法的é“熞®±æœ‰äº›åƒé€‰æ‹©æŽ’åºäº†ï¼Œ½W¬i‹Æ?ä»?开始数)¼‹®å®š½W¬n-iä¸ªå…ƒç´ çš„åŽŸä½¾|®ï¼Œòq¶ä¸”交æ¢ä¸¤ä¸ªä½ç½®ä¸Šçš„å…ƒç´ ã€‚å®ƒçš„å¤æ‚读ä»ç„¶æ˜¯O(n)åQŒè€Œåªéœ€è¦?个é¢å¤–çš„½Iºé—´æ¥å‚¨å˜äº¤æ¢ç”¨çš„äÍæ—¶å˜é‡ã€?br>˜q™ä¸ªæ–ÒŽ³•å·²ç»æ˜¯ä¸€ä¸ªæ¯”较好的解å†Ïx–¹æ³•了(è‡ªå·±è®¤äØ“)åQŒå¦‚æžœä½ ˜q˜èƒ½å†™å‡ºæ›´å¥½çš„shuffle½Ž—法åQŒè¯·å‘Šè¯‰æˆ‘ã€?br>
我相信对‹z—牌˜q™ç§ä¸œè¥¿æœ‰äº†è§£çš„人都ä¸ä¼šç”¨è¿™æ ïLš„æ–ÒŽ³•æ¥æ´—牌:å¦å¤–å¯ÒŽ¯å¼ ç‰Œåšä¸€ä¸ªæ ‡è®ŽÍ¼ŒåÏx˜¯å¦æŠ½˜q‡è¿™å¼ 牌åQšç„¶åŽç¬¬i‹Æ¡åœ¨nå¼ ç‰Œé‡ŒéšæœºæŠ½ä¸€ä¸ªï¼Œå¦‚æžœ˜q™å¼ 牌曾¾l被抽过åQŒé‚£ä¹ˆæŠŠå®ƒæ”¾å›žåŽ»åQŒé‡å¤æŠ½å–ï¼Œç›´åˆ°æŠ½åˆ°ä¸€å¼ æ²¡è¢«æŠ½˜q‡çš„牌,ž®†è¿™å¼ ç‰Œæ ‡è®°ä¸ºæŠ½å–过的牌åQŒç„¶åŽåœ¨¾U怸Šçš„第iä¸ªåœ°æ–¹è®°ä¸‹è¿™å¼ ç‰Œã€‚åœ¨è®¡ç®—æœºé‡Œ˜q™æ ·å®žçްåQ?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]
看了æè¿°åQŒä½ 一定就会觉得这¿U方法实在是éé€äº†åQŒä¸ä»…éº»çƒ¦ï¼Œè€Œä¸”ä¼šæœ‰ä¸€ä¸ªé™·é˜±ï¼Œé‚£å°±æ˜¯åœ¨æŸæ¬¡å–ç‰Œçš„æ—¶å€™ï¼Œä¹Ÿè®¸ä¼šè¿æ°”差永远也å–ä¸åˆ°æ²¡æœ‰è¢«å–˜q‡çš„é‚£å¼ ç‰Œï¼Œå¯ÆD‡´½E‹åº˜q行的丼‹®å®šæ€§ã€‚然而,在åˆå¦è€…当ä¸ï¼Œå´æœ‰ä¸å°‘是用˜q™ç§æ–ÒŽ³•实现的shuffleçš„ã€‚ä¸ªäºø™®¤ä¸ºï¼Œåœ¨è®¾è®¡ç®—法的时候,‘Šç®€å•ã€è¶ŠæŽ¥è¿‘生活的模型,ž®Þp¶Šå®ÒŽ˜“设计出好的算法,而且½Ž—法的æ˜qîC¹Ÿæ›´æŽ¥˜q‘实际生‹z…R€‚å› æ¤ï¼Œè®¾è®¡½Ž—法的时候,如果能往òqÏx—¶ç”Ÿæ´»çš„æ–¹é¢æƒ³åQ?æ€ÀL˜¯äº‹åŠåŠŸå€çš„ã€?br>
附上我自己实现的一个类qsortçš„shuffle½Ž—法
// 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½Ž—法åQ?
å‰é¢è¯´è¿‡æ’æ”¾å™¨çš„éšæœºæ’放有两¿U,一¿Uå«Random,一¿Uå«Shuffle(我自å·Þq†è§£çš„......)åQŒä¸‹é¢è§£é‡Šè¿™ä¸¤ç§æ–ÒŽ³•çš„ä¸åŒã€?/p>
å¦è¿‡æ¦‚率的ähéƒ½è¯¥çŸ¥é“æœ‰æ”¾å›žçš„æŠ½å–的概å¿üc€‚è¢‹ä¸æœ‰n个ä¸åŒçš„ž®çƒåQŒæ¯‹Æ¡æŠ½å–一个å°çƒï¼Œç„¶åŽæ”‘Ö›žåQŒæ¯ä¸€‹Æ¡å–的时候概率都是相åŒçš„ã€‚è¿™æ£æ˜¯æ’放器random½Ž—法的原ç†ï¼Œ˜q™ç§½Ž—法实现èµäh¥å¾ˆç®€å•,一首挾l“æŸä»¥åŽåQŒåªéœ€è¦éšæœºé€‰å–下一首挞®Þp¡Œäº†ã€?br>但是˜q™æ ·åšæœ‰ä¸€äº›ç¼ºç‚¹ï¼š1åQŒæœ‰ä¸€å®šçš„æ¦‚率使得˜qžç®‹é€‰å–çš„ä¸¤é¦–æŒæ˜¯åŒä¸€é¦–æŒåQŒæˆ‘ç›æ€¿¡òq¶ä¸æ˜¯æ‰€æœ‰äh都希望在shuffle模å¼ä¸‹è¿ž¾lå¬åŒä¸€é¦–æŒå§ï¼Œå½“然也有解决办法åQŒé‚£ž®±æ˜¯å¢žåР层åó@环判æ–,如果选上åŒä¸€é¦–æŒåQŒåˆ™é‡æ–°é€‰ï¼Œè€Œè¿™æ ·åˆä¼šé‡íyˆé‚£ä¸ªå¾ˆçƒ‚çš„‹z—牌½Ž—法的覆辙ã€?åQŒå½“å¬å®Œä¸€é¦–æŒçš„æ—¶å€™ï¼Œè§‰å¾—˜q˜æƒ³å†å¬ä¸€é,怎么办?按下“上一é¦?#8221;åQŒä½ 会å‘现这时å¬åˆ°çš„æŒæ›²å·²ç»ä¸æ˜¯åˆšæ‰é‚£ä¸€é¦–æƒ³å¬æŒæ›²äº†åQŒå› 䏸™¿™¿U方法åªçŸ¥é“当å‰çš„状æ€ï¼Œè€Œä¸çŸ¥é“˜q‡åŽ»çš„æ’æ”„¡Š¶æ€ã€‚怎么办?一¿UåŠžæ³•æ˜¯å¢žåŠ ä¸€ä¸ªé˜Ÿåˆ—å«å?#8220;åˆšæ‰æ’放列表”åQŒæŠŠæ’放˜q‡çš„æŒæ›²æŒ‰ç…§™åºåºå‚¨å˜åœ¨åˆ—表里ã€?åQŒæœ‰ä¸€å®šæ¦‚率在很长的一ŒD‰|—¶é—´å†…åQŒæ’攑֙¨ä¸åœçš„在é‡å¤æ’æ”¾ä¸¤é¦–æŒæ›²Aå’ŒB或者类似情况,ž®±åƒ˜q™æ ·åQ?..-A-B-A-B-A-B-...。这¿Uæƒ…å†µä¹Ÿæ˜¯å¾ˆè®¨åŽŒçš„ï¼Œå¯æ˜¯å¦‚何é¿å…呢?我能惛_ˆ°çš„åŠžæ³•æ˜¯å¢žåŠ åˆ¤æ–åQŒçœ‹˜q™é¦–æŒæ˜¯ä¸æ˜¯åœ¨åˆ—表的最åŽå‡ ™åšw‡ŒåQŒå¦‚果在ž®×ƒ¸é€‰è¿™é¦?.....
但是˜q™äº›æ¦‚率都å°çš„坿€œï¼Œå¯¹äºŽä¸€ä¸ªæ’攑֙¨çš„random函数æ¥è¯´åQŒèƒ½å¤Ÿè€ƒè™‘åˆîC»¥ä¸Šçš„å‡ ç‚¹åQŒå·²¾l能够åšåˆ°èƒö够randomå’Œäh性化了。åªè¦èƒ½å¤Ÿåˆç†çš„é€‰æ‹©å‚æ•°åQŒè€ƒè™‘åˆîC¸€äº›ç‰¹ŒDŠæƒ…å†?比如æžå°çš„æ’æ”‘Öˆ—è¡?åQŒä»¥åŠè€ƒè™‘用户的心ç†ï¼Œž®Þpƒ½åšå‡ºä¸€ä¸ªæ¯”较好的random函数ã€?/p>
下é¢è®²æˆ‘è®¾è®¡çš„æ’æ”‘Ö™¨shuffle½Ž—法åQŒshuffle½Ž—法能够很大½E‹åº¦ä¸Šé¿å…random½Ž—æ³•çš„ç¼ºé™øP¼Œåœ¨ç©ºé—´æ—¶é—´ä¸Šéƒ½å¾ˆèŠ‚çº¦åQŒè€Œä¸”能够辑ֈ°æ¯”è¾ƒç†æƒ³çš„éšæœºåŒ–效果。它的大体æ€èµ\是这æ ïLš„åQ?/p>
我们使用一个éšå«çš„shuffleæ’æ”¾åˆ—表(一个åó@环队åˆ?æ¥å‚¨å˜æŒæ›²çš„™åºåºåQŒåƈ用一个指针表½Cºæ£åœ¨æ’攄¡š„æŒæ›²(è®îC½œ"^")åQŒæ¯”如当å‰çš„æ’æ”¾åˆ—è¡¨æ˜¯è¿™æ ïLš„åQ?/p>
ABCDEFGHIJKLMN
^
å³çŽ°åœ¨æœ‰14首æŒåQŒå°†è¦æ’放佾|?çš„æŒæ›?æ£åœ¨æ’放ä½ç½®14çš„æŒæ›?åQŒæˆ‘们认为队列头和尾是相˜qžçš„åQŒå³NåŽé¢çš„å…ƒç´ æ˜¯AåQŒé‚£ä¹ˆè¿™æ ·å¤Ÿæˆäº†ä¸€ä¸ªåó@环队列ã€?br>åœ¨æ’æ”¾ä¹‹å‰ï¼Œæˆ‘们在å‰7(7=14*0.5åQŒè¿™ä¸ªæ¯”例å¯ä»¥éšä¾‰K€‰ï¼Œå½“ç„¶‘Šå¤§éšæœºæ€§è¶Šå¤§ï¼Œä½†èƒ½åŽé€€çš„æ¬¡æ•°è¶Šž®?个佾|®ä¸åQŒéšæœºå–一个一首æŒåQŒæŠŠå®ƒå’Œž®†è¦æ’放的那个佾|®çš„æŒæ›²äº¤æ¢ã€‚å‡è®¾æˆ‘们选的是EåQŒåˆ™é˜Ÿåˆ—å˜æˆ˜q™æ ·åQ?/p>
EBCDAFGHIJKLMN
^
ç„¶åŽæ’放E。Eæ’æ”¾å®Œäº†ä»¥åŽ(或者选择下一首时)åQŒé‡å¤åˆšæ‰çš„动作åQŒå³åœ¨BCDAFGHä¸éšæœºé€‰ä¸€ä¸ªï¼Œäº¤æ¢åQŒæ¯”如选到HåQŒåˆ™é˜Ÿåˆ—å˜æˆåQ?br>EHCDAFGBIJKLMN
^
ç„¶åŽæ’放Hã€‚è¿™æ øP¼Œä¸€ä¸ªshuffle½Ž—æ³•åˆæ¥å®Œæˆäº†ã€?/p>
比如æŸä¸€æ—¶åˆ»æ’æ”¾å™¨çš„çŠ¶æ€æ˜¯˜q™æ ·åQ?br>EHCDAFGBIJKLMN
^
则我们在LMNEHCDä¸é€‰æ‹©ä¸€ä¸ªï¼Œæ¯”如选择到HåQŒé‚£ä¹ˆäº¤æ¢åÆˆæ’æ”¾åQŒæˆä¸ºï¼š
ELCDAFGBIJKHMN
^
但是如果用户选择上一首怎么办呢?我们å¯ä»¥å†è®°å½•ä¸€ä¸ªæŒ‡é’ˆæŒ‡å‘æœ€æ–°shuffle选择出æ¥çš„é‚£é¦–æŒæ›?è®îC½œ"*")åQŒæ²¡æœ‰é€‰æ‹©˜q‡å‰ä¸€é¦–çš„æ—¶å€™ï¼Œå®ƒä¸Žæ’æ”¾æŒ‡é’ˆæŒ‡å‘åŒä¸€ä¸ªä½¾|®ã€‚当选择å‰ä¸€é¦–的时候,仅移动指针^åQŒè€Œä¸¿UÕdЍ*åQŒæ¯”å¦‚ä¸Šä¸€ä¸ªä¾‹åæ’æ”„¡š„时候按下å‰ä¸€é¦–以åŽï¼ŒæˆäØ“åQ?/p>
ELCDAFGBIJKHMN
^*
˜q™æ—¶å€™æ’攄¡š„Kæ£å¥½æ˜¯åˆšæ‰æ’攄¡š„那一首,当然˜q™è¾¾åˆîCº†æˆ‘的目的åQŒå³å¯ä»¥é€‰åˆ°åˆšæ‰æ’放的曲目,当然如果å†ä¸€‹Æ¡é€‰æ‹©ä¸Šä¸€é¦–,ž®×ƒ¼šå˜æˆåQ?/p>
ELCDAFGBIJKHMN
^ *
˜q™æ—¶å€™å¦‚果按下一首,应该判æ–^指å‘çš„æ˜¯ä¸æ˜¯å’?指å‘的相åŒï¼Œå¦‚果相åŒåQŒå°±æŒ‰ç…§æœ€æ—©ä»‹¾lçš„shuffle½Ž—法˜q›è¡Œéšæœºé€‰å–åQŒä¸ç›¸åŒž®Þq®€å•çš„¿UÕdЍ^åQŒå³æˆäØ“åQ?/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)
˜q™ä¸ªæ’放器的shuffle½Ž—法比较½Ž€å•实用,而且节约内å˜å¼€é”€(˜q™å¯¹mp3 walkman之类的东西是å分é‡è¦çš?åQŒå½“然也有个ž®ç¼ºç‚¹ï¼Œž®±æ˜¯å½“^å‰ç§»å¤šæ¬¡å›žåˆ°*以åŽåQŒå†æŒ‰ä¸‹ä¸€é¦–ï¼Œåˆ™ä¼šé‡æ–°å¼€å§‹shuffleåQŒä½†æ˜¯æŒæ›²æ•°ç›®å¾ˆå¤šçš„æƒ…况下,˜q™ä¸ª¾~ºç‚¹òq¶ä¸æ˜¯é‚£ä¹ˆé‡è¦ã€?br>˜q™ä¸ª½Ž—法在刚开始å¬çš„æ—¶å€™ï¼Œòq¶ä¸æ˜¯å¾ˆéšæœºåQŒå¯æ˜¯éšç€å¬çš„‹Æ¡æ•°çš„增多,队列会越æ¥è¶Šä¹±ï¼Œè¾‘Öˆ°ä¸€ä¸ªshuffle的效果ã€?br>当然åQŒä¹Ÿå¯ä»¥åœ¨ç¬¬ä¸€‹Æ¡å¯¹˜q™ä¸ªåˆ—è¡¨æ’æ”¾ä¹‹å‰åQŒä‹É用扑克牌的shuffle½Ž—法(è§æœ¬æ–‡ç¬¬ä¸€éƒ¨åˆ†)˜q›è¡Œä¸€‹Æ¡shuffleåQŒè¿™æ øP¼Œåˆšå¼€å§‹æ’攄¡š„æ—¶å€™åˆ—è¡¨å°±æ˜¯éšæœºçš„ã€?br>é€šè¿‡åŽŸç†æˆ‘们å¯ä»¥çœ‹åˆ°åQŒå¯¹äºŽåˆšå¬è¿‡çš„é‚£é¦–æŒæ¥è¯´åQŒä¸¾l过length / 2‹Æ¡ï¼Œæ˜¯ä¸ä¼šå†ä¸€‹Æ¡å¬åˆ°çš„åQŒå› æ¤å¾ˆå¤§ç¨‹åº¦ä¸Šé¿å…了random½Ž—法的缺陗÷€‚这个length / 2çš„å‚æ•°å¯ä»¥æŒ‰ç…§å…·ä½“情况选择åQŒå¯ä»¥æ˜¯å¸¸æ•°åQŒä¹Ÿå¯ä»¥æ˜¯éšæœºæ•°åQŒä¹Ÿå¯ä»¥æ˜¯å’Œé•¿åº¦æœ‰å…³çš„一个数ã€?nbsp;
æ‹‰æ™®æ‹‰æ–¯å˜æ¢åQˆLaplace Transform)åQŒæ˜¯å·¥ç¨‹æ•°å¦ä¸å¸¸ç”¨çš„一¿Uç§¯åˆ†å˜æ¢ã€?br> 它是为简化计½Ž—而å¾ç«‹çš„实å˜é‡å‡½æ•°å’Œå¤å˜é‡å‡½æ•°é—´çš„一¿Uå‡½æ•°å˜æ¢ã€‚对一个实å˜é‡å‡½æ•°ä½œæ‹‰æ™®æ‹‰æ–¯å˜æ¢ï¼Œòq¶åœ¨å¤æ•°åŸŸä¸ä½œå„¿Uè¿½Ž—ï¼Œå†å°†˜qç®—¾l“果作拉普拉斯åå˜æ¢æ¥æ±‚得实数域ä¸çš„相应¾l“æžœåQŒå¾€å¾€æ¯”ç›´æŽ¥åœ¨å®žæ•°åŸŸä¸æ±‚å‡ºåŒæ ·çš„ç»“æžœåœ¨è®¡ç®—ä¸Šå®¹æ˜“å¾—å¤šã€‚æ‹‰æ™®æ‹‰æ–¯å˜æ¢çš„˜q™ç§˜qç®—æ¥éª¤å¯¹äºŽæ±‚è§£¾U¿æ€§å¾®åˆ†æ–¹½E‹å°¤ä¸ºæœ‰æ•ˆï¼Œå®ƒå¯æŠŠå¾®åˆ†æ–¹½E‹åŒ–为容易求解的代数方程æ¥å¤„ç†ï¼Œä»Žè€Œä‹É计算½Ž€åŒ–。在¾l典控制ç†è®ºä¸ï¼Œå¯ÒŽŽ§åˆ¶ç³»¾lŸçš„分æžå’Œç»¼åˆï¼Œéƒ½æ˜¯å»ºç«‹åœ¨æ‹‰æ™®æ‹‰æ–¯å˜æ¢çš„基础上的ã€?br> å¼•å…¥æ‹‰æ™®æ‹‰æ–¯å˜æ¢çš„一个主è¦ä¼˜ç‚¹ï¼Œæ˜¯å¯é‡‡ç”¨ä¼ 递函æ•îC»£æ›¿å¾®åˆ†æ–¹½E‹æ¥æè¿°¾pÈ»Ÿçš„特性。这ž®×ƒØ“采用直观和简便的图解æ–ÒŽ³•æ¥ç¡®å®šæŽ§åˆ¶ç³»¾lŸçš„æ•´ä¸ªç‰ÒŽ€§ï¼ˆè§ä¿¡åähµ½E‹å›¾ã€åЍæ€ç»“构图åQ‰ã€åˆ†æžæŽ§åˆ¶ç³»¾lŸçš„˜q动˜q‡ç¨‹åQˆè§å¥ˆå¥Žæ–¯ç‰¹½E›_®šåˆ¤æ®ã€æ ¹è½¨è¿¹æ³•)åQŒä»¥åŠç»¼åˆæŽ§åˆ¶ç³»¾lŸçš„æ ¡æ£è£…ç½®åQˆè§æŽ§åˆ¶¾pÈ»Ÿæ ¡æ£æ–ÒŽ³•åQ‰æä¾›äº†å¯èƒ½æ€§ã€?br> æ‹‰æ™®æ‹‰æ–¯å˜æ¢åœ¨å·¥½E‹å¦ä¸Šçš„应用åQšåº”ç”¨æ‹‰æ™®æ‹‰æ–¯å˜æ¢è§£å¸¸å˜é‡é½‹Æ¡å¾®åˆ†æ–¹½E‹ï¼Œå¯ä»¥ž®†å¾®åˆ†æ–¹½E‹åŒ–ä¸ÞZ»£æ•°æ–¹½E‹ï¼Œä½‰K—®é¢˜å¾—以解冟뀂在工程å¦ä¸ŠåQŒæ‹‰æ™®æ‹‰æ–¯å˜æ¢çš„é‡å¤§æ„义在于åQšå°†ä¸€ä¸ªä¿¡å·ä»Žæ—¶åŸŸä¸Šï¼Œè½¬æ¢ä¸ºå¤é¢‘域åQˆs域)上æ¥è¡¨ç¤ºåQ›åœ¨¾U¿æ€§ç³»¾lŸï¼ŒæŽ§åˆ¶è‡ªåŠ¨åŒ–ä¸Šéƒ½æœ‰òq¿æ³›çš„应用ã€?/p>
åQˆé˜…è¯ÀLœ¬æ–‡ä¹‹å‰è¯·å…ˆäº†è§£äºŒå‰æœç´¢æ ‘åQ?span lang=EN-US>
¾U¢é»‘æ ‘ï¼ˆRed-Black TreeåQ?span lang=EN-US>
¾U¢é»‘æ ‘ï¼ˆRed-Black TreeåQ‰æ˜¯äºŒå‰æœçƒ¦æ ‘(Binary Search TreeåQ‰çš„一¿U改˜q›ã€‚我们知é“äºŒå‰æœç´¢æ ‘在最å的情况下å¯èƒ½ä¼šå˜æˆä¸€ä¸ªé“¾è¡?/span>åQˆå½“所有节ç‚ÒŽŒ‰ä»Žå°åˆ°å¤§çš„顺åºä¾‹Æ¡æ’å…¥åŽåQ‰ã€‚è€Œçº¢é»‘æ ‘åœ¨æ¯ä¸€‹Æ¡æ’å…¥æˆ–åˆ é™¤èŠ‚ç‚¹ä¹‹åŽéƒ½ä¼šèŠ?span lang=EN-US>OåQ?span lang=EN-US>log NåQ‰çš„æ—‰™—´æ¥å¯¹æ ‘çš„¾l“构作修改,ä»?span style="COLOR: red">ä¿æŒæ ‘çš„òqŒ™¡¡ã€‚也ž®±æ˜¯è¯ß_¼Œ¾U¢é»‘æ ‘çš„æŸ¥æ‰¾æ–ÒŽ³•ä¸ŽäºŒå‰æœç´¢æ ‘å®Œå…¨ä¸€æ øP¼›æ’å…¥å’Œåˆ é™¤èŠ‚ç‚¹çš„çš„æ–¹æ³•å‰åŠéƒ¨åˆ†èŠ‚ä¸ŽäºŒå‰æœç´¢æ ‘å®Œå…¨ä¸€æ øP¼Œè€ŒåŽåŠéƒ¨åˆ†æ·»åŠ äº†ä¸€äº›ä¿®æ”ÒŽ ‘的结构的æ“作ã€?span lang=EN-US>
¾U¢é»‘æ ‘çš„æ¯ä¸ªèŠ‚ç‚¹ä¸Šçš„å±žæ€§é™¤äº†æœ‰ä¸€ä¸?span lang=EN-US>keyã€?span lang=EN-US>3个指针:parentã€?span lang=EN-US>lchildã€?span lang=EN-US>rchild以外åQ?span style="COLOR: red">˜q˜å¤šäº†ä¸€ä¸ªå±žæ€§ï¼šcolorã€?/span>它åªèƒ½æ˜¯ä¸¤ç§é¢œè‰²åQšçº¢æˆ–é»‘ã€‚è€Œçº¢é»‘æ ‘é™¤äº†å…ähœ‰äºŒå‰æœçƒ¦æ ‘的所有性质之外åQŒè¿˜å…ähœ‰ä»¥ä¸‹4ç‚ÒŽ€§è´¨åQ?span style="COLOR: red">åQˆäؓ什么åªè¦è¿™äº›æ€§è´¨ž®Þpƒ½è§£å†³˜q™ä¸ªé—®é¢˜åQŒå…¶å®žè¿˜æ˜¯ä¸€ä¸ªé—®é¢˜ï¼‰
1. æ ¹èŠ‚ç‚ÒŽ˜¯é»‘色的ã€?span lang=EN-US>
2. ½Iø™Š‚ç‚ÒŽ˜¯é»‘色的(¾U¢é»‘æ ‘ä¸åQŒæ ¹èŠ‚ç‚¹çš?span lang=EN-US>parentä»¥åŠæ‰€æœ‰å¶èŠ‚ç‚¹lchildã€?span lang=EN-US>rchildéƒ½ä¸æŒ‡å‘NULLåQŒè€Œæ˜¯æŒ‡å‘一个定义好的空节点åQ‰ã€?span lang=EN-US>
3. ¾U¢è‰²èŠ‚ç‚¹çš„çˆ¶ã€å·¦åã€å³å节炚wƒ½æ˜¯é»‘艌Ӏ?span lang=EN-US>
4. 在ä“Q何一‹‚µåæ ‘ä¸åQŒæ¯ä¸€æ¡ä»Žæ ¹èŠ‚ç‚¹å‘下走到空节点的èµ\径上包å«çš„黑色节ç‚ÒŽ•°é‡éƒ½ç›¸åŒã€?span lang=EN-US>
如下囑ְ±æ˜¯ä¸€‹‚늺¢é»‘æ ‘åQ?span lang=EN-US>
有了˜q™å‡ æ¡è§„则,ž®±å¯ä»¥ä¿è¯æ•´‹‚‰| ‘çš„åã^衡,也就½{‰äºŽä¿è¯äº†æœç´¢çš„æ—‰™—´ä¸?span lang=EN-US>OåQ?span lang=EN-US>log NåQ‰ã€?span lang=EN-US>
但是在æ’å…¥ã€åˆ 除节点åŽåQŒå°±æœ‰å¯èƒ½ç ´å了¾U¢é»‘æ ‘çš„æ€§è´¨ã€‚æ‰€ä»¥æˆ‘ä»¬è¦åšä¸€äº›æ“ä½œæ¥æŠŠæ•´‹‚‰| ‘ä¿®è¡¥å¥½ã€‚ä¸‹é¢æˆ‘ž®±æ¥ä»‹ç»ä¸€ä¸‹ã€?span lang=EN-US>
首先有一个预备知识,那就是节点的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å·¦ã€å³äº’å一下。如下图åQ?span lang=EN-US>
注æ„åQ?span lang=EN-US>Left-Rotate(x)åŽï¼Œxçš„å³åæ ‘å˜æˆäº†åŽŸæ?span lang=EN-US>yçš„å·¦åæ ‘åQ?span lang=EN-US>Right-Rotateå之。æ€è€ƒä¸€ä¸‹ï¼Œ˜q™æ ·ä¸€‹Æ¡å˜æ¢åŽåQŒä»ç„?span style="COLOR: red">满èƒöäºŒå‰æœçƒ¦æ ‘的性质åQ?span style="COLOR: red">ä¸åºé历òq¶æ²¡æœ‰æ”¹å?/span>åQ‰ã€‚在¾U¢é»‘æ ‘çš„æ’å…¥ã€åˆ 除ä¸åQŒè¦ç”¨åˆ°å¾ˆå¤šLeft-Rotateå’?span lang=EN-US>Right-Rotateæ“作ã€?span lang=EN-US>
//把一个节点å‘左下方移一æ û|¼Œòq¶è®©ä»–原æ¥çš„å›_节点代替它的ä½ç½®ã€?/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;
}
//把一个节点å‘å³ä¸‹æ–¹ç§»ä¸€æ û|¼Œòq¶è®©ä»–原æ¥çš„å·¦å节点代替它的ä½ç½®ã€?/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">¾U¢è‰²ã€?span style="COLOR: red">ä¸ÞZ»€ä¹ˆï¼Ÿ˜q˜è®°å¾—çº¢é»‘æ ‘çš„æ€§è´¨å—ï¼Œä»Žæ ¹èŠ‚ç‚¹å‘下到空节点的æ¯ä¸€æ¡èµ\径上的黑色节ç‚ÒŽ•°è¦ç›¸åŒã€‚如果新æ’入的是黑色节点åQŒé‚£ä¹ˆå®ƒæ‰€åœ¨çš„路径上就å¤?span style="COLOR: red">å‡ÞZº†ä¸€ä¸ªé»‘色的节点了。所以新æ’入的节点一定è¦è®¾æˆ¾U¢è‰²ã€‚ä½†æ˜¯è¿™æ ·å¯èƒ½åˆæœ‰ä¸€ä¸ªçŸ›ç›¾ï¼Œå¦‚æžœz的父节点也是¾U¢è‰²åQŒæ€Žä¹ˆåŠžï¼Œå‰é¢è¯´è¿‡¾U¢è‰²èŠ‚ç‚¹çš„å节点必须是黑艌Ӏ‚å› æ¤æˆ‘ä»¬è¦æ‰§è¡Œä¸‹é¢ä¸€ä¸ªè„P代的˜q‡ç¨‹åQŒç§°ä¸?span lang=EN-US>Insert-FixupåQŒæ¥ä¿®è¡¥˜q™æ£µ¾U¢é»‘æ ‘ã€?span lang=EN-US>
åœ?span lang=EN-US>Insert-Fixupä¸ï¼Œæ¯ä¸€‹Æ¡è„P代的开始,指针z一定都指å‘一个红色的节点。如æž?span lang=EN-US>z->parent是黑è‰ÔŒ¼Œé‚£æˆ‘们就大功告æˆäº†ï¼›å¦‚æžœz->parent是红è‰ÔŒ¼Œæ˜„¡„¶˜q™å°±˜qè¿”äº†çº¢é»‘çš„æ ‘æ€§è´¨åQŒé‚£ä¹ˆæˆ‘ä»¬è¦æƒ›_Šžæ³•æŠŠz或è€?span lang=EN-US>z->parentå˜æˆé»‘色åQŒä½†˜q™è¦å»ºç«‹åœ¨ä¸ç ´å¾U¢é»‘æ ‘çš„å…¶ä»–æ€§è´¨çš„åŸº¼‹€ä¸Šã€?span lang=EN-US>
˜q™é‡Œå†å¼•入两个指针:grandfatheråQŒæŒ‡å?span lang=EN-US>z->parent->parentåQŒä¹Ÿž®±æ˜¯z的爷çˆ?span lang=EN-US>(昄¡„¶ç”׃ºŽz->parent为红è‰ÔŒ¼Œgrandfather一定是黑色)åQ?span lang=EN-US>uncleåQŒæŒ‡å?span lang=EN-US>grandfather除了z->parent之外的å¦ä¸€ä¸ªå节点åQŒä¹Ÿž®±æ˜¯z的父亲的兄弟åQŒæ‰€ä»¥å«uncleã€?span lang=EN-US>
åQˆäØ“äº†è¯´è¯æ–¹ä¾¿ï¼Œæˆ‘们˜q™é‡Œéƒ½å‡è®?span lang=EN-US>z->parentæ˜?span lang=EN-US>grandfather的左å节点,è€?span lang=EN-US>uncleæ˜?span lang=EN-US>grandfatherçš„å³å节ç‚V€‚如果é‡åˆ°çš„å®žé™…æƒ…å†µä¸æ˜¯˜q™æ ·åQŒé‚£ä¹Ÿåªè¦æŠŠæ‰€æœ‰æ“作ä¸çš„å·¦ã€å³äº’åž®±å¯ä»¥äº†ã€‚)
在æ¯ä¸€‹Æ¡è„P代ä¸åQŒæˆ‘们å¯èƒ½é‡åˆîC»¥ä¸‹ä¸‰¿U情å†üc€?span lang=EN-US>
Case 1. uncle也是¾U¢è‰²ã€‚这时åªè¦æŠŠz->parentå’?span lang=EN-US>uncle都设æˆé»‘è‰ÔŒ¼Œòq¶æŠŠgrandfather设戾U¢è‰²ã€‚è¿™æ ·ä»ç„¶ç¡®ä¿äº†æ¯ä¸€æ¡èµ\径上的黑色节ç‚ÒŽ•°ä¸å˜ã€‚ç„¶åŽæŠŠz指å‘grandfatheråQŒåƈ开始新一轮的˜q代。如下图åQ?span lang=EN-US>
æ³?span lang=EN-US>1åQšæˆ‘ä»¬å¯ä»¥çœ‹å‡ºå·¦è¾¹çš„å›¾ï¼Œå„æ¡è·¯å¾„包å«é»‘颜色的数目是棼‹®çš„åQŒåªæ˜¯é¢œè‰²ä¸å¯¹è€Œå·²åQŒæˆ‘们把它分æˆä¸¤è¾ÒŽ¥çœ‹ï¼Œå›_ˆ°èŠ‚ç‚¹D应该包å«N+1个黑色节点,其丘q™ä¸ª1æ˜?span lang=EN-US>CåQŒè€?span lang=EN-US>Næ˜?span lang=EN-US>C以上的黑色节点个数。åŒç?span lang=EN-US>A也应该是N+1åQ?span lang=EN-US>B也是N+1åQŒè°ƒæ•´ä»¥åŽï¼Œçœ‹çœ‹æˆ‘们¼‹®å®žæ²¡æœ‰æ”¹å˜åˆ?span lang=EN-US>Aã€?span lang=EN-US>Bã€?span lang=EN-US>D的所包å«çš„黑色节ç‚ÒŽ•°ã€‚下é¢çš„æƒ…况也å¯ä»¥åŒæ ïLš„æ–ÒŽ³•æ¥åˆ†æžã€?span lang=EN-US>
Case 2. uncle是黑è‰ÔŒ¼Œòq¶ä¸”zæ˜?span lang=EN-US>z->parentçš„å³å节ç‚V€‚这时我们åªè¦æŠŠz指å‘z->parentåQŒç„¶åŽåšä¸€‹Æ?span lang=EN-US>Left-Rotate(z)。就å¯ä»¥æŠŠæƒ…况è{化æˆCase 3ã€?span lang=EN-US>
Case 3. uncle是黑è‰ÔŒ¼Œòq¶ä¸”zæ˜?span lang=EN-US>z->parent的左å节ç‚V€‚到了这一æ¥ï¼Œæˆ‘们ž®±å‰©æœ€åŽä¸€æ¥äº†ã€‚åªè¦æŠŠz->parent设æˆé»‘色åQŒæŠŠgrandfather设戾U¢è‰²åQŒå†åšä¸€‹Æ?span lang=EN-US>Right-Rotate(grandfather)åQŒæ•´‹‚‰| ‘ž®×ƒ¿®è¡¥å®Œæ¯•了。å¯ä»¥æ€è€ƒä¸€ä¸‹ï¼Œ˜q™æ ·ä¸€‹Æ¡æ“作之åŽï¼Œ¼‹®å®žæ»¡èƒöäº†æ‰€æœ‰çº¢é»‘æ ‘çš„æ€§è´¨ã€?span lang=EN-US>Case 2å’?span lang=EN-US>Case 3如下图:
å夘q›è¡Œ˜q代åQŒç›´åˆ°æŸä¸€‹Æ¡è„P代开始时z->parent为黑色而告¾lˆï¼Œä¹Ÿå°±æ˜¯å½“é‡åˆ°Case 3åŽï¼Œåšå®Œå®ƒè€Œå‘оlˆã€?span lang=EN-US>
void insertFixup(RBTNode* insertNode) {
RBTNode* p = insertNode;
while (p->parent->color == RED) {
//z->parentæ˜?/span>grandfather的左å节ç‚?/span>,䏋颿˜¯ä¸‰¿U情å†?/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的过½E‹ï¼šå¦‚æžœz没有åèŠ‚ç‚¹ï¼Œé‚£ä¹ˆç›´æŽ¥åˆ é™¤å›_¯åQ›å¦‚æž?span lang=EN-US>zåªæœ‰ä¸€ä¸ªå节点åQŒé‚£ä¹ˆè®©˜q™ä¸ªå节ç‚ÒŽ¥ä»£æ›¿z的佾|®ï¼Œç„¶åŽæŠ?span lang=EN-US>zåˆ é™¤å›_¯åQ›å¦‚æž?span lang=EN-US>z有两个å节点åQŒé‚£ä¹ˆæ‰¾åˆ?span lang=EN-US>z在ä¸åºé历ä¸çš„厾l§èŠ‚ç‚?span lang=EN-US>såQˆä¹Ÿž®±æ˜¯ä»?span lang=EN-US>z->rchild开始å‘左下方一直走到底的那一个节点)åQŒæŠŠsçš?span lang=EN-US>key赋值给zçš?span lang=EN-US>keyåQŒç„¶åŽåˆ é™?span lang=EN-US>sã€?span lang=EN-US>
¾U¢é»‘æ ‘ä¸åˆ 除一个节ç‚?span lang=EN-US>z的方法也是首先按部就ç以上的˜q‡ç¨‹ã€?span lang=EN-US>
æŒ‰ç…§äºŒå‰æœçƒ¦æ ‘çš„åˆ é™¤æ–ÒŽ³•åˆ é™¤èŠ‚ç‚¹åQŒå¦‚æžœåˆ é™¤èŠ‚ç‚ÒŽ˜¯¾U¢è‰²çš?/span>åQŒé‚£òq?span style="COLOR: red">ä¸ä¼šæ”¹å˜¾U¢é»‘æ ‘çš„æ€§è´¨ã€‚å¦‚æžœåˆ é™¤çš„èŠ‚ç‚¹æ˜?span style="COLOR: red">黑色çš?/span>åQŒé‚£ä¹ˆæ˜¾ç„¶å®ƒæ‰€åœ¨çš„路径上就ž®‘一个黑色节点,那么¾U¢é»‘æ ‘çš„æ€§è´¨ž®Þp¢«ç ´åäº?/span>ã€‚è¿™æ—¶æˆ‘ä»¬å°±è¦æ‰§è¡Œä¸€ä¸ªç§°ä¸?span lang=EN-US>Delete-Fixup的过½E‹ï¼Œæ¥ä¿®è¡¥è¿™‹‚‰| ‘ã€‚ä¸‹é¢æˆ‘ž®±æ¥è®²è§£ä¸€ä¸‹ã€?span lang=EN-US>
ä¸€ä¸ªèŠ‚ç‚¹è¢«åˆ é™¤ä¹‹åŽåQŒä¸€å®šæœ‰ä¸€ä¸ªå®ƒçš„å节点代替了它的佾|®ï¼ˆå³ä‹É是å¶èŠ‚ç‚¹è¢«åˆ é™¤åŽåQŒä¹Ÿä¼šæœ‰ä¸€ä¸ªç©ºèŠ‚ç‚¹æ¥ä»£æ›¿å®ƒçš„ä½¾|®ã€‚å‰é¢è¯´˜q‡ï¼Œåœ¨çº¢é»‘æ ‘ä¸ï¼Œ½Iø™Š‚ç‚ÒŽ˜¯ä¸€ä¸ªå®žé™…å˜åœ¨çš„节点。)。我们就设指é’?span lang=EN-US>x指员q™ä¸ªä»£æ›¿ä½ç½®çš„节ç‚V€?span lang=EN-US>
昄¡„¶åQŒå¦‚æž?span lang=EN-US>x是红色的åQŒé‚£ä¹ˆæˆ‘们åªè¦æŠŠå®ƒè®¾æˆé»‘è‰ÔŒ¼Œå®ƒæ‰€åœ¨çš„è·¯å¾„ä¸Šå°±é‡æ–°å¤šå‡ºäº†ä¸€ä¸ªé»‘色节点,那么¾U¢é»‘æ ‘çš„æ€§è´¨ž®±æ»¡‘³äº†ã€?span lang=EN-US>
然而,如果x是黑色的åQŒé‚£æˆ‘们ž®Þp¦å‡æƒ³x上背负了2个å•ä½çš„é»‘è‰²ã€‚é‚£ä¹ˆçº¢é»‘æ ‘çš„æ€§è´¨ä¹ŸåŒæ ·ä¸ç ´ååQŒä½†æ˜¯æˆ‘ä»¬è¦æ‰‘Öˆ°æŸä¸€ä¸ªçº¢è‰²çš„节点åQŒæŠŠxä¸?span lang=EN-US>“‘…貔的这1个å•ä½çš„黑色丢给它,˜q™æ ·æ‰ç®—完æˆã€?span lang=EN-US>Delete-Fixupåšçš„ž®±æ˜¯˜q™ä¸ªå·¥ä½œã€?span lang=EN-US>
æ³¨ï¼šåˆ é™¤äº†ä¸€ä¸ªé»‘è‰²èŠ‚ç‚¹ä»¥åŽï¼Œé历到节点一下的å¶å节点比é历其他分支的å¶å节点的黑色节ç‚ÒŽ•°ž®±å°‘了一个,˜q™å°±è¦æ˜¯æ‰‘Öˆ°ä¸€ä¸ªçº¢è‰ÔŒ¼ŒæŠŠè¿™ä¸ªèŠ‚ç‚ÒŽ¢æˆé»‘è‰²æ¥æ‹Ÿè¡¥˜q™ä¸ªåˆ 除的黑色节点,使得é历到å¶å节点绘q‡é»‘è‰²èŠ‚ç‚¹çš„æ•°ç›®ä¸€æ —÷€?span lang=EN-US>
Delete-FixupåŒæ ·æ˜¯ä¸€ä¸ªåó@环è„P代的˜q‡ç¨‹ã€‚æ¯ä¸€‹Æ¡è„P代开始时åQŒå¦‚果指é’?span lang=EN-US>x指å‘一个红色节点,那么大功告æˆåQŒæŠŠå®ƒè®¾æˆé»‘色å³å‘Šç»ˆã€‚相å如æž?span lang=EN-US>x黑色åQŒé‚£ä¹ˆæˆ‘们就会é¢å¯?span style="COLOR: red">以下4¿U情å†?/span>ã€?span lang=EN-US>
˜q™é‡Œå¼•å…¥å¦ä¸€ä¸ªæŒ‡é’?span lang=EN-US>wåQŒæŒ‡å?span lang=EN-US>x的兄弟。这里我们都默认xæ˜?span lang=EN-US>x->parent的左å节点,åˆ?span lang=EN-US>wæ˜?span lang=EN-US>x->parentçš„å³å节ç‚V€‚(如果实际é‡åˆ°ç›¸å的情况,åªè¦æŠŠæ‰€æœ‰æ“作ä¸çš„å·¦ã€å³äº’å一下就å¯ä»¥äº†ã€‚)
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åQŒå‰é¢è¯´˜q‡å®ƒä¸€å®šæ˜¯é»‘色的。那么我们就在ä¸ç ´å¾U¢é»‘æ ‘æ€§è´¨çš„å‰æä¸‹åQŒæŠŠCase 1è½¬æ¢æˆäº†Case2ã€?span lang=EN-US>3ã€?span lang=EN-US>4ä¸çš„一个,也就æ˜?span lang=EN-US>w是黑色的情况。æ€è€ƒä¸€ä¸‹ï¼Œ˜q™æ ·åšä¸ä¼šæ”¹å˜æ¯æ¡èµ\径上黑色节点的个敎ͼŒå¦‚下图:
注:å¯ä»¥çœ‹å‡º˜q™æ ·å˜åŒ–以厞®±å˜æˆäº†Case2了ã€?span lang=EN-US>
Case 2. w是黑è‰ÔŒ¼Œòq¶ä¸”w的两个å节点都是黑色。这时我们åªè¦æŠŠw设戾U¢è‰²ã€‚ç„¶åŽæŠŠx¿UÕdˆ°x->parentåQŒå¼€å§‹ä¸‹ä¸€è½®è„P代(注æ„åQŒé‚£“‘…è²”çš?span lang=EN-US>1å•ä½çš„黑色始¾lˆæ˜¯è·Ÿç€æŒ‡é’ˆxèµ°çš„åQŒç›´åˆ?span lang=EN-US>x走到了一个红色节点上æ‰èƒ½æŠŠå®ƒ“忀¸‹”åQ‰ã€‚æ€è€ƒä¸€ä¸‹ï¼Œ˜q™ä¸€‹Æ¡æ“作ä¸ä¼šç ´åçº¢é»‘æ ‘çš„æ€§è´¨ã€‚å¦‚ä¸‹å›¾åQˆå›¾ä¸èŠ‚ç‚?span lang=EN-US>Bä¸ä¸€å®šæ˜¯¾U¢è‰²åQŒä¹Ÿå¯èƒ½æ˜¯é»‘è‰ÔŒ¼‰åQ?span lang=EN-US>
注:˜q™é‡Œåªè¦æŠ?span lang=EN-US>Bå˜æˆ¾U¢è‰²ž®±å¤§åŠŸå‘Šæˆäº†ã€?span lang=EN-US>
Case 3. w是黑è‰ÔŒ¼Œòq¶ä¸”w的两个å节点左红å³é»‘。这时我们把wä¸?span lang=EN-US>w->lchild的颜色互æ¢ï¼Œç„¶åŽå?span lang=EN-US>Right-Rotate(w)。æ€è€ƒä¸€ä¸‹ï¼Œ˜q™æ ·åšä¹‹åŽä¸ä¼šç ´åçº¢é»‘æ ‘çš„æ€§è´¨ã€‚è¿™æ—?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是黑è‰ÔŒ¼Œòq¶ä¸”wçš„å³å节ç‚ÒŽ˜¯¾U¢è‰²ã€‚一但é‡åˆ?span lang=EN-US>Case 4åQŒå°±èƒœåˆ©åœ¨æœ›äº†ã€‚我看下é¢ä¸€å¼ 图。先æŠ?span lang=EN-US>wä¸?span lang=EN-US>x->parent的颜色互æ¢ï¼Œå†åšLeft-Rotate(x->parent)。这时图ä¸èŠ‚ç‚?span lang=EN-US>EåQˆä¹Ÿž®±æ˜¯åŽ?span lang=EN-US>w->rchildåQ‰æ‰€åœ¨çš„路径ž®Þp‚¯å®šå°‘了一个黑è‰ÔŒ¼Œè€?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åŽå·²¾l解决了ã€?span lang=EN-US>
void delFixup(RBTNode* delNode) {
RBTNode* p = delNode;
while (p != m_root && p->color == BLACK) {
if (p == p->parent->lchild) {//左边情况åQŒä»¥ä¸‹æ˜¯å››ç§ä¸åŒçš?/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. ¿U°çƒ
3. 排åº
3.1 ä¸ÞZ»€ä¹ˆå †æŽ’比快排æ…?span lang=EN-US>
3.2 ä¸ÞZ»€ä¹ˆå¿«æŽ’å…¶å®žä¹Ÿä¸æ˜¯é‚£ä¹ˆå¿?span lang=EN-US>
3.3 基排åˆäؓ什么那么快å‘?span lang=EN-US>
4. ä¿¡æ¯è®ºï¼ä¿¡æ¯è®ºï¼Ÿ
5. ž®ç»“
0. å‰è¨€
知铘q™ä¸ªç†è®ºæ˜¯åœ¨TopLanguage上的一‹Æ¡è®¨è®ºï¼Œå…ˆæ˜¯g9转了David MacKay的一½‹‡æ–‡ç«?/span>åQŒç„¶åŽå¼•å‘了牛äh们的一场关于信æ¯è®ºçš„讨è®?/font>ã€?span lang=EN-US>AnywayåQŒæ£å¦?span lang=EN-US>g9很久以å‰åœ?span lang=EN-US>Blogé‡Œé¢æ‰€è¯?/font>的:
æœ‰æ—¶æ— çŸ¥æ˜¯ç¦ã€‚俺看到一ç‚ÒŽ–°é²œçš„¿U‘æ™®ä¹Ÿèƒ½è§‰å¾—é€ åŒ–¼œžå¥‡ã€‚刚æ‰è¯»Gerald Jay SussmanåQ?span lang=EN-US>SICPä½œè€…ï¼‰çš„æ–‡ç« ï¼ŒBuilding Robust Systems – an essayåQŒç«Ÿç„¶å¿ƒå¦‚å°é¹¿äؕ撞,手心湿润åQŒä»¿ä½›ç¬¬ä¸€‹Æ¡æ¡ä½åˆæ‹æƒ…人温柔的手ã€?span lang=EN-US>
而看åˆ?span lang=EN-US>MacKay的这½‹‡æ–‡ç« 我也有˜q™ç§æ„Ÿè§‰â€”â€?/span>以剿¨¡ç³Šçš„东西忽然有了深åˆÈš„解释åQŒä¸€åˆ‡é¡¿æ—¶å˜å¾—æ˜Žç™½æ— æ¯”ã€‚åŽŸæ¥çœ‹é—®é¢˜çš„角度或层é¢èƒ½å¤Ÿå¸¦æ¥˜q™ä¹ˆå¤§çš„å˜åŒ–。å†ä¸€‹Æ¡å°è¯äº†‘Šæ˜¯æ·±åˆ»çš„原ç†å¾€å¾€‘Šæ˜¯½Ž€å•和强大。所以说åQŒåœŸé³–也有土鳖的òq¸ç¦:P
˜q™ç¯‡æ–‡ç« 相当äº?span lang=EN-US>MacKayåŽŸæ–‡çš„ç™½è¯æ–‡ç‰ˆã€?span lang=EN-US>MacKay在原文ä¸ç”¨åˆ°äº†ä¿¡æ¯è®ºçš„知识,åŽè€…在我看æ¥åÆˆä¸æ˜¯å¿…须的,ž®½ç®¡è®¡ç®—çš„æ—¶å€™æ–¹ä¾¿ï¼Œä½†ä¸Žæœ¬è´¨æ— å…³ã€‚æ‰€ä»¥æˆ‘ç”¨å¤§ç™½è¯è§£é‡Šäº†ä¸€é€šã€?
1. 猜数å?
我们先æ¥çŽ©ä¸€ä¸ªçŒœæ•°å—æ¸¸æˆåQšæˆ‘å¿ƒé‡Œé»˜å¿µä¸€ä¸?span lang=EN-US>1~64之间的数åQŒä½ æ¥çŒœåQˆä½ åªèƒ½é—®ç”案是“æ˜?span lang=EN-US>”æˆ?span lang=EN-US>“å?span lang=EN-US>”çš„é—®é¢˜ï¼‰ã€‚äØ“äº†ä¿è¯ä¸è®ºåœ¨ä»€ä¹ˆæƒ…况下都能以尽é‡å°‘的次数猜ä¸ï¼Œä½ 应该采å–什么ç–略呢åQŸå¾ˆæ˜„¡„¶åQŒäºŒåˆ†ã€‚å…ˆæ˜¯çŒœæ˜¯ä¸æ˜¯ä½äº?span lang=EN-US>1~32之间åQŒæŽ’除掉一åŠå¯èƒ½æ€§ï¼Œç„¶åŽå¯¹åŒºé—´ç‘ô¾l二分。这¿Uç–略能够ä¿è¯æ— è®ºæ•°å—æ€Žä¹ˆè·Ÿä½ æ‰è¿·è—,都能åœ?span lang=EN-US>log_2{n}‹Æ¡ä»¥å†…猜ä¸ã€‚用½Ž—æ³•çš„æœ¯è¯æ¥è¯´å°±æ˜¯å®ƒçš„下界是最好的ã€?
æˆ‘ä»¬å†æ¥å›žé¡¾ä¸€ä¸‹è¿™ä¸ªæ¸¸æˆæ‰€è•´å«çš„æœ¬è´¨ï¼šä¸ÞZ»€ä¹ˆè¿™¿Uç–略具有最优下界?½{”案也很½Ž€å•,˜q™ä¸ª½{–略是åã^衡的。å之如果ç–ç•¥ä¸æ˜¯åã^è¡¡çš„åQŒæ¯”å¦‚é—®æ˜¯ä¸æ˜¯åœ¨1~10之间åQŒé‚£ä¹ˆä¸€æ—¦å‘çŽîC¸æ˜¯åœ¨1~10之间的诞®×ƒ¼šå‰©ä¸‹æ¯?span lang=EN-US>N/2更多的å¯èƒ½æ€§éœ€è¦åŽ»è€ƒå¯Ÿäº†ã€?
å¾å®¥åœ¨è®¨è®ÞZ¸æåˆ°åQŒè¿™¿Uç–略的本质å¯ä»¥æ¦‚括æˆ?span lang=EN-US>“è®©æœªçŸ¥ä¸–ç•Œæ— æœºå¯ä¹?span lang=EN-US>”。它是没æœ?span lang=EN-US>“å¼Þq‚¹çš?span lang=EN-US>”åQŒç”案的ä»ÖM½•ä¸€ä¸ªåˆ†æ”¯éƒ½æ˜¯ç‰æ¦‚率的。å之,一旦æŸä¸ªåˆ†æ”¯è•´å«çš„å¯èƒ½æ€§æ›´å¤šï¼Œå½“情况è½åˆ°é‚£ä¸ªåˆ†æ”¯ä¸Šçš„æ—¶å€™ä½ ž®±éƒé—·äº†ã€‚æ¯”å¦‚çŒœæ•°å—æ¸¸æˆæœ€¾pŸç³•çš„ç–略就是一个一个的猜:æ˜?span lang=EN-US>1å—?æ˜?span lang=EN-US>2å—?... å› äØ“˜q™ç§çŒœæ³•最差的情况下需è¦?span lang=EN-US>64‹Æ¡æ‰èƒ½çŒœå¯¹ï¼Œä¸‹ç•Œéžå¸¸¾pŸç³•。二分æœç´¢äؓ什么好åQŒå°±æ˜¯å› ä¸ºå®ƒæ¯æ¬¡éƒ½å°†å¯èƒ½æ€§æŽ’除一åŠåÆˆä¸”æ— è®ºå¦‚ä½•éƒ½èƒ½æŽ’é™¤ä¸€åŠï¼ˆå®ƒæ˜¯æœ€¾pŸæƒ…况下表现最好的åQ‰ã€?
2. ¿U°çƒ
12个å°çƒï¼Œå…¶ä¸æœ‰ä¸€ä¸ªæ˜¯åçƒã€‚有一架天òqŸë€‚需è¦ä½ 用最ž®‘çš„¿U°æ¬¡æ•°æ¥¼‹®å®šå“ªä¸ªž®çƒæ˜¯åçš„åÆˆä¸”å®ƒåˆ°åº•æ˜¯è½»˜q˜æ˜¯é‡ã€?
˜q™ä¸ªé—®é¢˜æ˜¯ä¸€é“æµä¼ 已久的智力题。网¾lœä¸Šä¹Ÿæœ‰å¾ˆå¤šè®²è§£åQŒè¿˜æœ‰æ³›åŒ–到N个çƒçš„æƒ…å†µä¸‹çš„ä¸¥æ ÆD¯æ˜Žã€‚也有零星的一些地æ–ÒŽåˆîC»Žä¿¡æ¯è®ºçš„角度æ¥çœ‹å¾…æœ€ä¼˜è§£æ³•ã€‚æœ¬æ¥æˆ‘ä¸€ç›´è®¤ä¸ø™¿™é“题目除了试错之外没有其它高妙的æ€èµ\了,åªèƒ½ä¸€ä¸ªä¸ªæ–ÒŽ³•试,òq¶å°½é‡ä»Ž¾l“æžœä¸å¯»æ‰¾ä¿¡æ¯ï¼Œç„¶åŽçœ‹çœ‹å“ªç§æ–ÒŽ¡ˆæœ€ž®‘ã€?
然而,实际上它的确有其它的æ€èµ\åQŒä¸€ä¸ªæ›´æœ¬è´¨çš„æ€èµ\åQŒè€Œä¸”æ ÒŽœ¬ç”¨ä¸ç€ä¿¡æ¯è®ø™¿™ä¹ˆæ‹—å£çš„知识ã€?
我们先回™å¾ä¸€ä¸‹çŒœæ•°å—游æˆã€‚äØ“äº†ä¿è¯ä“Q何情况下以最ž®‘次数猜ä¸ï¼Œæˆ‘们的ç–ç•¥æ˜¯æ¯æ¬¡éƒ½æŽ’除æ°å¥½ä¸€åŠçš„å¯èƒ½æ€§ã€‚类比到¿U°çƒé—®é¢˜ä¸Šï¼šåçƒå¯èƒ½æ˜?span lang=EN-US>12个çƒä¸çš„ä»ÀL„一个,˜q™å°±æ˜?span lang=EN-US>12¿Uå¯èƒ½æ€§ï¼›è€Œå…¶ä¸æ¯¿Uå¯èƒ½æ€§ä¸‹åçƒå¯èƒ½è½ÖM¹Ÿå¯èƒ½é‡ã€‚于æ˜?span lang=EN-US>“åçƒæ˜¯å“ªä¸ªçƒåQŒæ˜¯è½ÀL˜¯é‡?span lang=EN-US>”˜q™ä¸ªé—®é¢˜çš„ç”æ¡ˆå°±æœ?span lang=EN-US>12×2=24¿Uå¯èƒ½æ€§ã€‚现在我们用天åã^æ¥ç§°çƒï¼Œž®Þq‰åŒäºŽå¯¹è¿™24¿Uå¯èƒ½æ€§å‘问,ç”׃ºŽå¤©åã^的输出结果有三秓òqŒ™¡¡ã€å·¦å€¾ã€å³å€?span lang=EN-US>”åQŒè¿™ž®Þq›¸å½“于我们的问题有三个½{”案åQŒå³å¯ä»¥ž®†æ‰€æœ‰çš„å¯èƒ½æ€§åˆ‡æˆä¸‰ä»½ï¼Œæ ÒŽ®çŒœæ•°å—游æˆçš„å¯å‘åQŒæˆ‘们应当尽é‡è®©˜q™ä¸‰ä¸ªåˆ†æ”¯æ¦‚率函{‰ï¼Œå›_ã^å‡åˆ‡åˆ†æ‰€æœ‰çš„å¯èƒ½æ€§äؓ三ç‰ä»½ã€‚如æ¤ä¸€æ¥çš„è¯ä¸€‹Æ¡ç§°é‡å°±å¯ä»¥ž®†ç”案的å¯èƒ½æ€§ç¾ƒå‡äؓ原æ¥çš?span lang=EN-US>1/3åQŒä¸‰‹Æ¡å°±èƒ½ç¾ƒå‡äØ“1/27。而æ€Õd…±æ‰æœ‰24¿Uå¯èƒ½æ€§ï¼Œæ‰€ä»¥ç†è®ÞZ¸Šæ˜¯å®Œå…¨å¯ä»?span lang=EN-US>3‹Æ¡ç§°å‡ºæ¥çš„ã€?
如何¿U°çš„æŒ‡å¯¼åŽŸåˆ™æœ‰äº†åQŒæž„é€ ä¸€ä¸ªç§°çš„ç–ç•¥å°±ä¸æ˜¯ä»€ä¹ˆå¤ªå›°éš¾çš„事情了。首先ä¸å¦¨è§£é‡Šä¸€ä¸‹äØ“ä»€ä¹ˆæœ€ç›´è§‚çš„ç§°æ³•ä¸æ˜¯æœ€ä¼˜çš„—â€?ã€?span lang=EN-US>6¿UŽÍ¼šåœ?span lang=EN-US>6ã€?span lang=EN-US>6¿U°çš„æ—¶å€™ï¼Œå¤©åã^òqŒ™¡¡çš„å¯èƒ½æ€§æ˜¯0。刚æ‰è¯´äº†ï¼Œæœ€ä¼˜ç–略应该ä‹É得天òq³ä¸‰¿U状æ€çš„æ¦‚率å‡ç‰åQŒè¿™æ äh‰èƒ½ä¸‰½{‰åˆ†½{”案的所有å¯èƒ½æ€§ã€?
ä¸ÞZº†æ›´æ¸…楚的看待˜q™ä¸ªé—®é¢˜åQŒæˆ‘们ä¸å¦¨å‡è®¾æœ‰6个çƒåQŒæ¥è€ƒè™‘一ä¸?span lang=EN-US>3ã€?span lang=EN-US>3¿U°å’Œ2ã€?span lang=EN-US>2¿U°çš„区别åQ?
在未¿UîC¹‹å‰ï¼Œä¸€å…±æœ‰12¿Uå¯èƒ½æ€§ï¼š1è½…R€?span lang=EN-US>1é‡ã€?span lang=EN-US>2è½…R€?span lang=EN-US>2é‡ã€?span lang=EN-US>...ã€?span lang=EN-US>6è½…R€?span lang=EN-US>6é‡ã€‚现在将1ã€?span lang=EN-US>2ã€?span lang=EN-US>3åäh”¾åœ¨å·¦è¾¹ï¼Œ4ã€?span lang=EN-US>5ã€?span lang=EN-US>6攑֜¨åŒ™¾¹3ã€?span lang=EN-US>3¿UîCº†ä¹‹åŽåQŒä¸å¤×ƒ¸€èˆ¬æ€§å‡è®‘Ö¤©òq›_·¦å€¾ï¼Œé‚£ä¹ˆž®çƒçš„å¯èƒ½æ€§å°±å˜æˆäº†åŽŸæ¥çš„一åŠï¼ˆ6¿U)åQ?span lang=EN-US>1é‡ã€?span lang=EN-US>2é‡ã€?span lang=EN-US>3é‡ã€?span lang=EN-US>4è½…R€?span lang=EN-US>5è½…R€?span lang=EN-US>6è½…R€‚峘q™ç§¿U°æ³•能排除一åŠå¯èƒ½æ€§ã€?
çŽ°åœ¨å†æ¥çœ?span lang=EN-US>2ã€?span lang=EN-US>2¿U°æ³•åQŒå³1ã€?span lang=EN-US>2攑ַ¦è¾¹ï¼Œ3ã€?span lang=EN-US>4攑ֳ边,剩下çš?span lang=EN-US>5ã€?span lang=EN-US>6ä¸ç§°åQŒæ”¾ä¸€è¾V€‚å‡è®„¡»“果是天åã^òqŒ™¡¡åQŒé‚£ä¹ˆå¯èƒ½æ€§å‰©ä¸?span lang=EN-US>—â€?¿U:5é‡ã€?span lang=EN-US>5è½…R€?span lang=EN-US>6é‡ã€?span lang=EN-US>6è½…R€‚å‡è®‘Ö¤©òq›_·¦å€¾ï¼Œå¯èƒ½æ€§ä¹Ÿå‰©ä¸‹4¿U:1é‡ã€?span lang=EN-US>2é‡ã€?span lang=EN-US>3è½…R€?span lang=EN-US>4è½…R€‚å³å€‘Ö’Œå·¦å€„¡š„情况¾cÖM¼¼ã€‚æ€ÖM¹‹åQŒè¿™¿U称法,ä¸ç®¡å¤©åã^¾l“果如何åQŒæƒ…况都被我们羃ž®åˆ°äº†åŽŸæ¥çš„三分之一åQ我们充分利用了“天åã^的结果状æ€å¯èƒ½æœ‰ä¸‰ç§”˜q™ä¸ªæ¡äšgæ¥ä¸‰½{‰åˆ†æ‰€æœ‰å¯èƒ½æ€§ï¼Œè€Œä¸æ˜¯äºŒ½{‰åˆ†ã€?
说到˜q™é‡ŒåQŒå‰©ä¸‹çš„事情ž®±å®žåœ¨å¾ˆ½Ž€å•了åQšç¬¬äºŒæ¥¿U°æ³•åQŒåªè¦è®°ç€˜q™æ ·ä¸€ä¸ªæŒ‡å¯¼æ€æƒ³â€”â€?/span>ä½ é€‰æ‹©çš„ç§°æ³•å¿…™åÖM‹É得当天åã^òqŒ™¡¡çš„æ—¶å€™ç”案剩下的å¯èƒ½æ€§å’Œå¤©åã^左倾(å›_€¾ï¼‰çš„æ—¶å€™ç”案剩下的å¯èƒ½æ€§ä¸€æ ·å¤šã€‚实际上åQŒè¿™½{‰åŒäºŽä½ 得选择一¿U称法,使得天åã^输出三秾l“果的概率是å‡ç‰çš„ï¼Œå› äØ“å¤©åã^输出æŸä¸ª¾l“果的概率就½{‰åŒäºŽæ‰€æœ‰æ”¯æŒè¿™ä¸ªç»“果(左倾ã€å³å€¾ã€åã^è¡¡ï¼‰çš„ç”æ¡ˆå¯èƒ½æ€§çš„和,òq¶ä¸”½{”案的æ¯ä¸ªå¯èƒ½æ€§éƒ½æ˜¯ç‰æ¦‚率的ã€?
MacKay在他的书ã€?span lang=EN-US>Information Theory: Inference and Learning Algorithms》(作者开攑օ费电å书åQ‰é‡Œé?span lang=EN-US>4.1节专门讲了这个称çƒé—®é¢˜ï¼Œ˜q˜ç”»äº†ä¸€å¼ ä¸é”™çš„图,我就照抄了:
图专1+”是指“1å·å°çƒäØ“é‡?span lang=EN-US>”˜q™ä¸€å¯èƒ½æ€§ã€‚一开始一共有24¿Uå¯èƒ½æ€§ã€?span lang=EN-US>4ã€?span lang=EN-US>4¿UîCº†ä¹‹åŽä¸ç®¡å“ªç§æƒ…况åQˆåˆ†æ”¯ï¼‰åQŒå‰©ä¸‹æ¥çš„å¯èƒ½æ€§æ€ÀL˜¯4¿U。这是一个完¾ŸŽçš„三分。然åŽå¯¹æ¯ä¸ªåˆ†æ”¯æž„é€ ç¬¬äºŒæ¬¡¿U°æ³•åQŒè¿™é‡Œä½ åªè¦½EåŠ æ¼”ç®—ž®±å¯ä»¥å‘玎ͼŒåˆ†æ”¯1上的½W¬äºŒ‹Æ¡ç§°æ³•,å?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”˜q™ç§¿U°æ³•åQŒå¤©òqŒ™¾“å‡ÞZ¸‰¿U结果的å¯èƒ½æ€§æ˜¯å‡ç‰çš„ï¼ˆä¸¥æ ¼æ¥è¯´æ˜¯å‡ 乎函{‰ï¼‰ã€‚è¿™ž®±æ˜¯ä¸ÞZ»€ä¹ˆè¿™ä¸ªç§°æ³•能够在最åçš„æƒ…å†µä¸‹ä¹Ÿèƒ½è¡¨çŽ°æœ€å¥½çš„åŽŸå› åQŒæ²¡æœ‰å“ªä¸ªåˆ†æ”¯æ˜¯å®ƒçš„å¼Þq‚¹åQŒå®ƒå¿…然能将情况¾~©å°åˆ°åŽŸæ¥çš„1/3ã€?
3. 排åº
用å‰é¢çš„看问题视角,排åºçš„æœ¬è´¨å¯ä»¥è¿™æ äh¥è¡¨è¿°åQšä¸€¾l„未排åºçš?span lang=EN-US>N个数å—,它们一共有N!¿Ué‡æŽ’ï¼Œå…¶ä¸åªæœ‰ä¸€¿U排列是满èƒö题æ„的(è¬å¦‚ä»Žå¤§åˆ°å°æŽ’åˆ—åQ‰ã€‚æ¢å¥è¯è¯ß_¼ŒæŽ’åºé—®é¢˜çš„å¯èƒ½æ€§ä¸€å…±æœ‰N!¿U。ä“Q何基于比较的排åºçš„基本æ“作å•元都æ˜?span lang=EN-US>“比较aå’?span lang=EN-US>b”åQŒè¿™ž®Þq›¸å½“äºŽçŒœæ•°å—æ¸¸æˆé‡Œé¢çš„一个问å¥ï¼Œæ˜„¡„¶˜q™ä¸ªé—®å¥çš„ç”æ¡ˆåªèƒ½æ˜¯“æ˜?span lang=EN-US>”æˆ?span lang=EN-US>“å?span lang=EN-US>”åQŒä¸€ä¸ªåªæœ‰ä¸¤¿U输出的问题最多åªèƒ½å°†å¯èƒ½æ€§ç©ºé—´åˆ‡æˆä¸¤åŠï¼Œæ ÒŽ®ä¸Šé¢çš„æ€èµ\åQŒæœ€ä½›_ˆ‡æ³•就是切æˆ?span lang=EN-US>1/2å’?span lang=EN-US>1/2。也ž®±æ˜¯è¯ß_¼Œæˆ‘们希望在比较了aå’?span lang=EN-US>b的大ž®å…³¾pÖM¹‹åŽï¼Œå¦‚æžœå‘现a<bçš„è¯å‰©ä¸‹çš„æŽ’列å¯èƒ½æ€§å°±å˜æˆN!/2åQŒå¦‚æžœå‘çŽ?span lang=EN-US>a>b也是剩下N!/2¿Uå¯èƒ½æ€§ã€‚由于å‡è®¾æ¯¿U排列的概率是函{‰çš„åQŒæ‰€ä»¥è¿™ä¹Ÿå°±æ„å‘³ç€æ”¯æŒ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的概率是å‡ç‰çš„,˜q™æ ·æˆ‘们ž®Þpƒ½ä¿è¯æ— 论如何都能ž®†å¯èƒ½æ€§ç¾ƒž®äؓ原æ¥çš„一åŠäº†åQ最优下界ã€?
ä¸€ä¸ªç›´æŽ¥çš„æŽ¨è®ºæ˜¯ï¼Œå¦‚æžœæ¯æ¬¡éƒ½åƒä¸Šé¢˜q™æ ·çš„完¾ŸŽæ¯”较,那么Nä¸ªå…ƒç´ çš„N!¿Uå¯èƒ½æŽ’列åªéœ€è¦?span lang=EN-US>log_2{N!}ž®±æŽ’查玩了,è€?span lang=EN-US>log_2{N!}˜q‘ä¼¼äº?span lang=EN-US>NlogNã€‚è¿™æ£æ˜¯å¿«æŽ’çš„å¤æ‚度ã€?
3.1 ä¸ÞZ»€ä¹ˆå †æŽ’比快排æ…?
å›žé¡¾ä¸€ä¸‹å †æŽ’çš„˜q‡ç¨‹åQ?
1. å»ºç«‹æœ€å¤§å †åQˆå †™å¶çš„å…ƒç´ å¤§äºŽå…¶ä¸¤ä¸ªå„¿å,两个儿ååˆåˆ†åˆ«å¤§äºŽå®ƒä»¬å„自下属的两个儿å... 以椾cÀLލåQ?
2. ž®†å †™å¶çš„å…ƒç´ å’Œæœ€åŽä¸€ä¸ªå…ƒç´ å¯¹è°ƒï¼ˆç›¸å½“äºŽå°†å †é¡¶å…ƒç´ åQˆæœ€å¤§å€û|¼‰æ‹¿èµ°åQŒç„¶åŽå°†å †åº•çš„é‚£ä¸ªå…ƒç´ è¡¥ä¸Šå®ƒçš„ç©º¾~ºï¼‰åQŒç„¶åŽè®©é‚£æœ€åŽä¸€ä¸ªå…ƒç´ 从™å¶ä¸Šå¾€ä¸‹æ»‘到æ°å½“çš„ä½ç½®åQˆé‡æ–îC‹Éå †æœ€å¤§åŒ–åQ‰ã€?
3. é‡å¤½W?span lang=EN-US>2æ¥ã€?
˜q™é‡Œçš„关键问题就在于½W?span lang=EN-US>2æ¥ï¼Œå †åº•çš„å…ƒç´ è‚¯å®šå¾ˆž®ï¼Œž®†å®ƒæ‹¿åˆ°å †é¡¶å’ŒåŽŸæœ¬å±žäºŽæœ€å¤§å…ƒç´ çš„ä¸¤ä¸ªå节ç‚ÒŽ¯”较,它比它们大的å¯èƒ½æ€§æ˜¯å¾®ä¹Žå…¶å¾®çš„。实际上它肯定å°äºŽå…¶ä¸çš„一个儿å。而大于å¦ä¸€ä¸ªå„¿åçš„å¯èƒ½æ€§éžå¸¸å°ã€‚于是,˜q™ä¸€‹Æ¡æ¯”较的¾l“æžœž®±æ˜¯æ¦‚率ä¸å‡½{‰çš„åQŒæ ¹æ®å‰é¢çš„分æžåQŒæ¦‚率ä¸å‡ç‰çš„æ¯”è¾ƒæ˜¯ä¸æ˜Žæ™ºçš„åQŒå› 为它òq¶ä¸èƒ½ä¿è¯åœ¨¾pŸç³•情况下也能将问题的å¯èƒ½æ€§å‰Šå‡åˆ°åŽŸæœ¬çš?span lang=EN-US>1/2。å¯ä»¥æƒ³åƒä¸€¿Uæžç«¯æƒ…况,如果a肯定ž®äºŽbåQŒé‚£ä¹ˆæ¯”è¾?span lang=EN-US>aå’?span lang=EN-US>bž®×ƒ¼šä»€ä¹ˆä¿¡æ¯ä¹Ÿå¾—ä¸åˆ?span lang=EN-US>—â€?/span>原本剩下多少å¯èƒ½æ€§è¿˜æ˜¯å‰©ä¸‹å¤šž®‘å¯èƒ½æ€§ã€?
åœ¨å †æŽ’é‡Œé¢æœ‰å¤§é‡˜q™ç§˜q‘ä¹Žæ— æ•ˆçš„æ¯”è¾ƒï¼Œå› äØ“è¢«æ‹¿åˆ°å †™å¶çš„é‚£ä¸ªå…ƒç´ å‡ ä¹Žè‚¯å®šæ˜¯å¾ˆž®çš„åQŒè€Œé ˜q‘å †™å¶çš„å…ƒç´ åˆå‡ 乎肯定是很大的,ž®†ä¸€ä¸ªå¾ˆž®çš„æ•°å’Œä¸€ä¸ªå¾ˆå¤§çš„æ•°æ¯”较,¾l“æžœå‡ ä¹Žè‚¯å®šæ˜?span lang=EN-US>“ž®äºŽ”的,˜q™å°±æ„味ç€é—®é¢˜çš„å¯èƒ½æ€§åªè¢«æŽ’除掉了很ž®ä¸€éƒ¨åˆ†ã€?
˜q™å°±æ˜¯äØ“ä»€ä¹ˆå †æŽ’æ¯”è¾ƒæ…¢åQˆå †æŽ’è™½ç„¶å’Œå¿«æŽ’ä¸€æ ·å¤æ‚度都是O(NlogN)ä½†å †æŽ’å¤æ‚度的常¾pÀL•°æ›´å¤§åQ‰ã€?
MacKay也æä¾›äº†ä¸€ä¸ªä¿®æ”¹ç‰ˆçš„å †æŽ’ï¼šæ¯æ¬¡ä¸æ˜¯ž®†å †åº•çš„å…ƒç´ æ‹¿åˆ°ä¸Šé¢åŽ»ï¼Œè€Œæ˜¯ç›´æŽ¥æ¯”è¾ƒå †é¡¶åQˆæœ€å¤§ï¼‰å…ƒç´ 的两个儿å,å³é€‰å‡º‹Æ¡å¤§çš„å…ƒç´ ã€‚ç”±äºŽè¿™ä¸¤ä¸ªå„¿å之间的大ž®å…³¾pÀL˜¯å¾ˆä¸¼‹®å®šçš„,两者都很大åQŒè¯´ä¸å¥½å“ªä¸ªæ›´å¤§å“ªä¸ªæ›´å°åQŒæ‰€ä»¥è¿™‹Æ¡æ¯”较的两个¾l“æžœž®±æ˜¯æ¦‚率å‡ç‰çš„了。具体å‚è€?span lang=EN-US>˜q™é‡Œã€?
3.2 ä¸ÞZ»€ä¹ˆå¿«æŽ’å…¶å®žä¹Ÿä¸æ˜¯é‚£ä¹ˆå¿?
我们考虑快排的过½E‹ï¼šéšæœºé€‰æ‹©ä¸€ä¸ªå…ƒç´ åš“è½´å…ƒç´?span lang=EN-US>”åQŒå°†æ‰€æœ‰å¤§äºŽèáuå…ƒç´ çš„ç§»åˆ°å·¦è¾¹ï¼Œå…¶ä½™¿UÕdˆ°åŒ™¾¹ã€‚æ ¹æ®è¿™ä¸ªè¿‡½E‹ï¼Œå¿«æŽ’的第一‹Æ¡æ¯”è¾ƒå°±æ˜¯å°†ä¸€ä¸ªå…ƒç´ å’Œè½´å…ƒç´ æ¯”è¾ƒï¼Œ˜q™ä¸ªæ—¶å€™æ˜¾è€Œæ˜“è§çš„æ˜¯ï¼Œ“大于”å’?span lang=EN-US>“ž®äºŽ”çš„å¯èƒ½æ€§å„å 一åŠã€‚这是一‹Æ¡æ¼‚亮的比较ã€?
然而,快排的第二次比较ž®×ƒ¸é‚£ä¹ˆé«˜æ˜Žäº†ï¼šæˆ‘们ä¸å¦¨ä»¤èáuå…ƒç´ ä¸?span lang=EN-US>pivotåQŒç¬¬ä¸€‹Æ¡æ¯”较结果是a1<pivotåQŒé‚£ä¹ˆå¯ä»¥è¯æ˜Žç¬¬äºŒæ¬¡æ¯”较a2也å°äº?span lang=EN-US>pivotçš„å¯èƒ½æ€§æ˜¯2/3åQè¿™å®ÒŽ˜“è¯æ˜ŽåQšå¦‚æž?span lang=EN-US>a2>pivotçš„è¯åQŒé‚£ä¹?span lang=EN-US>a1åQ?span lang=EN-US>a2åQ?span lang=EN-US>pivot˜q™ä¸‰ä¸ªå…ƒç´ 之间的关系ž®±å®Œå…¨ç¡®å®šäº†â€”—a1<pivot<a2åQŒå‰©ä¸‹æ¥çš„å…ƒç´ æŽ’åˆ—çš„å¯èƒ½æ€§æˆ‘们ä¸å¦¨è®°ä¸?span lang=EN-US>PåQˆä¸éœ€è¦å…·ä½“算出æ¥åQ‰ã€‚而如æž?span lang=EN-US>a2<pivot呢?那么a1å’?span lang=EN-US>a2的关¾pÕd°±ä»ç„¶æ˜¯ä¸¼‹®å®šçš„,也就是说åQŒè¿™ä¸ªåˆ†æ”¯é‡Œé¢å«æœ‰ä¸¤¿U情况:a1<a2<pivotåQŒä»¥å?span lang=EN-US>a2<a1<pivot。对于其ä¸ä“Q一¿Uæƒ…å†µï¼Œå‰©ä¸‹çš„å…ƒç´ æŽ’åˆ—çš„å¯èƒ½æ€§éƒ½æ˜?span lang=EN-US>PåQŒäºŽæ˜¯è¿™ä¸ªåˆ†æ”¯é‡Œé¢å‰©ä¸‹çš„æŽ’列å¯èƒ½æ€§å°±æ˜?span lang=EN-US>2P。所以当a2<pivot的时候,˜q˜å‰©ä¸?span lang=EN-US>2/3çš?nbsp; å¯èƒ½æ€§éœ€è¦æŽ’查ã€?
å†è¿›ä¸€æ¥ï¼Œå¦‚æžœ½W¬äºŒæ¥æ¯”较果真å‘çŽ?span lang=EN-US>a2<pivotçš„è¯åQŒç¬¬ä¸‰æ¥æ¯”较ž®±æ›´ä¸å¦™äº†ï¼Œæ¨¡ä»¿ä¸Šé¢çš„æŽ¨ç†ï¼Œa3<pivot的概率将会是3/4åQ?
˜q™å°±æ˜¯å¿«æŽ’也ä¸é‚£ä¹ˆå¿«çš„åŽŸå› ï¼Œå› äØ“å®ƒä¹Ÿæ²¡æœ‰åšåˆ°æ¯æ¬¡æ¯”较都能ž®†å‰©ä¸‹çš„å¯èƒ½æ€§ç 掉一åŠã€?
3.3 鸡排ä¸ÞZ»€ä¹ˆåˆé‚£ä¹ˆå¿«å‘¢åQ?
ä¼ ç»Ÿçš„è§£é‡Šæ˜¯åQ?span lang=EN-US>åŸºæŽ’ä¸æ˜¯åŸÞZºŽæ¯”较的,所以ä¸å…ähœ‰åŽè€…çš„å±€é™æ€§ã€‚è¯æ˜¯æ²¡é”™ï¼Œä½†å…¶å®žè¿˜å¯ä»¥ž®†å®ƒå’ŒåŸºäºŽæ¯”较的排åºåšä¸€ä¸ªç±»æ¯”ã€?
基排的过½E‹ä¹Ÿè®¸æ˜¯æºäºŽæˆ‘们ç†é¡ºä¸€å‰¯ç‰Œçš„过½E‹ï¼šå¦‚æžœä½ æœ‰NåQ?span lang=EN-US>N<=13åQ‰å¼ 牌,乱åºåQŒå¦‚何熙åºå‘¢åQŸæˆ‘们å‡è±¡æ¡Œä¸Šæœ‰å三个佾|®ï¼Œç„¶åŽæˆ‘们ž®†æ‰‹é‡Œçš„ç‰Œä¸€å¼ ä¸€å¼ æ”¾å‡ºåŽ»åQŒå¦‚果是3åQŒå°±æ”‘Öœ¨ä½ç½®3上,如果æ˜?span lang=EN-US>JåQŒå°±æ”‘Öœ¨ä½ç½®11上,攑֮Œäº†ä¹‹åŽä»Žä½ç½®1åˆîC½¾|?span lang=EN-US>13攉™›†æ‰€æœ‰çš„牌(没有牌的ä½ç½®ä¸Šä¸æ”‰™›†ä»ÖM½•牌)ã€?
我们å¯ä»¥˜q™æ ·æ¥ç†è§£åŸºæŽ’é«˜æ•ˆçš„æœ¬è´¨åŽŸå› åQšå‡è®‘Ö‰iå¼ ç‰Œéƒ½å·²¾l放åˆîCº†å®ƒä»¬å¯¹åº”的佾|®ä¸ŠåQŒç¬¬i+1å¼ ç‰Œæ”‘Ö‡ºåŽÈš„æ—¶å€™ï¼Œå®žé™…上就相当äº?span lang=EN-US>“一下唞®Þq¡®ç«‹äº†å®ƒå’Œå‰?span lang=EN-US>iå¼ ç‰Œçš„å¤§ž®å…³¾p»ï¼Œç”?span lang=EN-US>O(1)çš„æ“作就ž®†è¿™å¼ 牌æ£ç¡®åœ°æ’入到了å‰iå¼ ç‰Œä¸çš„æ£ç¡®ä½ç½®ä¸Šï¼Œ˜q™ä¸ªæ•ˆæžœž®Þq›¸å½“于æ’入排åºçš„第iè½®åŽŸæœ¬éœ€è¦æ¯”è¾?span lang=EN-US>O(i)‹Æ¡çš„åQŒçŽ°åœ¨åªéœ€è¦?span lang=EN-US>O(1)了ã€?
但是åQŒäؓ什么基排能够达到这个效果呢åQŸä¸Šé¢åªæ˜¯è§£é‡Šäº†˜q‡ç¨‹åQŒè§£é‡Šäº†˜q‡ç¨‹ä¸ä»£è¡¨è§£é‡Šäº†æœ¬è´¨ã€?
å½?span lang=EN-US>iå¼ ç‰Œæ”‘Öˆ°ä½ä¹‹åŽï¼Œæ”„¡½®½W?span lang=EN-US>i+1å¼ ç‰Œçš„æ—¶å€™æœ‰å¤šå°‘¿Uå¯èƒ½æ€§ï¼Ÿå¤§çº¦i+1¿Uï¼Œå› äØ“å‰?span lang=EN-US>iå¼ ç‰Œž®?span lang=EN-US>13个佾|®åˆ†å‰²æˆäº?span lang=EN-US>i+1个区é—?span lang=EN-US>—â€?/span>½W?span lang=EN-US>i+1å¼ ç‰Œå¯ä»¥è½åœ¨ä»ÀL„一个区间。所以放¾|®ç¬¬i+1å¼ ç‰Œž®±å¥½æ¯”是询问˜q™æ ·ä¸€ä¸ªé—®é¢˜ï¼š“˜q™å¼ 牌è½åœ¨å“ªä¸ªåŒºé—´å‘¢åQ?span lang=EN-US>”而这个问题的½{”案æœ?span lang=EN-US>i+1¿Uå¯èƒ½æ€§ï¼Ÿæ‰€ä»¥å®ƒž®±å°†å‰©ä¸‹æ¥çš„å¯èƒ½æ€§å‡åˆ†æˆäº?span lang=EN-US>i+1份(æ¢å¥è¯è¯´åQŒç 掉了i/i+1çš„å¯èƒ½æ€§ï¼åQ‰ã€‚å†çœ‹çœ‹åŸÞZºŽæ¯”较的排åºå§åQšç”±äºŽæ¯‹Æ¡æ¯”è¾ƒåªæœ‰ä¸¤¿U结果,所以最多åªèƒ½å°†å‰©ä¸‹çš„å¯èƒ½æ€§ç 掉一åŠã€?
˜q™å°±æ˜¯äؓ什么基排è¦å¿«å¾—多。而所有基于比较的排åºéƒ½é€ƒè„±ä¸äº†NlogN的宿命ã€?
4. ä¿¡æ¯è®ºï¼ä¿¡æ¯è®ºï¼Ÿ
本æ¥å‘¢ï¼ŒMacKay写那½‹‡æ–‡ç« 是想用信æ¯è®ºæ¥è§£é‡Šä¸ÞZ»€ä¹ˆå †æŽ’æ…¢åQŒä»¥åŠäؓ什么快排也慢的ã€?span lang=EN-US>MacKayåœ¨ä»–çš„æ–‡ç« ä¸çš„解释是åQŒåªæœ‰æå‡ºæ¯¿Uç”æ¡ˆçš„æ¦‚率都函{‰çš„问题åQŒæ‰èƒ½èŽ·å¾—æœ€å¤§ä¿¡æ¯é‡ã€‚然而,仔细一惻I¼Œå…¶å®ž˜q™é‡Œä¿¡æ¯è®ºåÆˆä¸æ˜¯å› ,而是果。这里ä¸éœ€è¦ç”¨ä¿¡æ¯è®ºå°±å®Œå…¨èƒ½å¤Ÿè§£é‡ŠåQŒè€Œä¸”更明白。信æ¯è®ºåªæ˜¯å¯¹è¿™ä¸ªè§£é‡Šçš„一个åÅžå¼åŒ–。当ç„Óž¼Œä¿¡æ¯è®ºåœ¨å…¶å®ƒåœ°æ–¹˜q˜æ˜¯æœ‰åº”用的。但˜q™é‡Œå…¶å®žç”¨ä¸ç€ä¿¡æ¯è®ø™¿™ä¹ˆé‡é‡çñ”的东西(也许具体计算一些数æ®çš„æ—¶å€™æ˜¯éœ€è¦çš„åQ‰ï¼Œè€Œæ˜¯åªéœ€è¦ä¸€¿U看问题的本质视角:ž®†æŽ’åºé—®é¢˜çœ‹æˆå’ŒçŒœæ•°å—ä¸€æ øP¼Œæ˜¯é€šè¿‡é—®é—®é¢˜æ¥¾~©å°/排除åQ?span lang=EN-US>narrow downåQ‰ç»“果的å¯èƒ½æ€§åŒºé—ß_¼Œ˜q™æ ·ä¸€æ¥ï¼Œž®×ƒ¼šå‘现åQ?span lang=EN-US>“最好的问题”ž®±æ˜¯é‚£äº›èƒ½å¤Ÿå‡åˆ†æ‰€æœ‰å¯èƒ½æ€§çš„问题åQŒå› 为那æ ïLš„è¯ä¸½Ž¡é—®é¢˜çš„½{”案如何åQŒéƒ½èƒ½æŽ’除掉k-1/kåQ?span lang=EN-US>k为问题的½{”案有多ž®‘ç§è¾“出—â€?/span>猜数å—é‡Œé¢æ˜¯2åQŒç§°çƒé‡Œé¢æ˜¯3åQ‰ç§å¯èƒ½æ€§ï¼Œè€Œä¸å‡è¡¡çš„问题æ€ÖM¼šæœ‰ä¸€ä¸ªæˆ–ä¸€äº›ç”æ¡ˆåˆ†æ”¯æŽ’除掉的å¯èƒ½æ€§è¦ž®äºŽk-1/k。于是ç–略的下界ž®Þp¢«æ‹–ç¯äº†ã€?
5. ž®ç»“
˜q™çš„¼‹®æ˜¯“ž®ç»“”åQŒå› ä¸ÞZ¸¤ç‚¹ï¼š
1. ˜q™ä¸ªé—®é¢˜å¯ä»¥æœ‰ä¿¡æ¯è®ºçš„ç†è®ø™§£é‡Šï¼Œè€Œä¿¡æ¯è®ºåˆ™æ˜¯ä¸€ä¸ªç›¸å½“大的领域了ã€?span lang=EN-US>
2. æ–‡ä¸æåˆ°çš„è¿™¿U看问题的视角除了用于排åºã€ç§°çƒï¼Œ˜q˜èƒ½å¤Ÿè¿ç”¨åˆ°å“ªäº›é—®é¢˜ä¸Šï¼ˆæ¯”如æœçƒ¦åQ‰ã€?span lang=EN-US>
Update(06/13/2008) : å¾å®¥åœ¨è®¨è®ÞZ¸¾l§ç®‹æåˆ°åQ?span lang=EN-US>
å¦å¤–åQŒè¿™å‡ å¤©æˆ‘é‡æ–°æŠŠTAOCP ½W¬ä¸‰å?span lang=EN-US>(½W¬äºŒç‰?span lang=EN-US>)¾˜Õd‡ºæ¥çœ‹äº†çœ‹ Knuth 怎么说这个问题的, å‘现真是牛大了:
先说性能åQ?
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
˜q™é‡Œ, Knuth åŒå¦å‘现一般情况下 heapsort 表现很ä¸å¥?span lang=EN-US>. 于是åQŒåœ¨ä¸‹æ–‡ä»–å°±è¯ß_¼Œä¹ 题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的方法是一æ ïLš„ã€?span lang=EN-US>(我觉å¾?span lang=EN-US>DMK是看了这个论文或è€?span lang=EN-US>TAoCPçš?span lang=EN-US>) ˜q™é‡Œè¯?span lang=EN-US> by halfåQŒå°±æ£å¥½å’Œå¿«æŽ’å·®ä¸å¤šäº†ã€?
å†è¯´ä¿¡æ¯è®ºåˆ†æžï¼š
åœ?span lang=EN-US>5.3.1 (pp181) 高爷爷就è¯?span lang=EN-US>, “排åºé—®é¢˜å¯ä»¥çœ‹æˆæ˜¯ä¸€ä¸ªæ ‘上的鸟儿排排站的问题. (˜q˜ç‰¹åœ°ç”»äº†ä¸€‹‚‰| ‘), 下一ŒDµå°±è¯?span lang=EN-US>, 其实˜q™ä¸ªä¹Ÿæœ‰½{‰äh说法, ž®±æ˜¯ä¿¡æ¯è®?span lang=EN-US>, 我们从称çƒé—®é¢˜è¯´èµ?span lang=EN-US>...”
ç„¶åŽåŽé¢ä¸€ç›´è®²ä¿¡æ¯è®ºå’Œæœ€ž®æ¯”较排åº?span lang=EN-US>...
高爷çˆïLœŸä¸æ„§æ˜¯å§“高的åQŒå›§rz..
æˆ‘ä¸ªäºø™§‰å¾—ç®—æ³•é‡Œé¢æžå¤§ä¸€éƒ¨åˆ†å†…容是如何有效地˜q›è¡Œæœçƒ¦åQŒè¿™é‡Œçš„"有效"å¯ä»¥åˆ†äØ“åQšé¿å…ä¸å¿…è¦çš„计½Ž—(如A*寻èµ\ä»¥åŠæ‰€æœ‰çš„å¯å‘å¼å‰ªæžï¼‰åQŒç¼“å˜é‡å¤è®¡½Ž—(如所æœ?shy;的动æ€è§„划)。当ç„Óž¼ŒçŸ¥é“˜q™äº›è·Ÿå…·ä½“的设计å‡ÞZ¸€ä¸ªç®—法至ž®‘还有å万八åƒé‡ŒåQŒåªèƒ½è¯´æœ‰äº†˜q™ä¸ªå¤§ä½“çš„æ€èµ\åQŒå°±å¯ä»¥ä»Žè¿™ä¸¤ä¸ªè§’度åŽÕd®¡è§†æ‰‹å¤´çš„问题åQŒå¾€å¾€æ˜¯ä¼šæœ‰å¯å‘æ„ä¹?shy;çš„çŞ了。如何é¿å…ä¸å¿…è¦çš„计½Ž—?也有很多 rules of thumb å¯ä»¥éµåó@åQŒå¦‚å¯å‘å¼å‰ªæžé‡Œé¢å°±è¦æ±‚去设计一个最优下界,而最一般的æ€èµ\åˆ™æ˜¯ä½¿åŠ²çž…çž…é—®é¢˜é‡Œé¢æœ‰ä»€ä¹ˆæ¡ä»¶æ˜¯æ²¡æœ‰åˆ©ç”¨çš„,˜q™äº›æ¡äšg¾l„åˆèµäh¥å¯ä»¥å¾—出什么性质åQŒä¹Ÿè®¸æŸä¸ªæ€§è´¨ž®Þpƒ½å¤Ÿè¢«åˆ©ç”¨æ¥å‡æŽ‰ä¸€å¤§å †è®¡ç®—åQŒè‡³äºŽå¦‚何从题目æ¡äšg推出有äh值的性质åQŒæœ‰ä¸¤ä¸ªåŠžæ³•åQŒä¸€æ˜¯è¯•错(惛_ˆ°çš„结论都¾l™å†™å‡ºæ¥åQŒé™¶å“²è½©åœ?Solving Mathematical Problems 里颞®±æåˆ°è¿‡˜q™ä¸ªåŠžæ³•ã€‚ï¼‰åQ›å¦ä¸€ä¸ªæ–¹å‘则是脑袋里æ£ç€æƒŒ™¦å®žçŽ°çš„ç›®çš„å¾€åæ–¹å‘å½’¾U¦ã€‚如何缓å˜é‡å¤è®¡½Ž—?½Ž€å•的动æ€è§„划问题如fibonacci数列计算åQŒå…¶é‡å¤è®¡ç®—是éžå¸¸æ˜Žæ˜„¡š„åQŒè®¡½Ž—çš„˜q‡ç¨‹æœ¬èínž®±æŒ‡æ˜Žäº†å“ªäº›è®¡ç®—是é‡å¤çš„åQˆAn ™å¹çš„计算是é‡å¤çš„åQ‰â€”—当ç„Óž¼Œæ£å¦‚æ—©å‰é‚“åŒå¦å‘的一个题ç›?lt;https://groups.google.com/group/pongba/browse_frm/thread/2ca1f2bda0c8...>里é¢è¯´çš„åQŒå…¶å®žfibonacci数列计算里é¢çš„çº¿æ€§å˜æ¢æœ¬íw«ä¹Ÿæ˜¯æœ‰é‡å¤è®¡ç®—的——åŽè€…便是更éšè”½çš„é‡å¤è®¡½Ž—了åQŒä¸€ä¸?non-trivial 的动æ€è§„划问题往往涉åŠåˆ°éžå¸”Ršè”½çš„é‡å¤è®¡ç®—åQŒæˆ–者更隄¡š„æ˜¯ï¼Œä½ é历组åˆç©ºé—´çš„æ–¹å¼å†›_®šäº†ä½ 所能够¾~“å˜çš„é‡å¤è®¡½Ž—到底有多少åQŒä¹Ÿè®¸æŸä¸ªé历方å¼ä¹‹ä¸‹å°±æ²¡æœ‰åŠžæ³•åŽ?shy;¾~“å˜è®¡ç®—。当ç„Óž¼Œ½Ž—法的范畴其实是很大的,½Ž—法是一个AI-Complete 的问题,所有的 Problem-Solving ˜q‡ç¨‹éƒ½å¯ä»¥å«åšç®—æ³•ã€‚åªæ˜¯æœ‰å¾ˆå¤šå®žé™…当ä¸çš„算法会掉入以上两类而已ã€?nbsp;
½W¬äºŒä¸ªé—®é¢˜æˆ‘举一个例å:ä¸åƒå¾ˆå¤šç‰›äh在高ä¸å’Œæœ¬ç§‘ž®Þq«žèµ›å¥–ç‰Œä¸€å †ï¼Œæˆ‘ç›´åˆ°å¤§å››çš„æ—¶å€™è¿˜ä¸çŸ¥é“什么是动æ€è§„åˆ’ï¼Œå› äØ“æœ¬ç§‘å››å¹´æˆ‘ä¸€ç›´åªå¯¹åº•层技术感兴趣åQŒæœ€å–œæ¬¢çœ?比如 Petzold 的《编ç 的奥秘》和 Richter çš„ã€?NET 框架½E‹åºè®¾è®¡ã€‹ï¼ˆäº‹å®žä¸Šè¿™æ˜¯æˆ‘看的½W¬ä¸€æœ¬è‹±æ–‡åŽŸç‰ˆä¹¦åQ‰è¿™¾cÖM¹¦ã€‚ç ”ä¸€çš„æ—¶å€™ç”±äºŽæ–¹å‘æ˜¯è‡ªç„¶è¯è¨€å¤„ç†åQŒçœ‹çš„第一½‹?paper æ˜?Rabiner çš? A Tutorial on Hidden Markov Models and Selected Applications in Speech
Recognition 。Paper 的内容倒是完全能够ç†è§£åQŒä½†æ˜¯ç†è§£å…¶å®žåªæ˜¯ç¬¬ä¸€æ¥ï¼Œæˆ‘å‘现ç†è§£äº†ä¹‹åŽå¾ˆå¿«ž®±å¿˜æŽ‰äº†åQŒè¿™ž®Þp¯´æ˜Žç†è§£å¾—ä¸å¤Ÿæ·±åˆ»ã€‚比如里é¢çš„ Viterbi ½Ž—法åQŒèŠ±äº†æ—¶é—´åŽ»ç†è§£åQŒä½†æ˜¯ä¸€è½¬å¤´å¾ˆå¿«åˆå¿˜æŽ‰äº†ã€‚一òq´åŽå› äØ“æœºç¼˜å·§åˆåQŒå¯¹½Ž—法å‘生了一ŒD늟暂的兴趣åQŒåƈå¦ä¹ 了一些基¼‹€çš„算法,ž®¤å…¶æ˜¯ç®—æ³•çš„æ€æƒ³åQŒå› ä¸ºæ€æƒ³æ˜¯æœ‰½I?shy;çš„ï¼Œä½†ç®—æ³•æ˜¯æ— ç©·çš„ï¼Œž®¤å…¶æ˜¯é¢˜ç›®æ˜¯åšä¸å®Œçš„。之åŽä¸€ŒD‰|—¶é—ß_¼Œ¼„°åéyåˆéœ€è¦ç¿»ä¸€¾˜»é©¬å¯å¤«æ¨¡åž‹åQŒæœå‡ºå´å†›çš„æ•°å¦ä¹‹ç¾Žä»¥åŠé‚£ç¯‡ Paper åQŒå‘çŽ?Viterbi ½Ž—法其实ž®±æ˜¯æœ€½Ž€å•的一¾cÕdЍæ€è§„划,ç”׃ºŽå¯¹äºŽåЍæ€è§„划的ç†è§£æ·±åˆ»äº†å¾ˆå¤šï¼Œæ‰€ä»¥å¯¹äº?Viterbi ½Ž—法åQŒåœ¨è„‘袋里é¢è®îC½çš„ä¸å†æ˜¯ä»€ä¹?Forward Variable/Backward Variable
之类的技术细节,而是它的本质åQŒäºŽæ˜¯ä¾¿ä¸å†å®ÒŽ˜“忘掉åQŒè€Œå³ä¾¿å¿˜æŽ‰ï¼Œž®±å¦‚åºžåŠ èŽ±æ‰€è¯ß_¼Œä¹Ÿå¯ä»¥éžå¸¸è¿…速的ž®†ç®—法的¾l†èŠ‚è‡ªè¡Œæž„å¾å‡ºæ¥ã€?
其实我相信这æ ïLš„ä¾‹åæ˜¯æ•°ä¸èƒœæ•°çš„åQŒæ‰€ä»¥æˆ‘˜q™ä¸ªåªæ˜¯½Ž—一ä¸?Yet Another Example åQŒç”±äºŽå¯¹æˆ‘æ¥è¯´æ¯”较特ŒDŠï¼Œæ‰€ä»¥å°è±¡è¾ƒä¸ºæ·±åˆ…R€?
˜q™ä¸ªä¾‹å是关äº?ç†è§£"的。有时候算法也会éžå¸¸æœ‰ç”¨ï¼Œå¦‚有一‹Æ¡å†™½E‹åºæ—‰™œ€è¦ç”¨åˆ?LCS å’?Edit-Distance åQˆè¿™æ ïLš„æœÞZ¼šå¾ˆå°‘åQŒä½†é‡åˆ°äº†æ—¶å¦‚æžœä¸çŸ¥é“有多项å¼å¤æ‚度的算法就很悲惨了åQ‰ï¼Œè€Œåšæœºå™¨å¦ä¹ å’Œæ•°æ®æŒ–掘的更是ž®‘ä¸äº†ä¸€å¨å¨çš„算法,如果光是ç†è§£åˆ«ähçš„åšæ³•ç„¶åŽå®žçŽ?shy;出æ¥åQŒé‚£ä¹ˆå¯¹½Ž—æ³•çš„æ€æƒ³çš„æŠŠæ¡æœ‰åŠ©äºŽç†è§£å’Œè®°å¿†ï¼›å¦‚果需è¦è‡ªå·Þp®¾è®¡ç®—法,那就需è¦ç®—法基¼‹€çŸ¥è¯†çš„辅助æ‰è¡Œäº†ã€‚ç»å¤§å¤šæ•îCh应该属于å‰è€…ã€?
å¦ä¹ åˆîC»€ä¹ˆç¨‹åº¦ï¼Ÿæˆ‘觉得视人群而定。如果åšåº•层开å‘ã€åº”用开å‘ã€ç³»¾lŸå¼€å‘,åªè¦çŸ¥é“一个大概就å¯ä»¥äº†ï¼ŒçŸ¥é“¾l典的数æ®ç»“构和½Ž—法没有ä»ÖM½•å›°éš¾åQŒè€Œä¸”忣¾lå…¸½Ž—法都有现æˆçš„库å¯ç”¨ã€‚对于有兴趣åšä¸€ç‚?research 沾边的事情的人,则需è¦äº†è§£è¿™äº›ç®—法背åŽçš„一般性æ€èµ\是什么,å¦åˆ™æ¥ä¸€ä¸ªç‰¹å®šçš„½Ž—æ³•ä½ å°±ç‰¹å®šçš„ç†è§£è®°å¿†ä¸€ä¸‹ï¼Œè‚¯å®šä¸ç‰¢é ,而且‹¹ªè´¹å¤§è„‘资æºã€‚å¯¹äºŽæž real deal çš?original research 的那ž®±éœ€è¦å¹¿æ³›çš„知识¿U¯ç¯äº†ï¼Œå…‰çŸ¥é“一般性æ€èµ\都ä¸å¤Ÿã€?
å¦ä¸€æ–šw¢åQŒæˆ‘觉得å¦å®Œäº†ç»å…¸ç®—法,深刻ç†è§£äº†ç®—法背åŽçš„一般性æ€èµ\之åŽåQŒå¦‚果冘q›ä¸€æ¥åŽ»çŽ©é¢˜ç›®ï¼Œåšé¢˜åº“。效益å´ä¸æ˜¯å¾ˆå¤§çš„ï¼Œå› äØ“åˆ€¼‚¨äº†æ˜¯è¦ç”¨çš„åQŒçŽ©é¢˜ç›®åšé¢˜åº“就是进一æ¥ç£¨åˆ€è€Œä¸ç”¨ï¼ˆä¸åŽ»è§£å†³å®žé™…é—®é¢˜åQŒèƒ½å¤Ÿäñ”生媄å“力的,或生产力的问题)。实际上åšäº†ä¸€äº›é¢˜ç›®ä¹‹åŽå°±å®Œå…¨æ²¡å¿…è¦è¿›ä¸€æ¥åšé¢˜ç›®äº†ï¼Œå› äØ“åšæ¥åšåŽ»åQŒæ‹¼çš„基本也ž®?shy;是è°çš„知识积累多åQˆå¥—路多åQ‰ï¼Œè°çš„è€å¿ƒå¤§ï¼ˆè‚¯ä‹É劲去¼‚¨ä¸€é“题目)åQ›å®žé™…上è°ä¹Ÿä¸æ¯”è°ç¬¨åQŒåˆ°æœ€åŽåŒºåˆ«å°±åŸºæœ¬ä¸Šæ˜¾éœ²åœ¨çŸ¥è¯†¿U¯ç¯å’Œè€å¿ƒä¸Šäº†ã€‚所以接ç€åšï¼Œåˆ€ä¹Ÿä¸ä¼šç£¨å¾?shy;更锋利,更何况大好的时光应该åŽÕdšç‚ÒŽœ‰æ„ä¹‰çš„äº‹æƒ…ï¼ˆå¦‚æžœæ˜¯äØ“äº?fun 而åšé¢˜çš„åQŒé‚£ä¹ˆæœ‰æ„ä¹‰çš„äº‹æƒ…åŒæ ·ä¹Ÿå¯ä»¥æ˜?extremely funåQ‰ï¼Œæ¯”如我觉得最å¸å¼•äºÞZ¹Ÿæœ€æ ÒŽœ¬çš„问题就是äh工智能问题(æƒÏxƒ³çœ‹ï¼Œäºø™„‘是世界上˜q„ä»Šä¸ºæ¢æ‰€çŸ¥æœ€ä¸ºå¤æ‚çš„¾l“æž„åQŒè¿™ä¸ªç»“构具备了认识自然ç•?规律"的能力,å…?shy;备了认识"自我"的能力,具备了归¾U›_’Œæ¼”绎推ç†çš„能力,¾cÀL¯”的能力,具备了难以置信的å¯å‘弿œç´¢èƒ½åŠ›ï¼Œå…·å¤‡å®Œç¾Žçš„æ¨¡å¼è¯†åˆ«èƒ½åŠ›ï¼Œè€Œæ ¹æ®è¿›åŒ–论的观点,˜q™æ ·çš„结æž?shy;居然仅仅是通过å˜å¼‚——ç›é€‰å¾—æ¥çš„åQŒå¦‚果真有上å¸ï¼Œé‚£ä¹ˆåˆ©ç”¨ä¸Šå¸èµ‹äºˆæˆ‘ä»¬çš„å¤§è„‘åŽ»ç ´è§£ä¸Šå¸˜q™ä¸ª™å¶çñ”牛逼程åºå‘˜å†™çš„½E‹åºâ€”—ähè„‘çš„¿U˜å¯†åQŒè¿˜æœ‰æ¯”˜q™æ›´å¸¦åŠ²å„¿çš„äº‹æƒ…å?shy;åQŸï¼‰åQŒæ‰€ä»¥æˆ‘觉得有那么好的基¼‹€çš„牛人,ä¸åŽ»ç›´é¢çœŸæ£ fundamental çš?problems åQŒå°±å¯æƒœäº†ï¼Œ™åÈŸ¥é¢˜ç›®æ˜¯æ°¸˜qœåšä¸å®Œçš„,一个公ç†ç³»¾lŸçš„定ç†ä¹Ÿæ˜¯æ°¸è¿œæŽ¨å¯¼ä¸å®Œçš„,永远å¯ä»¥è®¾è®¡å‡ºé¢˜ç›®æ¥¾l™ä½ åšï¼Œä½†æ˜¯çœŸæ£çš„é—®é¢˜å…¶å®žåªæœ‰ä¸€ä¸ªã€‚如果穷举ä¸äº†ä¸–界上所有的问题åQŒè‡³ž®‘å¯ä»¥ä‹D出那些有‘£ã€æœ‰æ„义的问é¢?)
--
刘未�pongba)
Blog|C++的罗‹¹®å®«
http://blog.csdn.net/pongba