﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-那谁的技术博客-随笔分类-算法与数据结构</title><link>http://www.cppblog.com/converse/category/974.html</link><description>感兴趣领域:高性能服务器编程,算法,Linux内核</description><language>zh-cn</language><lastBuildDate>Mon, 21 Sep 2009 15:56:17 GMT</lastBuildDate><pubDate>Mon, 21 Sep 2009 15:56:17 GMT</pubDate><ttl>60</ttl><item><title>把二分查找算法写正确需要注意的地方</title><link>http://www.cppblog.com/converse/archive/2009/09/21/96893.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 21 Sep 2009 15:46:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2009/09/21/96893.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/96893.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2009/09/21/96893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/96893.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/96893.html</trackback:ping><description><![CDATA[今天再次解决一个需要使用二分查找的问题,再一次的,我又没有一次过写对.(为什么我说"又"?)<br><br>抓狂了,似乎开始有一些"二分查找恐惧症".<br><br>为了以后能够一次将这个基本的算法写对,我决定再仔细研究一下.我之前有写过一个二分查找的算法,在<a  href="http://www.cppblog.com/converse/archive/2009/02/28/75190.html">这里</a>,这一次再以这个问题为例来说明.<br><br>我今早写下的错误代码类似于下面的样子:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;search(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;array[],&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;left,&nbsp;right,&nbsp;middle;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(left&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;middle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(left&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;right)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(array[middle]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;middle&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(array[middle]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;middle&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;middle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;array[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">13</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">19</span><span style="color: #000000;">};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;m&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;search(array,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(array)</span><span style="color: #000000;">/</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(array[</span><span style="color: #000000;">0</span><span style="color: #000000;">]),&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">m&nbsp;=&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;m);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br><br></span></div>
实际上,如果使用测试用例来测试,这个算法并不是在所有情况下都会出错的,还是有时可以得到正确的结果的.但是,你能看出来它错在哪儿吗?<br><br>在这里,循环的开始处,把循环遍历的序列区间是这样的:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n;<br></span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(left&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;right)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">循环体</span><span style="color: #008000;"><br></span><span style="color: #000000;">}</span></div>
也就是说,这是一个左闭右开的区间:[0, n).<br><br>但是,在循环内部, 却不是这样操作的:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;middle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(left&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;right)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(array[middle]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;middle&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(array[middle]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;middle&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;middle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span></div>
当array[middle] &gt; v条件满足时, 此时v如果存在的话必然在左闭右开区间[left, middle)中, 因此,当这个条件满足时, right应该为middle, 而在这里, right赋值为middle - 1了, 那么, 就有可能遗漏array[middle - 1] = v的情况.<br><br>因此,这种错误的写法并不是在所有的情况下都会出错,有时还是可以找到正确的结果的.<br><br>这是一种典型的二分查找算法写错的情况,循环体是左闭右开区间,而循环体内部却是采用左闭右闭区间的算法进行操作.<br>下面给出的两种正确的算法,算法search是左闭右闭区间算法,而算法search2是左闭右开区间算法,可以对比一下差异.<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;search(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;array[],&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;left,&nbsp;right,&nbsp;middle;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(left&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;middle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(left&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;right)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(array[middle]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;middle&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(array[middle]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;middle&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;middle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;search2(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;array[],&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;left,&nbsp;right,&nbsp;middle;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(left&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;middle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(left&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;right)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(array[middle]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;middle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(array[middle]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;middle&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;middle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>}<br></span></div>
<br>下面再给出另一种典型的错误的二分查找算法,当查找的元素不在序列内时,它可能造成程序的死循环.<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;search(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;array[],&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;left,&nbsp;right,&nbsp;middle;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(left&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;middle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(left&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;right)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(array[middle]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;middle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(array[middle]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;middle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;middle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>}<br></span></div>
为什么会造成死循环?<br><br>从循环条件来看,这个算法的操作区间是左闭右闭区间的,因此当array[middle] &gt; v时,v如果存在的话应该在[left, middle- 1]中,因此此时right应该是middle - 1,而不是middle;类似的,当array[middle] &lt; v时,下一次操作的区间应该是[middle + 1, right]中.而当元素不存在这个序列中时,算法在一个错误的区间中循环,但是又不能终止循环,于是就造成了死循环.<br><br>因此,要将二分查找算法写对,其实很多人都大概知道思想,具体到编码的时候,就会被这些看似微小的地方搞糊涂.因此,需要注意这一点:<br><span style="font-weight: bold;">算法所操作的区间,是左闭右开区间,还是左闭右闭区间,这个区间,需要在循环初始化,循环体是否终止的判断中,以及每次修改left,right区间值这三个地方保持一致,否则就可能出错.</span><br style="font-weight: bold;"><br><br><br><img src ="http://www.cppblog.com/converse/aggbug/96893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2009-09-21 23:46 <a href="http://www.cppblog.com/converse/archive/2009/09/21/96893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在一个有序序列中查找重复/不存在的数</title><link>http://www.cppblog.com/converse/archive/2009/08/23/94192.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 23 Aug 2009 12:24:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2009/08/23/94192.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/94192.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2009/08/23/94192.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/94192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/94192.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在一个有序序列中查找重复/不存在的数&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2009/08/23/94192.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/94192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2009-08-23 20:24 <a href="http://www.cppblog.com/converse/archive/2009/08/23/94192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己实现的memcpy</title><link>http://www.cppblog.com/converse/archive/2009/04/18/80316.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 18 Apr 2009 01:30:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2009/04/18/80316.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/80316.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2009/04/18/80316.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/80316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/80316.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 没有考虑目标和源地址可能重复的情况,不知道除了这个方法之外不用汇编等方式还有没有更快的方法?至少我目前是想不出来:)<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2009/04/18/80316.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/80316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2009-04-18 09:30 <a href="http://www.cppblog.com/converse/archive/2009/04/18/80316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>另类的链表数据结构以及算法</title><link>http://www.cppblog.com/converse/archive/2009/03/22/77499.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 22 Mar 2009 11:14:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2009/03/22/77499.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/77499.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2009/03/22/77499.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/77499.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/77499.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 另类的链表数据结构以及算法&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2009/03/22/77499.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/77499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2009-03-22 19:14 <a href="http://www.cppblog.com/converse/archive/2009/03/22/77499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcached内存管理算法</title><link>http://www.cppblog.com/converse/archive/2009/03/09/76037.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 09 Mar 2009 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2009/03/09/76037.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/76037.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2009/03/09/76037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/76037.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/76037.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2009/03/09/76037.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/76037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2009-03-09 22:24 <a href="http://www.cppblog.com/converse/archive/2009/03/09/76037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二分查找算法(迭代和递归版本)</title><link>http://www.cppblog.com/converse/archive/2009/02/28/75190.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 28 Feb 2009 11:36:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2009/02/28/75190.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/75190.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2009/02/28/75190.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/75190.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/75190.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2009/02/28/75190.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/75190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2009-02-28 19:36 <a href="http://www.cppblog.com/converse/archive/2009/02/28/75190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.5版本</title><link>http://www.cppblog.com/converse/archive/2008/11/14/66929.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Fri, 14 Nov 2008 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/11/14/66929.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/66929.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/11/14/66929.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/66929.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/66929.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/11/14/66929.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/66929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-11-14 16:54 <a href="http://www.cppblog.com/converse/archive/2008/11/14/66929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>红黑树的实现源码(第二次修订版)</title><link>http://www.cppblog.com/converse/archive/2008/11/10/66530.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 10 Nov 2008 09:50:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/11/10/66530.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/66530.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/11/10/66530.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/66530.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/66530.html</trackback:ping><description><![CDATA[我曾经写过两个两个红黑树的实现, 分别在:<br>http://www.cppblog.com/converse/archive/2006/10/07/13413.html<br>http://www.cppblog.com/converse/archive/2007/11/28/37430.html<br><br>最近因为要给<a href="http://code.google.com/p/commoncache/">ccache</a>加入红黑树的支持, 找出来曾经实现的代码作为参考, 这才发现原来的实现都是有问题的,也怪我的测试用例写的不好, 仅仅对插入操作进行了测试, 我向所有因为阅读了这份代码而造成困惑的朋友表示道歉.<br><br>这次重新实现, 所有的代码推倒重新编写, 参考了<a href="http://lxr.linux.no/linux/lib/rbtree.c">linux内核中红黑树的实现算法</a>, 并且对测试用例进行了加强,希望这是最后一个对红黑树算法的修订版本.<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">/*-----------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; RB-Tree的插入和删除操作的实现算法<br>&nbsp;&nbsp;&nbsp; 参考资料:<br>&nbsp;&nbsp;&nbsp; 1) &lt;&lt;Introduction to algorithm&gt;&gt;<br>&nbsp;&nbsp;&nbsp; 2) http://lxr.linux.no/linux/lib/rbtree.c<br><br>&nbsp;&nbsp;&nbsp; 作者：http://www.cppblog.com/converse/<br>&nbsp;&nbsp;&nbsp; 您可以自由的传播，修改这份代码，转载处请注明原作者<br><br>&nbsp;&nbsp;&nbsp; 红黑树的几个性质:<br>&nbsp;&nbsp;&nbsp; 1) 每个结点只有红和黑两种颜色<br>&nbsp;&nbsp;&nbsp; 2) 根结点是黑色的<br>&nbsp;&nbsp;&nbsp; 3)空节点是黑色的（红黑树中，根节点的parent以及所有叶节点lchild、rchild都不指向NULL，而是指向一个定义好的空节点）。 <br>&nbsp;&nbsp;&nbsp; 4) 如果一个结点是红色的,那么它的左右两个子结点的颜色是黑色的<br>&nbsp;&nbsp;&nbsp; 5) 对于每个结点而言,从这个结点到叶子结点的任何路径上的黑色结点<br>&nbsp;&nbsp;&nbsp; 的数目相同<br>-------------------------------------------------------------*/<br>&nbsp;<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;string.h&gt;<br><br>typedef int key_t;<br>typedef int data_t;<br><br>typedef enum color_t<br>{<br>&nbsp;&nbsp;&nbsp; RED = 0,<br>&nbsp;&nbsp;&nbsp; BLACK = 1<br>}color_t;<br><br>typedef struct rb_node_t<br>{<br>&nbsp;&nbsp;&nbsp; struct rb_node_t *left, *right, *parent;<br>&nbsp;&nbsp;&nbsp; key_t key;<br>&nbsp;&nbsp;&nbsp; data_t data;<br>&nbsp;&nbsp;&nbsp; color_t color;<br>}rb_node_t;<br><br>/* forward declaration */<br>rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root);<br>rb_node_t* rb_search(key_t key, rb_node_t* root);<br>rb_node_t* rb_erase(key_t key, rb_node_t* root);<br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int i, count = 900000;<br>&nbsp;&nbsp;&nbsp; key_t key;<br>&nbsp;&nbsp;&nbsp; rb_node_t* root = NULL, *node = NULL;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; srand(time(NULL));<br>&nbsp;&nbsp;&nbsp; for (i = 1; i &lt; count; ++i)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key = rand() % count;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((root = rb_insert(key, i, root)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] insert key %d success!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] insert key %d error!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((node = rb_search(key, root)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] search key %d success!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] search key %d error!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(i % 10))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((root = rb_erase(key, root)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] erase key %d success\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] erase key %d error\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>static rb_node_t* rb_new_node(key_t key, data_t data)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *node = (rb_node_t*)malloc(sizeof(struct rb_node_t));<br><br>&nbsp;&nbsp;&nbsp; if (!node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("malloc error!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; node-&gt;key = key, node-&gt;data = data;<br><br>&nbsp;&nbsp;&nbsp; return node;<br>}<br><br>/*-----------------------------------------------------------<br>|&nbsp;&nbsp; node&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right<br>|&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp; ==&gt;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp;&nbsp; a&nbsp; right&nbsp;&nbsp;&nbsp;&nbsp; node&nbsp; y<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b&nbsp; y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp; b<br>&nbsp;-----------------------------------------------------------*/<br>static rb_node_t* rb_rotate_left(rb_node_t* node, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t* right = node-&gt;right;<br><br>&nbsp;&nbsp;&nbsp; if ((node-&gt;right = right-&gt;left))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right-&gt;left-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; right-&gt;left = node;<br><br>&nbsp;&nbsp;&nbsp; if ((right-&gt;parent = node-&gt;parent))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node == node-&gt;parent-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;right = right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;left = right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = right;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; node-&gt;parent = right;<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>/*-----------------------------------------------------------<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp;&nbsp;&nbsp; left&nbsp; y&nbsp;&nbsp; ==&gt;&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp; node<br>|&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp; a&nbsp;&nbsp; b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b&nbsp;&nbsp; y<br>-----------------------------------------------------------*/<br>static rb_node_t* rb_rotate_right(rb_node_t* node, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t* left = node-&gt;left;<br><br>&nbsp;&nbsp;&nbsp; if ((node-&gt;left = left-&gt;right))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left-&gt;right-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; left-&gt;right = node;<br><br>&nbsp;&nbsp;&nbsp; if ((left-&gt;parent = node-&gt;parent))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node == node-&gt;parent-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;right = left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;left = left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = left;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; node-&gt;parent = left;<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>static rb_node_t* rb_insert_rebalance(rb_node_t *node, rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *parent, *gparent, *uncle, *tmp;<br><br>&nbsp;&nbsp;&nbsp; while ((parent = node-&gt;parent) &amp;&amp; parent-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent = parent-&gt;parent;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent == gparent-&gt;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle = gparent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (uncle &amp;&amp; uncle-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = gparent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;right == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(gparent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle = gparent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (uncle &amp;&amp; uncle-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = gparent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(gparent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; root-&gt;color = BLACK;<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>static rb_node_t* rb_erase_rebalance(rb_node_t *node, rb_node_t *parent, rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *other, *o_left, *o_right;<br><br>&nbsp;&nbsp;&nbsp; while ((!node || node-&gt;color == BLACK) &amp;&amp; node != root)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((!other-&gt;left || other-&gt;left-&gt;color == BLACK) &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (!other-&gt;right || other-&gt;right-&gt;color == BLACK))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!other-&gt;right || other-&gt;right-&gt;color == BLACK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((o_left = other-&gt;left))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o_left-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(other, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = parent-&gt;color;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;right-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((!other-&gt;left || other-&gt;left-&gt;color == BLACK) &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (!other-&gt;right || other-&gt;right-&gt;color == BLACK))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!other-&gt;left || other-&gt;left-&gt;color == BLACK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((o_right = other-&gt;right))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o_right-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(other, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = parent-&gt;color;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;left-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if (node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>static rb_node_t* rb_search_auxiliary(key_t key, rb_node_t* root, rb_node_t** save)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *node = root, *parent = NULL;<br>&nbsp;&nbsp;&nbsp; int ret;<br><br>&nbsp;&nbsp;&nbsp; while (node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = node-&gt;key - key;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (0 &lt; ret)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (0 &gt; ret)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if (save)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *save = parent;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return NULL;<br>}<br><br>rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *parent = NULL, *node;<br><br>&nbsp;&nbsp;&nbsp; parent = NULL;<br>&nbsp;&nbsp;&nbsp; if ((node = rb_search_auxiliary(key, root, &amp;parent)))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return root;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; node = rb_new_node(key, data);<br>&nbsp;&nbsp;&nbsp; node-&gt;parent = parent; <br>&nbsp;&nbsp;&nbsp; node-&gt;left = node-&gt;right = NULL;<br>&nbsp;&nbsp;&nbsp; node-&gt;color = RED;<br><br>&nbsp;&nbsp;&nbsp; if (parent)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;key &gt; key)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;left = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;right = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = node;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return rb_insert_rebalance(node, root);<br>}<br><br>rb_node_t* rb_search(key_t key, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; return rb_search_auxiliary(key, root, NULL);<br>}<br><br>rb_node_t* rb_erase(key_t key, rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *child, *parent, *old, *left, *node;<br>&nbsp;&nbsp;&nbsp; color_t color;<br><br>&nbsp;&nbsp;&nbsp; if (!(node = rb_search_auxiliary(key, root, NULL)))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("key %d is not exist!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return root;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; old = node;<br><br>&nbsp;&nbsp;&nbsp; if (node-&gt;left &amp;&amp; node-&gt;right)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((left = node-&gt;left) != NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color = node-&gt;color;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (child)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child-&gt;parent = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;left = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;right = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node-&gt;parent == old)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent = old-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;color = old-&gt;color;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;right = old-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;left = old-&gt;left;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (old-&gt;parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (old-&gt;parent-&gt;left == old)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;parent-&gt;left = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;parent-&gt;right = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;left-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (old-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;right-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!node-&gt;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (!node-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child = node-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color = node-&gt;color;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (child)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child-&gt;parent = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;left = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;right = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; free(old);<br><br>&nbsp;&nbsp;&nbsp; if (color == BLACK)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_erase_rebalance(child, parent, root);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br></span><span style="color: #000000;"><br><br></span></div>
<br><br>     <img src ="http://www.cppblog.com/converse/aggbug/66530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-11-10 17:50 <a href="http://www.cppblog.com/converse/archive/2008/11/10/66530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.4版本</title><link>http://www.cppblog.com/converse/archive/2008/10/31/65656.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Fri, 31 Oct 2008 15:59:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/10/31/65656.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/65656.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/10/31/65656.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/65656.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/65656.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/10/31/65656.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/65656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-10-31 23:59 <a href="http://www.cppblog.com/converse/archive/2008/10/31/65656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(算法导论习题解exercise2.3-4)递归版插入排序</title><link>http://www.cppblog.com/converse/archive/2008/09/29/63068.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 29 Sep 2008 15:27:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/29/63068.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63068.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/29/63068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63068.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63068.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/29/63068.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-29 23:27 <a href="http://www.cppblog.com/converse/archive/2008/09/29/63068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(算法导论习题解problem2.4)寻找一个序列中逆序对的数量</title><link>http://www.cppblog.com/converse/archive/2008/09/29/63058.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 29 Sep 2008 12:32:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/29/63058.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63058.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/29/63058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63058.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63058.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/29/63058.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-29 20:32 <a href="http://www.cppblog.com/converse/archive/2008/09/29/63058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(算法导论习题解exercise2.3-7)给定一个整数序列以及一个数X,确定该序列中是否有两个数的和为X</title><link>http://www.cppblog.com/converse/archive/2008/09/29/63024.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 29 Sep 2008 02:40:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/29/63024.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63024.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/29/63024.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63024.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/29/63024.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-29 10:40 <a href="http://www.cppblog.com/converse/archive/2008/09/29/63024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原地归并算法</title><link>http://www.cppblog.com/converse/archive/2008/09/28/63008.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 28 Sep 2008 11:51:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/28/63008.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63008.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/28/63008.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63008.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63008.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/28/63008.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-28 19:51 <a href="http://www.cppblog.com/converse/archive/2008/09/28/63008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AVL树删除节点算法</title><link>http://www.cppblog.com/converse/archive/2008/09/17/62069.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 17 Sep 2008 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/17/62069.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/62069.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/17/62069.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/62069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/62069.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/17/62069.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/62069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-17 12:38 <a href="http://www.cppblog.com/converse/archive/2008/09/17/62069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AVL树中单,双旋转的解释</title><link>http://www.cppblog.com/converse/archive/2008/09/08/61266.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 07 Sep 2008 16:23:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/08/61266.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/61266.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/08/61266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/61266.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/61266.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/08/61266.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/61266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-08 00:23 <a href="http://www.cppblog.com/converse/archive/2008/09/08/61266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>前缀匹配问题与trie树</title><link>http://www.cppblog.com/converse/archive/2008/08/19/59393.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 19 Aug 2008 15:41:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/08/19/59393.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/59393.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/08/19/59393.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/59393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/59393.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/08/19/59393.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/59393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-08-19 23:41 <a href="http://www.cppblog.com/converse/archive/2008/08/19/59393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务器公共库开发-内存池管理模块</title><link>http://www.cppblog.com/converse/archive/2008/08/11/58563.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 11 Aug 2008 15:30:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/08/11/58563.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/58563.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/08/11/58563.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/58563.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/58563.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/08/11/58563.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/58563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-08-11 23:30 <a href="http://www.cppblog.com/converse/archive/2008/08/11/58563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.3版本</title><link>http://www.cppblog.com/converse/archive/2008/08/07/58253.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Thu, 07 Aug 2008 09:27:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/08/07/58253.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/58253.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/08/07/58253.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/58253.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/58253.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/08/07/58253.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/58253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-08-07 17:27 <a href="http://www.cppblog.com/converse/archive/2008/08/07/58253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用位操作得到大于N且为2的次方的最小的数</title><link>http://www.cppblog.com/converse/archive/2008/06/21/54225.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 21 Jun 2008 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/06/21/54225.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/54225.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/06/21/54225.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/54225.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/54225.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如何使用位操作得到大于N且为2的次方的最小的数&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/06/21/54225.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/54225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-06-21 15:36 <a href="http://www.cppblog.com/converse/archive/2008/06/21/54225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.2版本</title><link>http://www.cppblog.com/converse/archive/2008/04/02/46016.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 02 Apr 2008 04:00:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/04/02/46016.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/46016.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/04/02/46016.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/46016.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/46016.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ccache发布0.2版本&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/04/02/46016.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/46016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-04-02 12:00 <a href="http://www.cppblog.com/converse/archive/2008/04/02/46016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>研究了一下SGI STL的内存算法</title><link>http://www.cppblog.com/converse/archive/2008/04/01/45947.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 01 Apr 2008 11:55:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/04/01/45947.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/45947.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/04/01/45947.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/45947.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/45947.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 仿SGI STL的内存池算法.<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/04/01/45947.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/45947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-04-01 19:55 <a href="http://www.cppblog.com/converse/archive/2008/04/01/45947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcache内存池的设计原理</title><link>http://www.cppblog.com/converse/archive/2008/01/21/41592.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 21 Jan 2008 15:34:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/01/21/41592.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/41592.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/01/21/41592.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/41592.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/41592.html</trackback:ping><description><![CDATA[memcache中管理内存的数据结构如下:<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">typedef&nbsp;struct&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;sizes&nbsp;of&nbsp;items&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;perslab;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;how&nbsp;many&nbsp;items&nbsp;per&nbsp;slab&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">slots;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;list&nbsp;of&nbsp;item&nbsp;ptrs&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sl_total;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;size&nbsp;of&nbsp;previous&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sl_curr;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;first&nbsp;free&nbsp;slot&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">end_page_ptr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;pointer&nbsp;</span><span style="COLOR: #0000ff">to</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">next</span><span style="COLOR: #000000">&nbsp;free&nbsp;item&nbsp;at&nbsp;</span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000">&nbsp;of&nbsp;page,&nbsp;</span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;end_page_free;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;number&nbsp;of&nbsp;items&nbsp;remaining&nbsp;at&nbsp;</span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000">&nbsp;of&nbsp;last&nbsp;alloced&nbsp;page&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;slabs;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;how&nbsp;many&nbsp;slabs&nbsp;were&nbsp;allocated&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;this&nbsp;class&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">slab_list;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">&nbsp;of&nbsp;slab&nbsp;pointers&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;list_size;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;size&nbsp;of&nbsp;prev&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;killing;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;index</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;of&nbsp;dying&nbsp;slab,&nbsp;</span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000">&nbsp;zero&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;none&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}&nbsp;slabclass_t;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>程序中有一个全局的数组<br>static slabclass_t slabclass[POWER_LARGEST + 1]用于保存slab,预分配内存池时调用的是void slabs_init(const size_t limit, const double factor) 函数,其中limit是内存池的最大容量,factor是分配时的增长因子.<br>比方说,加入factor是2,第一个在slabclass数组中的slab的每个item大小是128字节,那么下一个slab每个item的大小就是128*2,再下一个就是128*2*2(注意,为了简化问题的说明,上面没有考虑地址对齐的因素).<br><br>在预分配内存池时,最多给每个slab保存item的容量是1M内存,这个数值由#define POWER_BLOCK 1048576决定.<br>因此,slab中的几个元素在预分配内存时是这么定的:<br>size有一个起始值,这个值以后的增长由factor决定,增长的过程前面已经阐述过了;<br>perslab保存的是一个slab存放的item数量,因此perslab = POWER_BLOCK / slabclass[i].size;<br>如果预先分配一段内存供使用的话,也就是没有定义DONT_PREALLOC_SLABS宏,那么就调用slabs_preallocate进行预分配内存.<br>其中,end_page_ptr指向这个预分配好的指针,end_page_free表示的是目前空闲可用item的数量,在预分配时,这个值与perslab相同.<br>在这个内存池模型中,每个page实际上是一个数组,数组中每个元素的大小就是这个slab中item的大小.<br><br>另外,slots保存的是释放出来的item指针,sl_total表示总的数量,sl_curr表示的是目前可用的已经释放出来的item数量.<br><br>每一次要分配内存的时候,首先根据需要分配的内存大小在slabclass数组中查找索引最小的一个大于所要求内存的slab,如果slots不为空,那么就从这里返回内存,否则去查找end_page_ptr,如果也没有,那么就只能返回NULL了.<br>每一次释放内存的时候,同样的找到应该返回内存的slab元素,改写前面提到的slot指针和sl_curr数.<br><br>有点仓促,以后再完善~~<br><br><br>
<img src ="http://www.cppblog.com/converse/aggbug/41592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-01-21 23:34 <a href="http://www.cppblog.com/converse/archive/2008/01/21/41592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法]红黑树的实现代码(修订版)</title><link>http://www.cppblog.com/converse/archive/2007/11/28/37430.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 28 Nov 2007 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/11/28/37430.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/37430.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/11/28/37430.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/37430.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/37430.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [算法]红黑树的实现代码(修订版)&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/11/28/37430.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/37430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-11-28 14:29 <a href="http://www.cppblog.com/converse/archive/2007/11/28/37430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法]找出m个数中最小的n个数</title><link>http://www.cppblog.com/converse/archive/2007/11/26/37333.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 26 Nov 2007 10:54:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/11/26/37333.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/37333.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/11/26/37333.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/37333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/37333.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 找出n个数中最大的m个数。&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/11/26/37333.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/37333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-11-26 18:54 <a href="http://www.cppblog.com/converse/archive/2007/11/26/37333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AVL树的实现代码</title><link>http://www.cppblog.com/converse/archive/2007/08/29/31179.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 29 Aug 2007 14:06:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/08/29/31179.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/31179.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/08/29/31179.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/31179.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/31179.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: AVL树的实现代码&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/08/29/31179.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/31179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-08-29 22:06 <a href="http://www.cppblog.com/converse/archive/2007/08/29/31179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>仿STL中的堆算法的一个实现</title><link>http://www.cppblog.com/converse/archive/2007/03/20/20175.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 19 Mar 2007 16:28:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/03/20/20175.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/20175.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/03/20/20175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/20175.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/20175.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 仿STL中的堆算法的一个实现&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/03/20/20175.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/20175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-03-20 00:28 <a href="http://www.cppblog.com/converse/archive/2007/03/20/20175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[数据结构]红黑树的实现源码</title><link>http://www.cppblog.com/converse/archive/2006/10/07/13413.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 07 Oct 2006 06:32:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/10/07/13413.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/13413.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/10/07/13413.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/13413.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/13413.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 半年之前写的一个红黑树的实现算法了,当时有点忙没有写相应的文档,一下子几乎全都忘记了,作一个记录,改天有空了来补充说明文档.&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/10/07/13413.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/13413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-10-07 14:32 <a href="http://www.cppblog.com/converse/archive/2006/10/07/13413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法问题]合并两个已经排序的数组为另一个数组</title><link>http://www.cppblog.com/converse/archive/2006/09/26/13006.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 26 Sep 2006 15:27:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/09/26/13006.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/13006.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/09/26/13006.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/13006.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/13006.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设子数组a[0:k]和a[k+1:n-1]已排好序（0<=k<=n-1).试设计一个合并这两个子数组为排好序的数组a[0:n-1]的算法．要求算法在最坏的情况下所用的计算时间为O(n), 且只用到O(1)的辅助空间．&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/09/26/13006.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/13006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-09-26 23:27 <a href="http://www.cppblog.com/converse/archive/2006/09/26/13006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法问题]交换两个子数组的元素值</title><link>http://www.cppblog.com/converse/archive/2006/09/26/13005.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 26 Sep 2006 15:21:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/09/26/13005.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/13005.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/09/26/13005.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/13005.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/13005.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设a[0:n-1]是一个有n个元素的数组，k(0<=k<=n-1)是一个非负整数．试设计一个算法将子数组a[0:k]与a[k+1:n-1]换位．要求算法在最坏情况下耗时O(n), 且只用到O(1)的辅助空间．&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/09/26/13005.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/13005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-09-26 23:21 <a href="http://www.cppblog.com/converse/archive/2006/09/26/13005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉查找树的解析与实现</title><link>http://www.cppblog.com/converse/archive/2006/07/29/10665.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Fri, 28 Jul 2006 16:33:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/29/10665.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/10665.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/29/10665.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/10665.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/10665.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 二叉查找树的解析与实现&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/07/29/10665.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/10665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-29 00:33 <a href="http://www.cppblog.com/converse/archive/2006/07/29/10665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>