ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>婷婷久久香蕉五月综合加勒比,久久久久国产,久久久精品国产Sm最大网站http://m.shnenglu.com/AutomateProgram/category/8931.html当音ä¹å’Œä¼ è¯´åœ¨æ·±å¤œä¸­æ²‰å¯‚åŽï¼Œ½E‹åºçš„æ¯ä¸ªå­—½W¦è¿˜åœ¨èŸ©åЍï¼zh-cnMon, 13 Feb 2012 21:56:36 GMTMon, 13 Feb 2012 21:56:36 GMT60在windows中编译sphinx1.10beta--coreseek(¾cÖM¼¼)(¾˜»è¯‘)http://m.shnenglu.com/AutomateProgram/archive/2012/02/13/165470.html漂漂漂漂Mon, 13 Feb 2012 03:50:00 GMThttp://m.shnenglu.com/AutomateProgram/archive/2012/02/13/165470.htmlhttp://m.shnenglu.com/AutomateProgram/comments/165470.htmlhttp://m.shnenglu.com/AutomateProgram/archive/2012/02/13/165470.html#Feedback0http://m.shnenglu.com/AutomateProgram/comments/commentRss/165470.htmlhttp://m.shnenglu.com/AutomateProgram/services/trackbacks/165470.html在windows中编译sphinx1.10beta

原文地å€å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)



漂漂 2012-02-13 11:50 å‘表评论
]]>
‹¹…è°ˆshuffle½Ž—法--播放器的å¦ä¸€¿Uéšæœºç®—æ³?/title><link>http://m.shnenglu.com/AutomateProgram/archive/2010/10/11/129458.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 11 Oct 2010 09:25:00 GMT</pubDate><guid>http://m.shnenglu.com/AutomateProgram/archive/2010/10/11/129458.html</guid><wfw:comment>http://m.shnenglu.com/AutomateProgram/comments/129458.html</wfw:comment><comments>http://m.shnenglu.com/AutomateProgram/archive/2010/10/11/129458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/AutomateProgram/comments/commentRss/129458.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/AutomateProgram/services/trackbacks/129458.html</trackback:ping><description><![CDATA[原文地å€åQ?a >http://www.cnblogs.com/huaping-audio/archive/2008/09/09/1287985.html</a><br><br> <p>shuffle½Ž—法åQŒæˆ‘把他å«åš‹z—牌½Ž—法åQŒå®ƒçš„目标正好与å„ç§çš„sort½Ž—法相ååQŒå³æŠŠä¸€ä¸ªæœ‰åº?或者无åº?的一¾pÕdˆ—å…ƒç´ æ‰“äØ•åQŒä»¥æ»¡èƒö需求ã€?br><br>举个两例å­ï¼Œå¤§å®¶éƒ½çŸ¥é“扑克牌åQŒæˆ‘们毋ơ都需è¦åœ¨æ‘¸ç‰Œä¹‹å‰æŠŠç‰Œ‹z—掉åQŒç”¨æ¥è®©æ¯ä¸ªäººæ‘¸åˆ°æ¯å¼ ç‰Œçš„æ¦‚率尽é‡ç›¸½{‰ï¼Œå¢žåŠ æ¸¸æˆçš„éšæœºæ€§å’Œä¹è¶£åQ›è¿˜æœ‰éŸ³é¢‘播攑֙¨åQŒæœ‰ä¸€äº›ähä¸å–œ‹Æ¢é¡ºåºæ’­æ”¾ï¼Œè€Œå–œ‹Æ¢ä‹Éç”¨éšæœºæ’­æ”?å…¶å®žéšæœºæ’­æ”¾åˆ†äؓ两ç§,randomå’ŒshuffleåQŒåŽæ–‡ä¼šä»‹ç»åˆ?åQŒæ¯”如iPod Shuffleçš„å–点之一ž®±æ˜¯“ä½ æ°¸˜qœä¸çŸ¥é“ä½ å°†è¦å¬åˆ°çš„下一首歌曲是什ä¹?#8221;。至ž®‘ï¼Œå¦‚æžœè¦æ¨¡æ‹Ÿæ‰‘克牌游æˆåQŒæˆ–者åšéŸ³é¢‘播放器,都è¦ä½¿ç”¨shuffle½Ž—法åQŒè€ŒäºŒè€…çš„shuffle½Ž—æ³•å´æœ‰ä¸€äº›åŒºåˆ«ï¼Œä¸€ä¸ªæ˜¯ä¸€‹Æ¡æ€§çš„‹z—牌åQŒå¦ä¸€ä¸ªåˆ™æ˜¯æ¯‹Æ¡å–一首歌。那么怎么实现他们呢?<br><br>扑克牌的shuffle½Ž—法åQ?br><br>下é¢ä¸ÞZº†æ–¹ä¾¿å’Œå®¹æ˜“读懂,我都用扑克牌æ¥ä½œä¾‹å­åQšæ¡Œä¸Šæœ‰n张牌åQŒåƈ且对桌å­ä¸Šçš„牌进行标åøP¼Œä»?直到n-1。我们的目的是洗˜q™äº›ç‰Œã€?br><br>一个比较容易想到的æ–ÒŽ³•是,桌å­ä¸Šæœ‰n张扑克牌åQŒæˆ‘½W¬i‹Æ¡ä»Žæ¡Œå­ä¸Šç­‰æ¦‚çŽ‡éšæœºå–一张扑克牌åQŒä½œä¸ºæ´—牌åŽç‰Œå †çš„第i张扑克牌åQŒé‚£ä¹ˆè¿™ä¸ªç®—法实现è“væ¥åº”该是˜q™æ ·çš„:<br><br>伪代ç ï¼š<br>for i <- 0 to n - 1<br>do d <- Random mod (n - i)<br>   shuffle[i] <- deck[d]<br>   deck[d] <- deck[n - i]<br><br>其中åQŒdeck是洗牌å‰çš„åºåˆ?0~n-1)åQŒshuffle是洗牌åŽçš„åºåˆ?0~n-1)åQŒç¬¬i‹Æ?ä»?开始数)在剩下的n-i张牌里等概率的å–一张牌åQŒæŠŠå®ƒæ”¾åˆ°shuffle里。而deck[d] = deck[n - i]˜q™å¥è¾‘Öˆ°çš„æ•ˆæžœæ˜¯åˆ é™¤å–过的牌ã€?br><br>˜q™ä¸ªæ–ÒŽ³•çš„æ—¶é—´å¤æ‚度是O(n)åQŒå·²¾lå¯ä»¥æŽ¥å—了åQŒä½†˜q™ä¸ªæ–ÒŽ³•˜q˜ä¸å¤Ÿå¥½åQŒå› ä¸ºæˆ‘们需è¦ä¸¤ä¸ªé•¿åº¦äØ“n数组。其实å¯ä»¥å¾ˆå®ÒŽ˜“å¾—å¾—åˆîC¸‹é¢çš„æ–ÒŽ³•åQŒè§£å†³ç©ºé—´çš„问题åQ?br>伪代ç ï¼š<br>for i <- 0 to n - 1<br>do d <- Random mod (n - i)<br>   swap(deck[d], deck[n - i])<br><br>˜q™æ ·åQŒè¿™ä¸ªç®—法的é“熞®±æœ‰äº›åƒé€‰æ‹©æŽ’åºäº†ï¼Œ½W¬i‹Æ?ä»?开始数)¼‹®å®š½W¬n-i个元素的原佾|®ï¼Œòq¶ä¸”交æ¢ä¸¤ä¸ªä½ç½®ä¸Šçš„å…ƒç´ ã€‚å®ƒçš„å¤æ‚读ä»ç„¶æ˜¯O(n)åQŒè€Œåªéœ€è¦?个é¢å¤–çš„½Iºé—´æ¥å‚¨å­˜äº¤æ¢ç”¨çš„äÍæ—¶å˜é‡ã€?br>˜q™ä¸ªæ–ÒŽ³•å·²ç»æ˜¯ä¸€ä¸ªæ¯”较好的解å†Ïx–¹æ³•了(è‡ªå·±è®¤äØ“)åQŒå¦‚果你˜q˜èƒ½å†™å‡ºæ›´å¥½çš„shuffle½Ž—法åQŒè¯·å‘Šè¯‰æˆ‘ã€?br><br>我相信对‹z—牌˜q™ç§ä¸œè¥¿æœ‰äº†è§£çš„人都ä¸ä¼šç”¨è¿™æ ïLš„æ–ÒŽ³•æ¥æ´—牌:å¦å¤–å¯ÒŽ¯å¼ ç‰Œåšä¸€ä¸ªæ ‡è®ŽÍ¼ŒåÏx˜¯å¦æŠ½˜q‡è¿™å¼ ç‰ŒåQšç„¶åŽç¬¬i‹Æ¡åœ¨nå¼ ç‰Œé‡ŒéšæœºæŠ½ä¸€ä¸ªï¼Œå¦‚æžœ˜q™å¼ ç‰Œæ›¾¾l被抽过åQŒé‚£ä¹ˆæŠŠå®ƒæ”¾å›žåŽ»åQŒé‡å¤æŠ½å–,直到抽到一张没被抽˜q‡çš„牌,ž®†è¿™å¼ ç‰Œæ ‡è®°ä¸ºæŠ½å–过的牌åQŒç„¶åŽåœ¨¾U怸Šçš„第i个地方记下这张牌。在计算机里˜q™æ ·å®žçްåQ?br><br>伪代ç ï¼š<br>for i <- 0 to n - 1<br>do d <- Random mod n<br>   while did[d] = 1<br>   do d = Random mod n<br>   did[d] <- 1<br>   shuffle[i] <- deck[d]<br><br><br>看了æè¿°åQŒä½ ä¸€å®šå°±ä¼šè§‰å¾—è¿™¿U方法实在是é­é€äº†åQŒä¸ä»…éº»çƒ¦ï¼Œè€Œä¸”ä¼šæœ‰ä¸€ä¸ªé™·é˜±ï¼Œé‚£å°±æ˜¯åœ¨æŸæ¬¡å–ç‰Œçš„æ—¶å€™ï¼Œä¹Ÿè®¸ä¼šè¿æ°”差永远也å–ä¸åˆ°æ²¡æœ‰è¢«å–˜q‡çš„é‚£å¼ ç‰Œï¼Œå¯ÆD‡´½E‹åº˜q行的丼‹®å®šæ€§ã€‚然而,在åˆå­¦è€…å½“ä¸­ï¼Œå´æœ‰ä¸å°‘是用˜q™ç§æ–ÒŽ³•实现的shuffleçš„ã€‚ä¸ªäºø™®¤ä¸ºï¼Œåœ¨è®¾è®¡ç®—法的时候,­‘Šç®€å•ã€è¶ŠæŽ¥è¿‘生活的模型,ž®Þp¶Šå®ÒŽ˜“设计出好的算法,而且½Ž—法的æ˜qîC¹Ÿæ›´æŽ¥˜q‘实际生‹z…R€‚因此,设计½Ž—法的时候,如果能往òqÏx—¶ç”Ÿæ´»çš„æ–¹é¢æƒ³åQ?æ€ÀL˜¯äº‹åŠåŠŸå€çš„ã€?br><br>附上我自己实现的一个类qsortçš„shuffle½Ž—法<br><br>// element_Size is the size of each element <br> <br>void swap(void const *element1, void const *element2, size_t element_Size) <br>{ <br>    char *temp = new char, <br>         *elem1, *elem2; <br>    elem1 = (char *)element1; <br>    elem2 = (char *)element2; <br>    for(int i = 0; i < element_Size; i++, elem1++, elem2++){ <br>        *temp = *elem1; <br>        *elem1 = *elem2; <br>        *elem2 = *temp; <br>    } <br>    delete temp; <br>} <br> <br>// array_Size is the size of array, <br>// element_Size is the size of each element in array <br> <br>void shuffle(void const *array, size_t array_Size, size_t element_Size) <br>{ <br>    void *element1, *element2; <br>    srand(time(0)); <br>    for(int i = 0; i < array_Size / element_Size; i++){ <br>        element1 = (char *)array + i * element_Size; <br>        element2 = (char *)array + rand(i * element_Size, <br>            array_Size - element_Size, element_Size); <br>        swap(element1, element2, element_Size); <br>    } <br>}</p> <p> </p> <p>播放器的shuffle½Ž—法åQ?</p> <p>å‰é¢è¯´è¿‡æ’­æ”¾å™¨çš„éšæœºæ’­æ”¾æœ‰ä¸¤¿U,一¿Uå«Random,一¿Uå«Shuffle(我自å·Þq†è§£çš„......)åQŒä¸‹é¢è§£é‡Šè¿™ä¸¤ç§æ–ÒŽ³•çš„ä¸åŒã€?/p> <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Œå¦‚果在ž®×ƒ¸é€‰è¿™é¦?.....</p> <p>但是˜q™äº›æ¦‚率都å°çš„坿€œï¼Œå¯¹äºŽä¸€ä¸ªæ’­æ”‘Ö™¨çš„random函数æ¥è¯´åQŒèƒ½å¤Ÿè€ƒè™‘åˆîC»¥ä¸Šçš„几点åQŒå·²¾l能够åšåˆ°èƒö够randomå’Œäh性化了。åªè¦èƒ½å¤Ÿåˆç†çš„é€‰æ‹©å‚æ•°åQŒè€ƒè™‘åˆîC¸€äº›ç‰¹ŒDŠæƒ…å†?比如æžå°çš„æ’­æ”‘Öˆ—è¡?åQŒä»¥åŠè€ƒè™‘用户的心ç†ï¼Œž®Þpƒ½åšå‡ºä¸€ä¸ªæ¯”较好的random函数ã€?/p> <p>下é¢è®²æˆ‘设计的播攑֙¨shuffle½Ž—法åQŒshuffle½Ž—法能够很大½E‹åº¦ä¸Šé¿å…random½Ž—æ³•çš„ç¼ºé™øP¼Œåœ¨ç©ºé—´æ—¶é—´ä¸Šéƒ½å¾ˆèŠ‚çº¦åQŒè€Œä¸”能够辑ֈ°æ¯”è¾ƒç†æƒ³çš„éšæœºåŒ–效果。它的大体æ€èµ\是这æ ïLš„åQ?/p> <p>我们使用一个éšå«çš„shuffle播放列表(一个åó@环队åˆ?æ¥å‚¨å­˜æ­Œæ›²çš„™åºåºåQŒåƈ用一个指针表½Cºæ­£åœ¨æ’­æ”„¡š„歌曲(è®îC½œ"^")åQŒæ¯”如当å‰çš„æ’­æ”¾åˆ—表是这æ ïLš„åQ?/p> <p><font face="Courier New">ABCDEFGHIJKLMN<br>             ^</font></p> <p>å³çŽ°åœ¨æœ‰14首歌åQŒå°†è¦æ’­æ”¾ä½¾|?的歌æ›?正在播放ä½ç½®14的歌æ›?åQŒæˆ‘们认为队列头和尾是相˜qžçš„åQŒå³NåŽé¢çš„元素是AåQŒé‚£ä¹ˆè¿™æ ·å¤Ÿæˆäº†ä¸€ä¸ªåó@环队列ã€?br>在播放之å‰ï¼Œæˆ‘们在å‰7(7=14*0.5åQŒè¿™ä¸ªæ¯”例å¯ä»¥éšä¾‰K€‰ï¼Œå½“ç„¶­‘Šå¤§éšæœºæ€§è¶Šå¤§ï¼Œä½†èƒ½åŽé€€çš„æ¬¡æ•°è¶Šž®?个佾|®ä¸­åQŒéšæœºå–一个一首歌åQŒæŠŠå®ƒå’Œž®†è¦æ’­æ”¾çš„那个佾|®çš„æ­Œæ›²äº¤æ¢ã€‚å‡è®¾æˆ‘们选的是EåQŒåˆ™é˜Ÿåˆ—å˜æˆ˜q™æ ·åQ?/p> <p><font face="Courier New">EBCDAFGHIJKLMN<br>^</font></p> <p>ç„¶åŽæ’­æ”¾E。E播放完了以åŽ(或者选择下一首时)åQŒé‡å¤åˆšæ‰çš„动作åQŒå³åœ¨BCDAFGHä¸­éšæœºé€‰ä¸€ä¸ªï¼Œäº¤æ¢åQŒæ¯”如选到HåQŒåˆ™é˜Ÿåˆ—å˜æˆåQ?br><font face="Courier New">EHCDAFGBIJKLMN<br> ^</font></p> <p>ç„¶åŽæ’­æ”¾Hã€‚è¿™æ øP¼Œä¸€ä¸ªshuffle½Ž—æ³•åˆæ­¥å®Œæˆäº†ã€?/p> <p>比如æŸä¸€æ—¶åˆ»æ’­æ”¾å™¨çš„çŠ¶æ€æ˜¯˜q™æ ·åQ?br><font face="Courier New">EHCDAFGBIJKLMN<br>          ^</font><br>则我们在LMNEHCD中选择一个,比如选择到HåQŒé‚£ä¹ˆäº¤æ¢åƈ播放åQŒæˆä¸ºï¼š<br><font face="Courier New">ELCDAFGBIJKHMN<br>           ^</font><br>但是如果用户选择上一首怎么办呢?我们å¯ä»¥å†è®°å½•ä¸€ä¸ªæŒ‡é’ˆæŒ‡å‘æœ€æ–°shuffle选择出æ¥çš„那首歌æ›?è®îC½œ"*")åQŒæ²¡æœ‰é€‰æ‹©˜q‡å‰ä¸€é¦–的时候,它与播放指针指å‘åŒä¸€ä¸ªä½¾|®ã€‚当选择å‰ä¸€é¦–的时候,仅移动指针^åQŒè€Œä¸¿UÕdЍ*åQŒæ¯”å¦‚ä¸Šä¸€ä¸ªä¾‹å­æ’­æ”„¡š„时候按下å‰ä¸€é¦–以åŽï¼ŒæˆäØ“åQ?/p> <p><font face="Courier New">ELCDAFGBIJKHMN<br>          ^*</font></p> <p>˜q™æ—¶å€™æ’­æ”„¡š„Kæ­£å¥½æ˜¯åˆšæ‰æ’­æ”„¡š„那一首,当然˜q™è¾¾åˆîCº†æˆ‘的目的åQŒå³å¯ä»¥é€‰åˆ°åˆšæ‰æ’­æ”¾çš„æ›²ç›®ï¼Œå½“然如果å†ä¸€‹Æ¡é€‰æ‹©ä¸Šä¸€é¦–,ž®×ƒ¼šå˜æˆåQ?/p> <p><font face="Courier New">ELCDAFGBIJKHMN<br>         ^ *</font></p> <p>˜q™æ—¶å€™å¦‚果按下一首,应该判断^指å‘çš„æ˜¯ä¸æ˜¯å’?指å‘的相åŒï¼Œå¦‚果相åŒåQŒå°±æŒ‰ç…§æœ€æ—©ä»‹¾lçš„shuffle½Ž—法˜q›è¡Œéšæœºé€‰å–åQŒä¸ç›¸åŒž®Þq®€å•çš„¿UÕdЍ^åQŒå³æˆäØ“åQ?/p> <p><font face="Courier New">ELCDAFGBIJKHMN<br>          ^*</font></p> <p>伪代ç ï¼š<br><font face="Courier New">function keypress(key)<br>   if key = NEXT<br>      if p1 = p2<br>      do p1 <- p1 + 1<br>         p2 <- p2 + 1<br>         k = Random mod (length / 2)<br>         swap(p1, (p1 + k) mod length)<br>         play(p2)<br>      else<br>      do p2 <- (p2 + 1) mod length<br>         play(p2)<br>   if key = PREV<br>      do p2 <- (p2 + length - 1) mod length<br>         play(p2)</font></p> <p>˜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;</p> <img src ="http://m.shnenglu.com/AutomateProgram/aggbug/129458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/AutomateProgram/" target="_blank">漂漂</a> 2010-10-11 17:25 <a href="http://m.shnenglu.com/AutomateProgram/archive/2010/10/11/129458.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item><item><title>ååŒæŽ¨è½Ž—法实践之Slope One的介¾l(转)http://m.shnenglu.com/AutomateProgram/archive/2010/07/19/120790.html漂漂漂漂Mon, 19 Jul 2010 09:49:00 GMThttp://m.shnenglu.com/AutomateProgram/archive/2010/07/19/120790.htmlhttp://m.shnenglu.com/AutomateProgram/comments/120790.htmlhttp://m.shnenglu.com/AutomateProgram/archive/2010/07/19/120790.html#Feedback0http://m.shnenglu.com/AutomateProgram/comments/commentRss/120790.htmlhttp://m.shnenglu.com/AutomateProgram/services/trackbacks/120790.html阅读全文

漂漂 2010-07-19 17:49 å‘表评论
]]>
傅里å¶å˜æ¢å’Œæ‹‰æ™®æ‹‰æ–¯å˜æ¢çš„æ„ä¹?/title><link>http://m.shnenglu.com/AutomateProgram/archive/2010/06/13/117804.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sun, 13 Jun 2010 10:19:00 GMT</pubDate><guid>http://m.shnenglu.com/AutomateProgram/archive/2010/06/13/117804.html</guid><wfw:comment>http://m.shnenglu.com/AutomateProgram/comments/117804.html</wfw:comment><comments>http://m.shnenglu.com/AutomateProgram/archive/2010/06/13/117804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/AutomateProgram/comments/commentRss/117804.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/AutomateProgram/services/trackbacks/117804.html</trackback:ping><description><![CDATA[原文地å€åQ?a >http://hi.baidu.com/zavierwong/blog/item/1af5c3d0cd34a4da572c849e.html</a><br><br>¾l常有äh问我åQŒå‚…里å¶å˜æ¢å’Œæ‹‰æ™®æ‹‰æ–¯å˜æ¢çš„æ„ä¹‰ã€‚åœ¨˜q™é‡Œæˆ‘就自己的一些è§è§£ï¼Œä»¥åоl“åˆåˆ«äh的观ç‚ÒŽ˜q°å¦‚下,希望大家å¯ÒŽ­¤æœ‰æ‰€äº†è§£ã€?br>     傅里å¶å˜æ¢ï¼ˆTransformée de FourieråQ‰åœ¨ç‰©ç†å­¦ã€æ•°è®ºã€ç»„åˆæ•°å­¦ã€ä¿¡å·å¤„ç†ã€æ¦‚率论ã€ç»Ÿè®¡å­¦ã€å¯†ç å­¦ã€å£°å­¦ã€å…‰å­¦ã€æ“v‹z‹å­¦ã€ç»“构动力学½{‰é¢†åŸŸéƒ½æœ‰ç€òq¿æ³›çš„应用(例如在信å·å¤„ç†ä¸­åQŒå‚…里å¶å˜æ¢çš„典型用途是ž®†ä¿¡å·åˆ†è§£æˆòq…值分é‡å’Œé¢‘率分é‡åQ‰ã€?br>     傅里å¶å˜æ¢èƒ½ž®†æ»¡­‘³ä¸€å®šæ¡ä»¶çš„æŸä¸ªå‡½æ•°è¡¨ç¤ºæˆä¸‰è§’函敎ͼˆæ­£åëuå’?或余弦函敎ͼ‰æˆ–者它们的¿U¯åˆ†çš„线性组åˆã€‚在ä¸åŒçš„ç ”½I‰™¢†åŸŸï¼Œå‚…里å¶å˜æ¢å…·æœ‰å¤š¿Uä¸åŒçš„å˜ä½“å½¢å¼åQŒå¦‚˜qžç®‹å‚…里å¶å˜æ¢å’Œ¼›ÀL•£å‚…里å¶å˜æ¢ã€?br>      傅里å¶å˜æ¢æ˜¯ä¸€¿U解决问题的æ–ÒŽ³•åQŒä¸€¿U工典P¼Œä¸€¿U看待问题的角度。ç†è§£çš„关键是:一个连¾l­çš„ä¿¡å·å¯ä»¥çœ‹ä½œæ˜¯ä¸€ä¸ªä¸ªž®ä¿¡åïLš„å åŠ åQŒä»Žæ—¶åŸŸå åŠ ä¸Žä»Žé¢‘åŸŸå åŠ éƒ½å¯ä»¥ç»„æˆåŽŸæ¥çš„ä¿¡å·åQŒå°†ä¿¡å·˜q™ä¹ˆåˆ†è§£åŽæœ‰åŠ©äºŽå¤„ç†ã€?br>  我们原æ¥å¯¹ä¸€ä¸ªä¿¡å·å…¶å®žæ˜¯ä»Žæ—¶é—´çš„角度åŽÈ†è§£çš„åQŒä¸çŸ¥ä¸è§‰ä¸­åQŒå…¶å®žæ˜¯æŒ‰ç…§æ—‰™—´æŠŠä¿¡å¯‚¿›è¡Œåˆ†å‰ÔŒ¼Œæ¯ä¸€éƒ¨åˆ†åªæ˜¯ä¸€ä¸ªæ—¶é—´ç‚¹å¯¹åº”一个信å·å€û|¼Œä¸€ä¸ªä¿¡åäh˜¯ä¸€¾l„è¿™æ ïLš„分é‡çš„å åŠ ã€‚å‚…é‡Œå¶å˜æ¢åŽï¼Œå…¶å®ž˜q˜æ˜¯ä¸ªå åŠ é—®é¢˜ï¼Œåªä¸˜q‡æ˜¯ä»Žé¢‘率的角度åŽÕd åŠ ï¼Œåªä¸˜q‡æ¯ä¸ªå°ä¿¡å·æ˜¯ä¸€ä¸ªæ—¶é—´åŸŸä¸Šè¦†ç›–整个区间的信å·åQŒä½†ä»–确有固定的周期åQŒæˆ–者说åQŒç»™äº†ä¸€ä¸ªå‘¨æœŸï¼Œæˆ‘们ž®Þpƒ½ç”Õd‡ºä¸€ä¸ªæ•´ä¸ªåŒºé—´ä¸Šçš„分信å·åQŒé‚£ä¹ˆç»™å®šä¸€¾l„周期å€û|¼ˆæˆ–频率å€û|¼‰åQŒæˆ‘们就å¯ä»¥ç”Õd‡ºå…¶å¯¹åº”的曲线åQŒå°±åƒç»™å‡ºæ—¶åŸŸä¸Šæ¯ä¸€ç‚¹çš„ä¿¡å·å€ég¸€æ øP¼Œä¸è¿‡å¦‚æžœä¿¡å·æ˜¯å‘¨æœŸçš„è¯?åQŒé¢‘域的更简å•,åªéœ€è¦å‡ ä¸ªç”šè‡³ä¸€ä¸ªå°±å¯ä»¥äº†ï¼Œæ—¶åŸŸåˆ™éœ€è¦æ•´ä¸ªæ—¶é—´èáu上æ¯ä¸€ç‚šwƒ½æ˜ å°„å‡ÞZ¸€ä¸ªå‡½æ•°å€¹{€?br>  傅里å¶å˜æ¢å°±æ˜¯å°†ä¸€ä¸ªä¿¡åïLš„æ—¶åŸŸè¡¨ç¤ºå½¢å¼æ˜ å°„åˆîC¸€ä¸ªé¢‘域表½CºåÅžå¼ï¼›é€†å‚…里å¶å˜æ¢æ°å¥½ç›¸å。这都是一个信åïLš„ä¸åŒè¡¨ç¤ºå½¢å¼ã€‚它的公å¼ä¼šç”¨å°±å¯ä»¥åQŒå½“ç„¶æŠŠè¯æ˜Žçœ‹æ‡‚了更好ã€?br>  对一个信å·åšå‚…ç«‹å¶å˜æ¢ï¼Œå¯ä»¥å¾—到光™¢‘域特性,包括òq…度和相ä½ä¸¤ä¸ªæ–¹é¢ã€‚幅度是表示˜q™ä¸ªé¢‘率分é‡çš„大ž®ï¼Œé‚£ä¹ˆç›æ€½å‘¢ï¼Œå®ƒæœ‰ä»€ä¹ˆç‰©ç†æ„义?频域的相ä½ä¸Žæ—¶åŸŸçš„ç›¸ä½æœ‰å…³ç³»å—?信å·å‰ä¸€ŒD늚„ç›æ€½åQˆé¢‘域)与åŽä¸€ŒD늚„ç›æ€½çš„å˜åŒ–是å¦ä¸Žä¿¡å·çš„é¢‘çŽ‡æˆæ­£æ¯”关系ã€?br>  傅立å¶å˜æ¢å°±æ˜¯æŠŠä¸€ä¸ªä¿¡åøP¼Œåˆ†è§£æˆæ— æ•°çš„æ­£åëu波(或者余弦æ‡LåQ‰ä¿¡å—÷€‚也ž®±æ˜¯è¯ß_¼Œç”¨æ— æ•°çš„æ­£åëu波,å¯ä»¥åˆæˆä»ÖM½•你所需è¦çš„ä¿¡å·ã€?br>  想一惌™¿™ä¸ªé—®é¢˜ï¼š¾l™ä½ å¾ˆå¤šæ­£åëuä¿¡å·åQŒä½ æ€Žæ ·æ‰èƒ½åˆæˆä½ éœ€è¦çš„ä¿¡å·å‘¢ï¼Ÿ½{”案是è¦ä¸¤ä¸ªæ¡äšgåQŒä¸€ä¸ªæ˜¯æ¯ä¸ªæ­£åëu波的òq…度åQŒå¦ä¸€ä¸ªå°±æ˜¯æ¯ä¸ªæ­£å¼¦æ‡L之间的相ä½å·®ã€‚所以现在应该明白了å§ï¼Œé¢‘åŸŸä¸Šçš„ç›æ€½åQŒå°±æ˜¯æ¯ä¸ªæ­£å¼¦æ‡L之间的相ä½ã€‚  <br>  傅立å¶å˜æ¢ç”¨äºŽä¿¡åïLš„频率域分æžï¼Œä¸€èˆ¬æˆ‘们把电信åäh˜q°æˆæ—‰™—´åŸŸçš„æ•°å­¦æ¨¡åž‹åQŒè€Œæ•°å­—ä¿¡å·å¤„ç†å¯¹ä¿¡å·çš„频率特性更感兴­‘£ï¼Œè€Œé€šè¿‡å‚…ç«‹å¶å˜æ¢å¾ˆå®ÒŽ˜“得到信å·çš„频率域ç‰ÒŽ€§ã€€<br>  傅里å¶å˜æ¢ç®€å•通俗ç†è§£ž®±æ˜¯æŠŠçœ‹ä¼¼æ‚乱无章的信å·è€ƒè™‘æˆç”±ä¸€å®šæŒ¯òq…ã€ç›¸ä½ã€é¢‘率的基本正åëuåQˆä½™å¼¦ï¼‰ä¿¡å·¾l„åˆè€ŒæˆåQŒå‚…里å¶å˜æ¢çš„ç›®çš„å°±æ˜¯æ‰¾å‡ø™¿™äº›åŸºæœ¬æ­£å¼¦ï¼ˆä½™åëuåQ‰ä¿¡å·ä¸­æŒ¯å¹…较大åQˆèƒ½é‡è¾ƒé«˜ï¼‰ä¿¡å·å¯¹åº”的频率,从而找出æ‚乱无章的信å·ä¸­çš„ä¸»è¦æŒ¯åŠ¨é¢‘çŽ‡ç‰¹ç‚¹ã€‚å¦‚å‡é€Ÿæœºæ•…éšœæ—Óž¼Œé€šè¿‡å‚…里å¶å˜æ¢åšé¢‘谱分æžåQŒæ ¹æ®å„¾U§é‹Éè½®è{速ã€é‹Éæ•îC¸Žæ‚音频谱中振òq…大的对比,å¯ä»¥å¿«é€Ÿåˆ¤æ–­å“ª¾U§é‹Éè½®æŸä¼¤ã€? <p><br>æ‹‰æ™®æ‹‰æ–¯å˜æ¢å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> <img src ="http://m.shnenglu.com/AutomateProgram/aggbug/117804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-13 18:19 <a href="http://m.shnenglu.com/AutomateProgram/archive/2010/06/13/117804.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item><item><title>A*寻èµ\åˆæŽ¢(è½?http://m.shnenglu.com/AutomateProgram/archive/2008/12/01/68297.html漂漂漂漂Mon, 01 Dec 2008 08:39:00 GMThttp://m.shnenglu.com/AutomateProgram/archive/2008/12/01/68297.htmlhttp://m.shnenglu.com/AutomateProgram/comments/68297.htmlhttp://m.shnenglu.com/AutomateProgram/archive/2008/12/01/68297.html#Feedback0http://m.shnenglu.com/AutomateProgram/comments/commentRss/68297.htmlhttp://m.shnenglu.com/AutomateProgram/services/trackbacks/68297.html阅读全文

漂漂 2008-12-01 16:39 å‘表评论
]]>
¾U¢é»‘树(Red-Black TreeåQ?è½?http://m.shnenglu.com/AutomateProgram/archive/2008/11/22/67581.html漂漂漂漂Sat, 22 Nov 2008 06:16:00 GMThttp://m.shnenglu.com/AutomateProgram/archive/2008/11/22/67581.htmlhttp://m.shnenglu.com/AutomateProgram/comments/67581.htmlhttp://m.shnenglu.com/AutomateProgram/archive/2008/11/22/67581.html#Feedback0http://m.shnenglu.com/AutomateProgram/comments/commentRss/67581.htmlhttp://m.shnenglu.com/AutomateProgram/services/trackbacks/67581.htmlhttp://imlazy.ycool.com/post.1104022.html

å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;

}



漂漂 2008-11-22 14:16 å‘表评论
]]>
数学之美番外½‹‡ï¼šå¿«æŽ’ä¸ÞZ»€ä¹ˆé‚£æ ·å¿«(转)http://m.shnenglu.com/AutomateProgram/archive/2008/11/21/67512.html漂漂漂漂Fri, 21 Nov 2008 11:07:00 GMThttp://m.shnenglu.com/AutomateProgram/archive/2008/11/21/67512.htmlhttp://m.shnenglu.com/AutomateProgram/comments/67512.htmlhttp://m.shnenglu.com/AutomateProgram/archive/2008/11/21/67512.html#Feedback0http://m.shnenglu.com/AutomateProgram/comments/commentRss/67512.htmlhttp://m.shnenglu.com/AutomateProgram/services/trackbacks/67512.htmlhttp://blog.csdn.net/pongba/archive/2008/06/13/2544933.aspx

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Œä»¥åŠç®—法学åˆîC»€ä¹ˆç¨‹åº¦ï¼ˆè½¬è²åQ?/title><link>http://m.shnenglu.com/AutomateProgram/archive/2008/11/15/67002.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sat, 15 Nov 2008 08:37:00 GMT</pubDate><guid>http://m.shnenglu.com/AutomateProgram/archive/2008/11/15/67002.html</guid><wfw:comment>http://m.shnenglu.com/AutomateProgram/comments/67002.html</wfw:comment><comments>http://m.shnenglu.com/AutomateProgram/archive/2008/11/15/67002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/AutomateProgram/comments/commentRss/67002.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/AutomateProgram/services/trackbacks/67002.html</trackback:ping><description><![CDATA[<p align=left>        ½W¬ä¸€ä¸ªé—®é¢˜æˆ‘觉得我无法给出完¾ŸŽçš„½{”案åQŒè¿™é‡Œæžç«žèµ›çš„ç‰›äºø™›®å¤šï¼Œä¸å¦¨è¯´è¯´ä½“会:D <o:p></o:p></p> <p>         æˆ‘ä¸ªäºø™§‰å¾—ç®—æ³•é‡Œé¢æžå¤§ä¸€éƒ¨åˆ†å†…容是如何有效地˜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;<a target=_blank>https://groups.google.com/group/pongba/browse_frm/thread/2ca1f2bda0c8...</a>>里é¢è¯´çš„åQŒå…¶å®žfibonacci数列计算里é¢çš„çº¿æ€§å˜æ¢æœ¬íw«ä¹Ÿæ˜¯æœ‰é‡å¤è®¡ç®—的——åŽè€…便是更éšè”½çš„é‡å¤è®¡½Ž—了åQŒä¸€ä¸?non-trivial 的动æ€è§„划问题往往涉åŠåˆ°éžå¸”Ršè”½çš„é‡å¤è®¡ç®—åQŒæˆ–者更隄¡š„是,你é历组åˆç©ºé—´çš„æ–¹å¼å†›_®šäº†ä½ æ‰€èƒ½å¤Ÿ¾~“存的é‡å¤è®¡½Ž—到底有多少åQŒä¹Ÿè®¸æŸä¸ªé历方å¼ä¹‹ä¸‹å°±æ²¡æœ‰åŠžæ³•åŽ?shy;¾~“存计算。当ç„Óž¼Œ½Ž—法的范畴其实是很大的,½Ž—法是一个AI-Complete 的问题,所有的 Problem-Solving ˜q‡ç¨‹éƒ½å¯ä»¥å«åšç®—æ³•ã€‚åªæ˜¯æœ‰å¾ˆå¤šå®žé™…当中的算法会掉入以上两类而已ã€?nbsp; </p> <p>    ½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 <br>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 <br>之类的技术细节,而是它的本质åQŒäºŽæ˜¯ä¾¿ä¸å†å®ÒŽ˜“忘掉åQŒè€Œå³ä¾¿å¿˜æŽ‰ï¼Œž®±å¦‚庞加莱所è¯ß_¼Œä¹Ÿå¯ä»¥éžå¸¸è¿…速的ž®†ç®—法的¾l†èŠ‚è‡ªè¡Œæž„å¾å‡ºæ¥ã€?<o:p></o:p></p> <p>       其实我相信这æ ïLš„例孿˜¯æ•°ä¸èƒœæ•°çš„åQŒæ‰€ä»¥æˆ‘˜q™ä¸ªåªæ˜¯½Ž—一ä¸?Yet Another Example åQŒç”±äºŽå¯¹æˆ‘æ¥è¯´æ¯”较特ŒDŠï¼Œæ‰€ä»¥å°è±¡è¾ƒä¸ºæ·±åˆ…R€?<o:p></o:p></p> <p>        ˜q™ä¸ªä¾‹å­æ˜¯å…³äº?ç†è§£"的。有时候算法也会éžå¸¸æœ‰ç”¨ï¼Œå¦‚有一‹Æ¡å†™½E‹åºæ—‰™œ€è¦ç”¨åˆ?LCS å’?Edit-Distance åQˆè¿™æ ïLš„æœÞZ¼šå¾ˆå°‘åQŒä½†é‡åˆ°äº†æ—¶å¦‚æžœä¸çŸ¥é“有多项å¼å¤æ‚度的算法就很悲惨了åQ‰ï¼Œè€Œåšæœºå™¨å­¦ä¹ å’Œæ•°æ®æŒ–掘的更是ž®‘ä¸äº†ä¸€å¨å¨çš„算法,如果光是ç†è§£åˆ«ähçš„åšæ³•ç„¶åŽå®žçŽ?shy;出æ¥åQŒé‚£ä¹ˆå¯¹½Ž—æ³•çš„æ€æƒ³çš„æŠŠæ¡æœ‰åŠ©äºŽç†è§£å’Œè®°å¿†ï¼›å¦‚果需è¦è‡ªå·Þp®¾è®¡ç®—法,那就需è¦ç®—法基¼‹€çŸ¥è¯†çš„辅助æ‰è¡Œäº†ã€‚ç»å¤§å¤šæ•îCh应该属于å‰è€…ã€?<o:p></o:p></p> <p>         学习åˆîC»€ä¹ˆç¨‹åº¦ï¼Ÿæˆ‘觉得视人群而定。如果åšåº•层开å‘ã€åº”用开å‘ã€ç³»¾lŸå¼€å‘,åªè¦çŸ¥é“一个大概就å¯ä»¥äº†ï¼ŒçŸ¥é“¾l典的数æ®ç»“构和½Ž—法没有ä»ÖM½•å›°éš¾åQŒè€Œä¸”åæ­£¾lå…¸½Ž—法­éƒ½æœ‰çްæˆçš„库å¯ç”¨ã€‚对于有兴趣åšä¸€ç‚?research 沾边的事情的人,则需è¦äº†è§£è¿™äº›ç®—法背åŽçš„一般性æ€èµ\是什么,å¦åˆ™æ¥ä¸€ä¸ªç‰¹å®šçš„½Ž—法你就特定的ç†è§£è®°å¿†ä¸€ä¸‹ï¼Œè‚¯å®šä¸ç‰¢é ï¼Œè€Œä¸”‹¹ªè´¹å¤§è„‘资æºã€‚å¯¹äºŽæž real deal çš?original research 的那ž®±éœ€è¦å¹¿æ³›çš„知识¿U¯ç¯äº†ï¼Œå…‰çŸ¥é“一般性æ€èµ\都ä¸å¤Ÿã€?<o:p></o:p></p> <p>        å¦ä¸€æ–š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出那些有­‘£ã€æœ‰æ„义的问é¢?) <o:p></o:p></p> <p>-- <br>刘未é¹?pongba) <br>Blog|C++的罗‹¹®å®« <br><a target=_blank>http://blog.csdn.net/pongba</a> <o:p></o:p></p> <p align=left><o:p> </o:p></p> <p> </p> <img src ="http://m.shnenglu.com/AutomateProgram/aggbug/67002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/AutomateProgram/" target="_blank">漂漂</a> 2008-11-15 16:37 <a href="http://m.shnenglu.com/AutomateProgram/archive/2008/11/15/67002.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>¸ÐлÄú·ÃÎÊÎÒÃǵÄÍøÕ¾£¬Äú¿ÉÄÜ»¹¶ÔÒÔÏÂ×ÊÔ´¸ÐÐËȤ£º</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.rnif.cn" target="_blank">ÑÇÖÞ¹ú²úÏã½¶ÈËÈËˬ³ÉAVƬ¾Ã¾Ã</a>| <a href="http://www.ckpic.com.cn" target="_blank">91¾Ã¾Ã¹ú²úÊÓÆµ</a>| <a href="http://www.nbbook.com.cn" target="_blank">ÎçÒ¹¾«Æ·¾Ã¾Ã¾Ã¾Ã¾ÃÓ°ÊÓriav</a>| <a href="http://www.uazm.cn" target="_blank">¾Ã¾Ã¾Ã¾ÃÑÇÖÞ¾«Æ·ÎÞÂëÃÛÌÒ</a>| <a href="http://www.qingjian8.cn" target="_blank">ÑÇÖÞAVÎÞÂë¾Ã¾Ã¾«Æ·ÃÛÌÒ</a>| <a href="http://www.paper51.cn" target="_blank">¾«Æ·¹ú²úÒ»Çø¶þÇøÈýÇø¾Ã¾Ã¾ÃÀÇ</a>| <a href="http://www.angfei.com.cn" target="_blank">99¾«Æ·¾Ã¾Ã¾«Æ·</a>| <a href="http://www.ksjhyt.cn" target="_blank">ÎçÒ¹¾«Æ·¾Ã¾Ã¾Ã¾Ã³ÉÈË</a>| <a href="http://www.hbdmw.cn" target="_blank">¾Ã¾Ã¾ÃæÃæÃÎåÔÂÑÇÖÞ97ºÅÉ«</a>| <a href="http://www.jfjn.net.cn" target="_blank">99ÈȾ«Æ·¾Ã¾ÃÖ»Óо«Æ·</a>| <a href="http://www.rojie.cn" target="_blank">¹ú²ú¾«Æ·Ò»Çø¶þÇø¾Ã¾Ã¾«Æ·É¬°®</a>| <a href="http://www.xkr-bsc.cn" target="_blank">¾Ã¾Ã¾«Æ·¹ú²úÑÇÖÞavÓ°Ôº</a>| <a href="http://www.hljfucai.cn" target="_blank">¹ú²ú³ÉÈ˾«Æ·¾Ã¾Ã×ÛºÏ</a>| <a href="http://www.lxbike.cn" target="_blank">¹ú²ú³ÉÈËÎÞÂ뾫Ʒ¾Ã¾Ã¾ÃÐÔÉ«</a>| <a href="http://www.gbyu.cn" target="_blank">ºÝºÝÉ«ààààºÝºÝºÝºÝºÝÉ«×ۺϾþÃ</a>| <a href="http://www.wooblog.cn" target="_blank">Ò»±¾É«×ۺϾþÃ</a>| <a href="http://www.itwinds.cn" target="_blank">¾Ã¾Ã99¾«Æ·×ۺϹú²úÊ×Ò³</a>| <a href="http://www.whchangxin.com.cn" target="_blank">ÐÔÅ·ÃÀ´óÕ½¾Ã¾Ã¾Ã¾Ã¾Ã¾Ã</a>| <a href="http://www.j8hq8.cn" target="_blank">¾Ã¾Ã³¬Åö97ÈËÈË×öÈËÈ˰®</a>| <a href="http://www.job158.cn" target="_blank">³ÉÈË×ۺϾþþ«Æ·É«æÃæÃ</a>| <a href="http://www.lpxiu.cn" target="_blank">¾«Æ·¾Ã¾Ã¾Ã¾Ã¾Ã¹ú²úÃâ·ÑÁË</a>| <a href="http://www.montblanc-fola.cn" target="_blank">×ÛºÏÈËÆÞ¾Ã¾ÃÒ»Çø¶þÇø¾«Æ·</a>| <a href="http://www.ddmir.cn" target="_blank">Å·ÃÀÐÔÃͽ»xxxxÃâ·Ñ¿´¾Ã¾Ã¾Ã</a>| <a href="http://www.5qzone.cn" target="_blank">¹ú²úVÑÇÖÞVÌìÌÃÎÞÂë¾Ã¾Ã¾Ã</a>| <a href="http://www.vzas.cn" target="_blank">¾Ã¾Ã¾«Æ·¹ú²úÃâ·Ñ¹Û¿´ÈýÈËͬÃß</a>| <a href="http://www.xysrsks.cn" target="_blank">¹ú²úÑÇÖݾ«Æ·Å®È˾þþþþÃ</a>| <a href="http://www.txdqlxx.cn" target="_blank">99¾Ã¾Ã¾«Æ·¹ú²úÂé¶¹</a>| <a href="http://www.llqu.cn" target="_blank">¾Ã¾ÃÑÇÖÞ¾«Æ·ÎÞÂëAVºìÓ£ÌÒ</a>| <a href="http://www.abcdds.cn" target="_blank">¾Ã¾Ã¾Ã¹ú²ú´ò×®»ú</a>| <a href="http://www.mofeigzs.cn" target="_blank">¾Ã¾Ã¾«Æ·ÖÐÎÄ×ÖÄ»´óÐØ</a>| <a href="http://www.sxttzs.cn" target="_blank">ÑÇÖÞÒ»¼¶AvÎÞÂëëƬ¾Ã¾Ã¾«Æ·</a>| <a href="http://www.s88w.cn" target="_blank">¾Ã¾Ã¾ÅÉ«×ۺϾÅÉ«99ÒÁÈË</a>| <a href="http://www.dt175.cn" target="_blank">91¾Ã¾Ã¾«Æ·¹ú²ú91ÐÔɫҲ</a>| <a href="http://www.114best.com.cn" target="_blank">¹ú²ú¾«Æ·¾Ã¾Ã¾Ã¾Ã¾Ã</a>| <a href="http://www.rootwiremesh.cn" target="_blank">¹ú²ú¾«Æ·¾Ã¾Ã99</a>| <a href="http://www.123oye.cn" target="_blank">¾Ã¾Ã×ۺϺݺÝÉ«×ÛºÏÒÁÈË</a>| <a href="http://www.shinehall.cn" target="_blank">¾«Æ·¾Ã¾Ã¹ú²úÒ»Çø¶þÇøÈýÇøÏã½¶</a>| <a href="http://www.sky1314.cn" target="_blank">¹ú²ú¾«Æ·µº¹ú¾Ã¾Ã¾Ã¾Ã</a>| <a href="http://www.glkk.net.cn" target="_blank">¾«Æ·¾Ã¾ÃÎÞÂëÖÐÎÄ×ÖÄ»</a>| <a href="http://www.037648.cn" target="_blank">www.¾Ã¾ÃÈÈ.com</a>| <a href="http://www.hhh328.cn" target="_blank">ÖÐÎľ«Æ·¾Ã¾Ã¾Ã¾Ã¹ú²úÍøÖ·</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>