﻿<?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>BlogJava-Snowdream-随笔分类-Algorithm</title><link>http://www.blogjava.net/zellux/category/22032.html</link><description>迷茫的大二：读书 思考 等待</description><language>zh-cn</language><lastBuildDate>Wed, 23 Apr 2008 17:14:43 GMT</lastBuildDate><pubDate>Wed, 23 Apr 2008 17:14:43 GMT</pubDate><ttl>60</ttl><item><title>URAL 1011</title><link>http://www.blogjava.net/zellux/archive/2008/04/23/195333.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 23 Apr 2008 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/23/195333.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/195333.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/23/195333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/195333.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/195333.html</trackback:ping><description><![CDATA[
		<h3 class="subtitle">Problem</h3>
		<p>Every bus in the Ekaterinburg city has a special man (or woman) called 
conductor. When you ride the bus, you have to give money to the conductor.
We know that there are more then <i>P</i>% conductors and less then <i>Q</i>% conductors.
Your task is to determine a minimal possible number of Ekaterinburg citizens. <br /></p>
		<br />我只能说太挫了。。。精度问题搞了半天，看来浮点还是要尽量化成整型再算啊。<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><img id="Code_Closed_Image_224337" onclick="this.style.display='none'; Code_Closed_Text_224337.style.display='none'; Code_Open_Image_224337.style.display='inline'; Code_Open_Text_224337.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11" /><img id="Code_Open_Image_224337" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_224337.style.display='none'; Code_Closed_Image_224337.style.display='inline'; Code_Closed_Text_224337.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11" /><span id="Code_Closed_Text_224337" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255);"></span><span id="Code_Open_Text_224337" style="display: none;"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">iostream</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">cmath</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> std;<br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> main()<br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> dp, dq;<br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);">    cin </span><span style="color: rgb(0, 0, 0);">&gt;&gt;</span><span style="color: rgb(0, 0, 0);"> dp </span><span style="color: rgb(0, 0, 0);">&gt;&gt;</span><span style="color: rgb(0, 0, 0);"> dq;<br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> p </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> floor(dp </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0.5</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> q </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> floor(dq </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0.5</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">; ; i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">) {<br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> a </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> p </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">10000</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> b </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> q </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">10000</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> ((a </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> b) </span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);"> (q </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">10000</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">)) {<br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 0, 0);">            cout </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> endl;<br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 0, 0);">        }<br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);">}<br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);"></span></span></div><br />还有个问题就是q*i是开区间还是闭区间，总之Wrong Answer了无数次后总算过了。。。<br /><img src ="http://www.blogjava.net/zellux/aggbug/195333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-23 22:44 <a href="http://www.blogjava.net/zellux/archive/2008/04/23/195333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>URAL 题解 - wiki</title><link>http://www.blogjava.net/zellux/archive/2008/04/17/193697.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 17 Apr 2008 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/17/193697.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/193697.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/17/193697.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/193697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/193697.html</trackback:ping><description><![CDATA[
		<a href="http://www.nocow.cn/index.php">http://www.nocow.cn/index.php</a>
		<br />
		<br />抽时间多做做，提高下我可怜的算法功底 &gt;,&lt;<img src ="http://www.blogjava.net/zellux/aggbug/193697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-17 11:48 <a href="http://www.blogjava.net/zellux/archive/2008/04/17/193697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《编程之美》上的一道题目的讨论</title><link>http://www.blogjava.net/zellux/archive/2008/04/15/192955.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 14 Apr 2008 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/15/192955.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/192955.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/15/192955.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/192955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/192955.html</trackback:ping><description><![CDATA[
		<p>计算机科学论坛最近举办了一个阅读样章，提交书评的活动，具体内容请见<a href="http://www.ieee.org.cn/dispbbs.asp?boardID=42&amp;ID=61162">http://www.ieee.org.cn/dispbbs.asp?boardID=42&amp;ID=61162</a>。</p>
		<p>这里我想针对样章上的一个问题谈谈自己的理解。</p>
		<p>问题很简单，求二进制中1的个数。对于一个字节（8bit）的变量，求其二进制表示中"1"的个数，要求算法的执行效率尽可能的高。</p>
		<p>先来看看样章上给出的几个算法：</p>
		<p>解法一，每次除二，看是否为奇数，是的话就累计加一，最后这个结果就是二进制表示中1的个数。</p>
		<p>解法二，同样用到一个循环，只是里面的操作用位移操作简化了。</p>
		<p>
				<font face="Courier New">   1:  int Count(int v)   <br />   2:  {   <br />   3:      int num = 0;<br />   4:      while (v) {   <br />   5:          num += v &amp; 0x01;   <br />   6:          v &gt;&gt;= 1;   <br />   7:      }   <br />   8:      return num;   <br />   9:  }</font>
		</p>
		<p>解法三，用到一个巧妙的与操作，v &amp; (v -1 )每次能消去二进制表示中最后一位1，利用这个技巧可以减少一定的循环次数。</p>
		<p>解法四，查表法，因为只有数据8bit，直接建一张表，包含各个数中1的个数，然后查表就行。复杂度O(1)。</p>
		<p>
				<font face="Courier New">   1:  int countTable[256] = { 0, 1, 1, 2, 1, ..., 7, 7, 8 };   <br />   2:      <br />   3:  int Count(int v) {   <br />   4:      return countTable[v];   <br />   5:  }<br /></font>   <br />好了，这就是样章上给出的四种方案，下面谈谈我的看法。</p>
		<p>首先是对算法的衡量上，复杂度真的是唯一的标准吗？尤其对于这种数据规模给定，而且很小的情况下，复杂度其实是个比较次要的因素。</p>
		<p>查表法的复杂度为O(1)，我用解法一，循环八次固定，复杂度也是O(1)。至于数据规模变大，变成32位整型，那查表法自然也不合适了。</p>
		<p>其次，我觉得既然是这样一个很小的操作，衡量的尺度也必然要小，CPU时钟周期可以作为一个参考。</p>
		<p>解法一里有若干次整数加法，若干次整数除法（一般的编译器都能把它优化成位移），还有几个循环分支判断，几个奇偶性判断（这个比较耗时间，根据CSAPP上的数据，一般一个branch penalty得耗掉14个左右的cycle），加起来大概几十个cycle吧。</p>
		<p>再看解法四，查表法看似一次地址计算就能解决，但实际上这里用到一个访存操作，而且第一次访存的时候很有可能那个数组不在cache里，这样一个cache miss导致的后果可能就是耗去几十甚至上百个cycle（因为要访问内存）。所以对于这种“小操作”，这个算法的性能其实是很差的。</p>
		<p>这里我再推荐几个解决这个问题的算法，以32位无符号整型为例。</p>
		<p>
				<font face="Courier New">   1:  int Count(unsigned x) {   <br />   2:     x = x - ((x &gt;&gt; 1) &amp; 0x55555555);    <br />   3:     x = (x &amp; 0x33333333) + ((x &gt;&gt; 2) &amp; 0x33333333);    <br />   4:     x = (x + (x &gt;&gt; 4)) &amp; 0x0F0F0F0F;    <br />   5:     x = x + (x &gt;&gt; 8);    <br />   6:     x = x + (x &gt;&gt; 16);    <br />   7:     return x &amp; 0x0000003F;    <br />   8:  } <br /></font>   <br />这里用的是二分法，两两一组相加，之后四个四个一组相加，接着八个八个，最后就得到各位之和了。</p>
		<p>还有一个更巧妙的HAKMEM算法</p>
		<p>
				<font face="Courier New">   1:  int Count(unsigned x) {<br />   2:     unsigned n;    <br />   3:      <br />   4:     n = (x &gt;&gt; 1) &amp; 033333333333;    <br />   5:     x = x - n;   <br />   6:     n = (n &gt;&gt; 1) &amp; 033333333333;   <br />   7:     x = x - n;    <br />   8:     x = (x + (x &gt;&gt; 3)) &amp; 030707070707;   <br />   9:     x = modu(x, 63);  <br />   10:     return x;   <br />   11:  } <br /></font>   <br />首先是将二进制各位三个一组，求出每组中1的个数，然后相邻两组归并，得到六个一组的1的个数，最后很巧妙的用除63取余得到了结果。</p>
		<p>因为2^6 = 64，也就是说 x_0 + x_1 * 64 + x_2 * 64 * 64 = x_0 + x_1 + x_2 (mod 63)，这里的等号表示同余。</p>
		<p>这个程序只需要十条左右指令，而且不访存，速度很快。</p>
		<p>由此可见，衡量一个算法实际效果不单要看复杂度，还要结合其他情况具体分析。</p>
		<p>关于后面的两道扩展问题，问题一是问32位整型如何处理，这个上面已经讲了。</p>
		<p>问题二是给定两个整数A和B，问A和B有多少位是不同的。</p>
		<p>这个问题其实就是数1问题多了一个步骤，只要先算出A和B的异或结果，然后求这个值中1的个数就行了。<br /><br />总体看来这本书还是很不错的，比较喜欢里面针对一个问题提出不同算法并不断改进的风格。这里提出一点个人的理解，望大家指正 ;-)<br /></p>
		<p>(by ZelluX   <a href="/zellux">http://www.blogjava.net/zellux</a>)<br /></p>
<img src ="http://www.blogjava.net/zellux/aggbug/192955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-15 00:23 <a href="http://www.blogjava.net/zellux/archive/2008/04/15/192955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求n个32位无符号整数中异或后值最大的两个数</title><link>http://www.blogjava.net/zellux/archive/2008/04/10/191717.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 09 Apr 2008 16:33:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/10/191717.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/191717.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/10/191717.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/191717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/191717.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 问题：<br>给定n个32位无符号整数，求出其中异或结果最大的两个整数。&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2008/04/10/191717.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/191717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-10 00:33 <a href="http://www.blogjava.net/zellux/archive/2008/04/10/191717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SICP 习题记录 (1)</title><link>http://www.blogjava.net/zellux/archive/2008/04/03/188018.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 03 Apr 2008 14:33:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/03/188018.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/188018.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/03/188018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/188018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/188018.html</trackback:ping><description><![CDATA[没事干找了几个SICP上的习题做，先是一道以前只想出一种很啰嗦的写法的题目<br /><br />Ex 2.18<br />把一个列表倒过来。不习惯在lisp里用iterative方式 &gt;,&lt;<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 id="Code_Closed_Image_215109" onclick="this.style.display='none'; Code_Closed_Text_215109.style.display='none'; Code_Open_Image_215109.style.display='inline'; Code_Open_Text_215109.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_215109" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_215109.style.display='none'; Code_Closed_Image_215109.style.display='inline'; Code_Closed_Text_215109.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_215109" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_215109" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (reverse items)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (define (reverse-iter i k)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    (if (null? i)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        k<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        (reverse-iter (cdr i)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                      (cons (car i) k))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (reverse-iter items ()))</span></span></div><br />接下来几题都是Map-Reduce思想的应用（或者照书上的说法，用enumerator - filter - map - accumulator这四个步骤操作一个list）<br /><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 id="Code_Closed_Image_214237" onclick="this.style.display='none'; Code_Closed_Text_214237.style.display='none'; Code_Open_Image_214237.style.display='inline'; Code_Open_Text_214237.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_214237" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_214237.style.display='none'; Code_Closed_Image_214237.style.display='inline'; Code_Closed_Text_214237.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_214237" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_214237" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (filter predicate sequence)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (cond ((null? sequence) null)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        ((predicate (car sequence))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         (cons (car sequence) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />               (filter predicate (cdr sequence))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        (else (filter predicate (cdr sequence)))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(define (accumulate op initial sequence)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (if (null? sequence)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      initial<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      (op (car sequence)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          (accumulate op initial (cdr sequence)))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(define (enumerate-interval low high)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (if (&gt; low high)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      null<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      (cons low (enumerate-interval (+ low </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) high))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(define (enumerate-tree tree)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (cond ((null? tree) null)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        ((pair? tree)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         (append (enumerate-tree (car tree))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                 (enumerate-tree (cdr tree))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        (else (list tree))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div><br />enumrate-tree 的功能是遍历一个树状结构，把其中的所有叶子保存在一个list中。<br /><br />Ex 2.34<br />利用Horner's rule计算多项式结果（这公式这几天还经常碰到）<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 id="Code_Closed_Image_214514" onclick="this.style.display='none'; Code_Closed_Text_214514.style.display='none'; Code_Open_Image_214514.style.display='inline'; Code_Open_Text_214514.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_214514" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_214514.style.display='none'; Code_Closed_Image_214514.style.display='inline'; Code_Closed_Text_214514.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_214514" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_214514" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (hornel-eval x coefficient-sequence)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (accumulate (lambda (this-coeff higher-terms)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                (+ this-coeff (* x higher-terms)))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />              </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />              coefficient-sequence))</span></span></div><p>Ex 2.35<br />数出一棵树中的叶子数。这题我的做法比较土，没想到map-reduce操作上的递归，而是把叶子节点的值都改成1然后一个累加。</p><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 id="Code_Closed_Image_214823" onclick="this.style.display='none'; Code_Closed_Text_214823.style.display='none'; Code_Open_Image_214823.style.display='inline'; Code_Open_Text_214823.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_214823" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_214823.style.display='none'; Code_Closed_Image_214823.style.display='inline'; Code_Closed_Text_214823.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_214823" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_214823" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (count-leave tree)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (accumulate +<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />              </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />              (map (lambda (x) </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                   (enumerate-tree tree))))</span></span></div><p>其实只要递归调用主函数就行了</p><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 id="Code_Closed_Image_214939" onclick="this.style.display='none'; Code_Closed_Text_214939.style.display='none'; Code_Open_Image_214939.style.display='inline'; Code_Open_Text_214939.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_214939" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_214939.style.display='none'; Code_Closed_Image_214939.style.display='inline'; Code_Closed_Text_214939.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_214939" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_214939" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (count-leaves t)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (accumulate + </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> (map (lambda (x) (if (pair? x) (count-leaves x) </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)) t)))</span></span></div><p>Ex 2.36<br />可以理解为计算矩阵各列之和吧</p><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 id="Code_Closed_Image_233258" onclick="this.style.display='none'; Code_Closed_Text_233258.style.display='none'; Code_Open_Image_233258.style.display='inline'; Code_Open_Text_233258.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_233258" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_233258.style.display='none'; Code_Closed_Image_233258.style.display='inline'; Code_Closed_Text_233258.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_233258" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_233258" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (accumulate-n op init seqs)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (if (null? (car seqs))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      null<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      (cons (accumulate op init (map car seqs))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            (accumulate-n op init (map cdr seqs)))))</span></span></div><br />&gt; (accumulate-n + 0 (list (list 1 2 3) (list 4 5 6) (list 7 8 9) (list 10 11 12)))<br />(22 26 30)<img src ="http://www.blogjava.net/zellux/aggbug/188018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-03 22:33 <a href="http://www.blogjava.net/zellux/archive/2008/04/03/188018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式的复杂度</title><link>http://www.blogjava.net/zellux/archive/2008/03/27/188904.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 26 Mar 2008 16:21:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/03/27/188904.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/188904.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/03/27/188904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/188904.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/188904.html</trackback:ping><description><![CDATA[
		<p>其实理解了 Regular Expression -&gt; NFA -&gt; DFA 这个过程，大致的复杂度确定也不难<br /><br />发信人: styc (styc), 信区: Algorithm<br />标  题: Re: 请问一下大家正则表达式的时间复杂度<br />发信站: 水木社区 (Wed Mar 26 20:37:02 2008), 站内</p>
		<p>NFA构造O(n)，匹配O(nm)<br />DFA构造O(2^n)，最小化O(kn'logn')（N'=O(2^n)），匹配O(m)<br />n=regex长度，m=串长，k=字母表大小，n'=原始的dfa大小<br />大概是这样子吧<br /></p>
<img src ="http://www.blogjava.net/zellux/aggbug/188904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-03-27 00:21 <a href="http://www.blogjava.net/zellux/archive/2008/03/27/188904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Minesweeper is NP-complete</title><link>http://www.blogjava.net/zellux/archive/2008/02/06/179406.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 06 Feb 2008 11:40:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/06/179406.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/179406.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/06/179406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/179406.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/179406.html</trackback:ping><description><![CDATA[http://web.mat.bham.ac.uk/R.W.Kaye/minesw/ordmsw.htm<br />
<br />
居然是NPC...
<img src ="http://www.blogjava.net/zellux/aggbug/179406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-06 19:40 <a href="http://www.blogjava.net/zellux/archive/2008/02/06/179406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tom Duff on Duff's Device</title><link>http://www.blogjava.net/zellux/archive/2007/11/29/164015.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 29 Nov 2007 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/11/29/164015.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/164015.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/11/29/164015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/164015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/164015.html</trackback:ping><description><![CDATA[Subject: Re: Explanation, please!<br />
Summary: Original citation<br />
From: <a href="http://www.lysator.liu.se/c/td/index.html" name="td">td@alice.UUCP (Tom Duff)</a><br />
Organization: AT&amp;T Bell Laboratories, Murray Hill NJ<br />
Date: 29 Aug 88 20:33:51 GMT<br />
Message-ID: &lt;8144@alice.UUCP&gt;<br />
<p>I normally do not read comp.lang.c, but Jim McKie told me that ``<a href="http://www.lysator.liu.se/c/duffs-device.html#duffs-device">Duff's device</a>'' had come up in comp.lang.c again.&nbsp;<tt> </tt>I have lost the version that was sent to netnews in May 1984, but I have reproduced below the note in which I originally proposed the device.&nbsp;<tt> </tt>(If anybody has a copy of the netnews version, I would gratefully receive a copy at research!td or td@research.att.com.)
<p>To clear up a few points:<br />
<ol>
    <li>The point of the device is to express general loop unrolling directly in C.&nbsp;<tt> </tt>People who have posted saying `just use memcpy' have missed the point, as have those who have criticized it using various machine-dependent memcpy implementations as support.&nbsp;<tt> </tt>In fact, the example in the message is not implementable as memcpy, nor is any computer likely to have an memcpy-like idiom that implements it.
    <p>&nbsp;</p>
    <li>Somebody claimed that while the device was named for me, I probably didn't invent it.&nbsp;<tt> </tt>I almost certainly did invent it.&nbsp;<tt> </tt>I had definitely not seen or heard of it when I came upon it, and nobody has ever even claimed prior knowledge, let alone provided dates and times.&nbsp;<tt> </tt>Note the headers on the message below:&nbsp;<tt> </tt>apparently I invented the device on November 9, 1983, and was proud (or disgusted) enough to send mail to <a href="http://www.cs.bell-labs.com/who/dmr/index.html">dmr</a>.&nbsp;<tt> </tt>Please note that I do not claim to have invented loop unrolling, merely this particular expression of it in C.
    <p>&nbsp;</p>
    <li>The device is legal dpANS C.&nbsp;<tt> </tt>I cannot quote chapter and verse, but <a href="http://www.lysator.liu.se/c/lr/index.html" name="lr">Larry Rosler</a>, who was chairman of the language subcommittee (I think), has assured me that X3J11 considered it carefully and decided that it was legal. Somewhere I have a note from <a href="http://www.cs.bell-labs.com/who/dmr/index.html">dmr</a> certifying that all the compilers that he believes in accept it.&nbsp;<tt> </tt>Of course, the device is also legal C++, since Bjarne uses it in his book.
    <p>&nbsp;</p>
    <li>Somebody invoked (or more properly, banished) the `false god of efficiency.'&nbsp;<tt> </tt>Careful reading of my original note will put this slur to rest.&nbsp;<tt> </tt>The alternative to genuflecting before the god of code-bumming is finding a better algorithm.&nbsp;<tt> </tt>It should be clear that none such was available.&nbsp;<tt> </tt>If your code is too slow, you must make it faster.&nbsp;<tt> </tt>If no better algorithm is available, you must trim cycles.
    <p>&nbsp;</p>
    <li>The same person claimed that the device wouldn't exhibit the desired speed-up.&nbsp;<tt> </tt>The argument was flawed in two regards:&nbsp;<tt> </tt>first, it didn't address the performance of the device, but rather the performance of one of its few uses (implementing memcpy) for which many machines have a high-performance idiom.&nbsp;<tt> </tt>Second, the poster made his claims in the absence of timing data, which renders his assertion suspect.&nbsp;<tt> </tt>A second poster tried the test, but botched the implementation, proving only that with diligence it is possible to make anything run slowly.
    <p>&nbsp;</p>
    <li>Even <a href="http://www.lysator.liu.se/c/henry/" name="henry">Henry Spencer</a>, who hit every other nail square on the end with the flat round thing stuck to it, made a mistake (albeit a trivial one).&nbsp;<tt> </tt>Here is Henry replying to bill@proxftl.UUCP (T. William Wells):<br />
    <pre>   &gt;&gt;... Dollars to doughnuts this
    &gt;&gt;was written on a RISC machine.
    &gt;Nope.&nbsp;<tt> </tt>Bell Labs Research uses VAXen and 68Ks, mostly.
    </pre>
    <p>I was at Lucasfilm when I invented the device.
    <p>&nbsp;</p>
    <li>Transformations like this can only be justified by measuring the resulting code.&nbsp;<tt> </tt>Be careful when you use this thing that you don't unwind the loop so much that you overflow your machine's instruction cache.&nbsp;<tt> </tt>Don't try to be smarter than an over-clever C compiler that recognizes loops that implement block move or block clear and compiles them into machine idioms. </li>
</ol>
<p>Here then, is the original document describing Duff's device:
<p>From research!ucbvax!dagobah!td&nbsp;<tt> </tt>Sun Nov 13 07:35:46 1983<br />
Received: by ucbvax.ARPA (4.16/4.13)&nbsp;<tt> </tt>id AA18997; Sun, 13 Nov 83 07:35:46 pst<br />
Received: by dagobah.LFL (4.6/4.6b)&nbsp;<tt> </tt>id AA01034; Thu, 10 Nov 83 17:57:56 PST<br />
Date: Thu, 10 Nov 83 17:57:56 PST<br />
From: <a href="http://www.lysator.liu.se/c/td/">ucbvax!dagobah!td (Tom Duff)</a><br />
Message-Id: &lt;8311110157.AA01034@dagobah.LFL&gt;<br />
To: <a href="http://www.lysator.liu.se/c/rrg/index.html" name="rrg">ucbvax!decvax!hcr!rrg</a>, <a href="http://www.lysator.liu.se/c/rrg/">ucbvax!ihnp4!hcr!rrg</a>, <a href="http://www.cs.bell-labs.com/who/dmr/index.html" name="dmr">ucbvax!research!dmr</a>, <a href="http://www.lysator.liu.se/c/rob/index.html" name="rob">ucbvax!research!rob</a><br />
<p>Consider the following routine, abstracted from code which copies an array of shorts into the Programmed IO data register of an Evans &amp; Sutherland Picture System II:
<p>
<pre>&nbsp;
<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.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">send(to,&nbsp;from,&nbsp;count)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />register&nbsp;</span><span style="color: #0000ff">short</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />register&nbsp;count;<br />
<img id="Codehighlighter1_65_120_Open_Image" onclick="this.style.display='none'; Codehighlighter1_65_120_Open_Text.style.display='none'; Codehighlighter1_65_120_Closed_Image.style.display='inline'; Codehighlighter1_65_120_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_65_120_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_65_120_Closed_Text.style.display='none'; Codehighlighter1_65_120_Open_Image.style.display='inline'; Codehighlighter1_65_120_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_65_120_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_65_120_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">--</span><span style="color: #000000">count</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
<p>(Obviously, this fails if the count is zero.)<br />
The VAX C compiler compiles the loop into 2 instructions (a movw and a sobleq,<br />
I think.)&nbsp;<tt> </tt>As it turns out, this loop was the bottleneck in a real-time animation playback program which ran too slowly by about 50%.&nbsp;<tt> </tt>The standard way to get more speed out of something like this is to unwind the loop a few times, decreasing the number of sobleqs.&nbsp;<tt> </tt>When you do that, you wind up with a leftover partial loop.&nbsp;<tt> </tt>I usually handle this in C with a switch that indexes a list of copies of the original loop body.&nbsp;<tt> </tt>Of course, if I were writing assembly language code, I'd just jump into the middle of the unwound loop to deal with the leftovers.&nbsp;<tt> </tt>Thinking about this <a name="duffs-device">yesterday, the following implementation occurred to me:</a>
<p>&nbsp;</p>
<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.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">send(to,&nbsp;from,&nbsp;count)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;register&nbsp;</span><span style="color: #0000ff">short</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;register&nbsp;count;<br />
<img id="Codehighlighter1_73_415_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_415_Open_Text.style.display='none'; Codehighlighter1_73_415_Closed_Image.style.display='inline'; Codehighlighter1_73_415_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_73_415_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_73_415_Closed_Text.style.display='none'; Codehighlighter1_73_415_Open_Image.style.display='inline'; Codehighlighter1_73_415_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_73_415_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_73_415_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;register&nbsp;n</span><span style="color: #000000">=</span><span style="color: #000000">(count</span><span style="color: #000000">+</span><span style="color: #000000">7</span><span style="color: #000000">)</span><span style="color: #000000">/</span><span style="color: #000000">8</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_123_413_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_413_Open_Text.style.display='none'; Codehighlighter1_123_413_Closed_Image.style.display='inline'; Codehighlighter1_123_413_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_123_413_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_413_Closed_Text.style.display='none'; Codehighlighter1_123_413_Open_Image.style.display='inline'; Codehighlighter1_123_413_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">(count</span><span style="color: #000000">%</span><span style="color: #000000">8</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_123_413_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_123_413_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_144_393_Open_Image" onclick="this.style.display='none'; Codehighlighter1_144_393_Open_Text.style.display='none'; Codehighlighter1_144_393_Closed_Image.style.display='inline'; Codehighlighter1_144_393_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_144_393_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_144_393_Closed_Text.style.display='none'; Codehighlighter1_144_393_Open_Image.style.display='inline'; Codehighlighter1_144_393_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_144_393_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_144_393_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">--</span><span style="color: #000000">n</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
Disgusting, no?&nbsp;<tt> </tt>But it compiles and runs just fine.&nbsp;<tt> </tt>I feel a combination of pride and revulsion at this discovery.&nbsp;<tt> </tt>If no one's thought of it before, I think I'll name it after myself.
<p>It amazes me that after 10 years of writing C there are still little corners that I haven't explored fully.&nbsp;<tt> </tt>(Actually, I have another revolting way to use switches to implement interrupt driven state machines but it's too horrid to go into.)
<p>Many people (even <a href="http://www.lysator.liu.se/c/bwk/index.html" name="bwk">bwk</a>?) have said that the worst feature of C is that switches don't break automatically before each case label.&nbsp;<tt> </tt>This code forms some sort of argument in that debate, but I'm not sure whether it's for or against.
<p>yrs trly<br />
<a href="http://www.lysator.liu.se/c/td/index.html">Tom</a><br />
</p>
<img src ="http://www.blogjava.net/zellux/aggbug/164015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-11-29 16:02 <a href="http://www.blogjava.net/zellux/archive/2007/11/29/164015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>In-place Matrix Transposition</title><link>http://www.blogjava.net/zellux/archive/2007/11/12/159996.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 12 Nov 2007 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/11/12/159996.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/159996.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/11/12/159996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/159996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/159996.html</trackback:ping><description><![CDATA[O(1)空间求矩阵转置的算法，貌似是分解成几个循环群，分别处理。<br />
from wikipedia<br />
<br />
<a href="http://www.blogjava.net/Files/zellux/In-place_matrix_transposition.zip">http://www.blogjava.net/Files/zellux/In-place_matrix_transposition.zip</a><br />
<img src ="http://www.blogjava.net/zellux/aggbug/159996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-11-12 16:16 <a href="http://www.blogjava.net/zellux/archive/2007/11/12/159996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>后缀树的在线生成算法</title><link>http://www.blogjava.net/zellux/archive/2007/11/07/158935.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 07 Nov 2007 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/11/07/158935.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/158935.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/11/07/158935.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/158935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/158935.html</trackback:ping><description><![CDATA[第一次接触后缀树应该是在某次省队集训，徐串大牛做的讲座。<br />
不过当时只是有了个印象。<br />
现在发现这东东还是很好用的&nbsp; @,@<br />
<br />
<a href="http://www.blogjava.net/Files/zellux/SuffixT1withFigs.rar">http://www.blogjava.net/Files/zellux/SuffixT1withFigs.rar</a> <br />
<br />
On&#8211;line construction of suffix trees<br />
by Esko Ukkonen<br />
<br />
<strong>Key Words</strong>.<br />
Linear time algorithm, suffix tree, suffix trie, suffix automaton, DAWG.<br />
<br />
<strong>Abstract</strong>.<br />
An on&#8211;line algorithm is presented for constructing the suffix tree for a given string in time linear in the length of the string. The new algorithm has the desirable property of processing the string symbol by symbol from left to right. It has always the suffix tree for the scanned part of the string ready. The method is developed as a linear&#8211;time version of a very simple algorithm for (quadratic size) suffix tries. Regardless of its quadratic worst-case this latter algorithm can be a good practical method when the string is not too long. Another variation of this method is shown to give in a natural way the well&#8211;known algorithms for constructing suffix automata (DAWGs).<br />
<br />
<img src ="http://www.blogjava.net/zellux/aggbug/158935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-11-07 21:08 <a href="http://www.blogjava.net/zellux/archive/2007/11/07/158935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线索二叉树</title><link>http://www.blogjava.net/zellux/archive/2007/11/07/158758.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 07 Nov 2007 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/11/07/158758.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/158758.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/11/07/158758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/158758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/158758.html</trackback:ping><description><![CDATA[发现居然还是Pascal描述，亲切啊亲切<br />
<br />
http://iprai.hust.edu.cn/icl2002/algorithm/datastructure/basic/binary_tree/chapter5_4.htm<br />
<br />
<h2>线索二叉树</h2>
<p>当<a href="http://iprai.hust.edu.cn/icl2002/algorithm/datastructure/basic/binary_tree/chapter5_3.htm">用二叉链表作为二叉树的存储结构</a>时，因为每个结点中只有指向其左、右儿子结点的指针，所以从任一结点出发只能直接找到该结点的左、右儿子。在一般情况下靠它无法直接找到该结点在某种遍历序下的前驱和后继结点。如果在每个结点中增加指向其前驱和后继结点的指针，将降低存储空间的效率。</p>
<p>我们可以证明：在n个结点的二叉链表中含有n+1个空指针。因为含n个结点的二叉链表中含有个指针，除了根结点，每个结点都有一个从父结点指向该结点的指针，因此一共使用了n-1个指针，所以在n个结点的二叉链表中含有n+1个空指针。</p>
<p>因此可以利用这些空指针，存放指向结点在某种遍历次序下的前驱和后继结点的指针。这种附加的指针称为<font face="楷体_GB2312">线索</font>，加上了线索的二叉链表称为<font face="楷体_GB2312">线索链表</font>，相应的二叉树称为<font face="楷体_GB2312">线索二叉树</font>。为了区分一个结点的指针是指向其儿子的指针，还是指向其前驱或后继结点的线索，可在每个结点中增加两个线索标志。这样，线索二叉树结点类型定义为：</p>
<div align="center">
<center>
<table cellpadding="5" width="90%" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td width="100%">
            <p style="margin-top: 5px; margin-bottom: 5px">type</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;TPosition=^thrNodeType;</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;thrNodeType=record</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Label:LabelType;</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ltag,rtag:0..1;</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LeftChild,RightChild:TPosition;</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; </p>
            </td>
        </tr>
    </tbody>
</table>
</center></div>
<p>其中ltag为左线索标志，rtag为右线索标志。它们的含义是:</p>
<ul>
    <li>ltag=0，LeftChild是指向结点左儿子的指针；
    <li>ltag=1，LeftChild是指向结点前驱的左线索。<br />
    <li>rtag=0，RightChild是指向结点右儿子的指针；
    <li>rtag=1，RihgtChild是指向结点后继的右线索。 </li>
</ul>
<p>例如图13(a)是一棵中序线索二叉树，它的线索链表如图13(b)所示。</p>
<blockquote>
<p align="center"><img height="218" src="http://iprai.hust.edu.cn/icl2002/algorithm/datastructure/basic/binary_tree/images/img3.gif" width="263" border="0"  alt="" /></p>
<p align="center">(a)</p>
<p align="center"><img height="372" src="http://iprai.hust.edu.cn/icl2002/algorithm/datastructure/basic/binary_tree/images/img4.gif" width="523" border="0"  alt="" /></p>
<p align="center">(b)</p>
<p align="center">图13 线索二叉树及其线索链表</p>
</blockquote>
<p>图13(b)中，在二叉树的线索链表上增加了一个头结点，其LeftChild指针指向二叉树的根结点，其RightChild指针指向中序遍历时的最后一个结点。另外，二叉树中依中序列表的第一个结点的LeftChild指针，和最后一个结点的RightChild指针都指向头结点。这就像为二叉树建立了一个双向线索链表，既可从第一个结点起，顺着后继进行遍历，也可从最后一个结点起顺着前驱进行遍历。</p>
<p>如何在线索二叉树中找结点的前驱和后继结点？以图13的中序线索二叉树为例。树中所有叶结点的右链是线索，因此叶结点的RightChild指向该结点的后继结点，如图13中结点"b"的后继为结点"*"。当一个内部结点右线索标志为0时，其RightChild指针指向其右儿子，因此无法由RightChild得到其后继结点。然而，由中序遍历的定义可知，该结点的后继应是遍历其右子树时访问的第一个结点，即右子树中最左下的结点。例如在找结点"*"的后继时，首先沿右指针找到其右子树的根结点"-"，然后沿其LeftChild指针往下直至其左线索标志为1的结点，即为其后继结点(在图中是结点"c")。类似地，在中序线索树中找结点的前驱结点的规律是：若该结点的左线索标志为1，则LeftChild为线索，直接指向其前驱结点，否则遍历左子树时最后访问的那个结点，即左子树中最右下的结点为其前驱结点。由此可知，若线索二叉树的高度为h，则在最坏情况下，可在<em>O</em>(h)时间内找到一个结点的前驱或后继结点。在对中序线索二叉树进行遍历时，无须像非线索树的遍历那样，利用递归引入栈来保存待访问的子树信息。</p>
<p>对一棵非线索二叉树以某种次序遍历使其变为一棵线索二叉树的过程称为<font face="楷体_GB2312">二叉树的线索化</font>。由于线索化的实质是将二叉链表中的空指针改为指向结点前驱或后继的线索，而一个结点的前驱或后继结点的信息只有在遍历时才能得到，因此线索化的过程即为在遍历过程中修改空指针的过程。为了记下遍历过程中访问结点的先后次序，可附设一个指针pre始终指向刚刚访问过的结点。当指针p指向当前访问的结点时，pre指向它的前驱。由此也可推知pre所指结点的后继为p所指的当前结点。这样就可在遍历过程中将二叉树线索化。对于找前驱和后继结点这二种运算而言，线索树优于非线索树。但线索树也有其缺点。在进行插人和删除操作时，线索树比非线索树的时间开销大。原因在于在线索树中进行插人和删除时，除了修改相应的指针外，还要修改相应的线索。</p>
<!-- #EndEditable --><script src="../../../lib/footer.js">
</script>
<img src ="http://www.blogjava.net/zellux/aggbug/158758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-11-07 11:02 <a href="http://www.blogjava.net/zellux/archive/2007/11/07/158758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>取石子游戏</title><link>http://www.blogjava.net/zellux/archive/2007/10/31/157272.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 31 Oct 2007 10:11:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/31/157272.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/157272.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/31/157272.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/157272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/157272.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 问题：<br>有两堆石子，数量任意，可以不同。游戏开始由两个人轮流取石子。游戏规定，每次有两种不同的取法，一是可以在任意的一堆中取走任意多的石子；二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目，如果轮到你先取，假设双方都采取最好的策略，问最后你是胜者还是败者。&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2007/10/31/157272.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/157272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-31 18:11 <a href="http://www.blogjava.net/zellux/archive/2007/10/31/157272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>支持O(1)时间push pop min方法的栈</title><link>http://www.blogjava.net/zellux/archive/2007/10/29/156777.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 29 Oct 2007 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/29/156777.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/156777.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/29/156777.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/156777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/156777.html</trackback:ping><description><![CDATA[<p>算法课的习题<br />
题目很简单，但是代码很漂亮<br />
<br />
[zz]</p>
<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.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img id="Codehighlighter1_38_350_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_350_Open_Text.style.display='none'; Codehighlighter1_38_350_Closed_Image.style.display='inline'; Codehighlighter1_38_350_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_38_350_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_38_350_Closed_Text.style.display='none'; Codehighlighter1_38_350_Open_Image.style.display='inline'; Codehighlighter1_38_350_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;min_stack&nbsp;</span><span id="Codehighlighter1_38_350_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_38_350_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />
<img id="Codehighlighter1_72_150_Open_Image" onclick="this.style.display='none'; Codehighlighter1_72_150_Open_Text.style.display='none'; Codehighlighter1_72_150_Closed_Image.style.display='inline'; Codehighlighter1_72_150_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_72_150_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_72_150_Closed_Text.style.display='none'; Codehighlighter1_72_150_Open_Image.style.display='inline'; Codehighlighter1_72_150_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;push(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;v)&nbsp;</span><span id="Codehighlighter1_72_150_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_72_150_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;s.push(make_pair(v,&nbsp;empty()</span><span style="color: #000000">||</span><span style="color: #000000">v</span><span style="color: #000000">&lt;</span><span style="color: #000000">s.top().second&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;v&nbsp;:&nbsp;s.top().second));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_166_177_Open_Image" onclick="this.style.display='none'; Codehighlighter1_166_177_Open_Text.style.display='none'; Codehighlighter1_166_177_Closed_Image.style.display='inline'; Codehighlighter1_166_177_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_166_177_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_166_177_Closed_Text.style.display='none'; Codehighlighter1_166_177_Open_Image.style.display='inline'; Codehighlighter1_166_177_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pop()&nbsp;</span><span id="Codehighlighter1_166_177_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_166_177_Open_Text"><span style="color: #000000">{&nbsp;s.pop();&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_197_221_Open_Image" onclick="this.style.display='none'; Codehighlighter1_197_221_Open_Text.style.display='none'; Codehighlighter1_197_221_Closed_Image.style.display='inline'; Codehighlighter1_197_221_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_197_221_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_197_221_Closed_Text.style.display='none'; Codehighlighter1_197_221_Open_Image.style.display='inline'; Codehighlighter1_197_221_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;top()&nbsp;</span><span id="Codehighlighter1_197_221_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_197_221_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s.top().first;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_241_266_Open_Image" onclick="this.style.display='none'; Codehighlighter1_241_266_Open_Text.style.display='none'; Codehighlighter1_241_266_Closed_Image.style.display='inline'; Codehighlighter1_241_266_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_241_266_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_241_266_Closed_Text.style.display='none'; Codehighlighter1_241_266_Open_Image.style.display='inline'; Codehighlighter1_241_266_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;min()&nbsp;</span><span id="Codehighlighter1_241_266_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_241_266_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s.top().second;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_284_304_Open_Image" onclick="this.style.display='none'; Codehighlighter1_284_304_Open_Text.style.display='none'; Codehighlighter1_284_304_Closed_Image.style.display='inline'; Codehighlighter1_284_304_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_284_304_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_284_304_Closed_Text.style.display='none'; Codehighlighter1_284_304_Open_Image.style.display='inline'; Codehighlighter1_284_304_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;empty()&nbsp;</span><span id="Codehighlighter1_284_304_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_284_304_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s.empty();&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;std::stack</span><span style="color: #000000">&lt;</span><span style="color: #000000">std::pair</span><span style="color: #000000">&lt;</span><span style="color: #000000">T,&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;s;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;</span></div>
<img src ="http://www.blogjava.net/zellux/aggbug/156777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-29 21:30 <a href="http://www.blogjava.net/zellux/archive/2007/10/29/156777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一道网易的笔试题</title><link>http://www.blogjava.net/zellux/archive/2007/10/21/154762.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 21 Oct 2007 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/21/154762.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/154762.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/21/154762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/154762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/154762.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 水木上看到的<br><br>一个K位的数N (K<=2000,N<=10^20)<br>找出一个比N大且最接近的数，这个数的每位之和与N相同<br>用代码实现之<br><br>如：<br>0050    所求数为0104<br>112     所求数为121<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2007/10/21/154762.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/154762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-21 22:05 <a href="http://www.blogjava.net/zellux/archive/2007/10/21/154762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>摩根的算法题</title><link>http://www.blogjava.net/zellux/archive/2007/10/21/154777.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 21 Oct 2007 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/21/154777.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/154777.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/21/154777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/154777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/154777.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 同样转自水木社区&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2007/10/21/154777.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/154777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-21 22:05 <a href="http://www.blogjava.net/zellux/archive/2007/10/21/154777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU1065 - Wooden Sticks</title><link>http://www.blogjava.net/zellux/archive/2007/10/17/153717.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 17 Oct 2007 15:58:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/17/153717.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/153717.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/17/153717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/153717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/153717.html</trackback:ping><description><![CDATA[睡前过一道，睡觉睡得香&nbsp;&nbsp;<img src="/CuteSoft_Client/CuteEditor/images/face5.gif" align="absMiddle" border="0"  alt="" />&nbsp; 不管这题多简单，咔咔<br />
<br />
按照木块的长度或质量排序，之后贪心即可，后面和NOIP的拦截导弹一样。
 <img src ="http://www.blogjava.net/zellux/aggbug/153717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-17 23:58 <a href="http://www.blogjava.net/zellux/archive/2007/10/17/153717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU1042 – Gone Fishing</title><link>http://www.blogjava.net/zellux/archive/2007/10/17/153630.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 17 Oct 2007 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/17/153630.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/153630.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/17/153630.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/153630.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/153630.html</trackback:ping><description><![CDATA[<p>我的做法是枚举最远到达的湖，减去相应的时间后贪心。<br />
<br />
贪心时需要建立一个堆，用了STL中的priority_queue，然后就不知道如何设置less&lt;&gt;方法了。。。<br />
最后是通过自定义一个类node解决的<br />
<br />
一开始写的operator&lt;方法逻辑上有问题，VS 2005跑了一会儿就冒出个 Debug assert error，这个挺赞的<br />
<br />
导致我WA的几个数据：<br />
1) 收益为0的几组数据。由于一开始设置的max值为0，因此当正解也是0时并没有记录下当前的最优解。max初始为负值即可。<br />
2) 同样是0导致的问题。0收益的钓鱼点也可能出现在堆中，此时应该放弃这个点，把时间保留给序数大的钓鱼点。 </p>
<p>另外我有这次比赛的测试数据和标程，需要的朋友留言即可。</p>
<p><br />
&nbsp;</p>
<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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">fstream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">vector</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">queue</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_108_368_Open_Image" onclick="this.style.display='none'; Codehighlighter1_108_368_Open_Text.style.display='none'; Codehighlighter1_108_368_Closed_Image.style.display='inline'; Codehighlighter1_108_368_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_108_368_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_108_368_Closed_Text.style.display='none'; Codehighlighter1_108_368_Open_Image.style.display='inline'; Codehighlighter1_108_368_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;node&nbsp;</span><span id="Codehighlighter1_108_368_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_108_368_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;first,&nbsp;second;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;node(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y)<br />
<img id="Codehighlighter1_161_191_Open_Image" onclick="this.style.display='none'; Codehighlighter1_161_191_Open_Text.style.display='none'; Codehighlighter1_161_191_Closed_Image.style.display='inline'; Codehighlighter1_161_191_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_161_191_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_161_191_Closed_Text.style.display='none'; Codehighlighter1_161_191_Open_Image.style.display='inline'; Codehighlighter1_161_191_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_161_191_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_161_191_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;y;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;node&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">rhs)&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000"><br />
<img id="Codehighlighter1_235_366_Open_Image" onclick="this.style.display='none'; Codehighlighter1_235_366_Open_Text.style.display='none'; Codehighlighter1_235_366_Closed_Image.style.display='inline'; Codehighlighter1_235_366_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_235_366_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_235_366_Closed_Text.style.display='none'; Codehighlighter1_235_366_Open_Image.style.display='inline'; Codehighlighter1_235_366_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_235_366_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_235_366_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(second&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;rhs.second)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;(second&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;rhs.second)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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">return</span><span style="color: #000000">&nbsp;(first&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;rhs.first);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />
<img id="Codehighlighter1_384_1855_Open_Image" onclick="this.style.display='none'; Codehighlighter1_384_1855_Open_Text.style.display='none'; Codehighlighter1_384_1855_Closed_Image.style.display='inline'; Codehighlighter1_384_1855_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_384_1855_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_384_1855_Closed_Text.style.display='none'; Codehighlighter1_384_1855_Open_Image.style.display='inline'; Codehighlighter1_384_1855_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_384_1855_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_384_1855_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;h;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;d[</span><span style="color: #000000">26</span><span style="color: #000000">],&nbsp;t[</span><span style="color: #000000">26</span><span style="color: #000000">],&nbsp;f[</span><span style="color: #000000">26</span><span style="color: #000000">];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;priority_queue</span><span style="color: #000000">&lt;</span><span style="color: #000000">node,&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #000000">node</span><span style="color: #000000">&gt;</span><span style="color: #000000">,&nbsp;less</span><span style="color: #000000">&lt;</span><span style="color: #000000">vector</span><span style="color: #000000">&lt;</span><span style="color: #000000">node</span><span style="color: #000000">&gt;</span><span style="color: #000000">::value_type</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;heap;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;best(</span><span style="color: #000000">26</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;n;<br />
<img id="Codehighlighter1_552_1839_Open_Image" onclick="this.style.display='none'; Codehighlighter1_552_1839_Open_Text.style.display='none'; Codehighlighter1_552_1839_Closed_Image.style.display='inline'; Codehighlighter1_552_1839_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_552_1839_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_552_1839_Closed_Text.style.display='none'; Codehighlighter1_552_1839_Open_Image.style.display='inline'; Codehighlighter1_552_1839_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_552_1839_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_552_1839_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&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: #0000ff">break</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;h;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;f[i];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;d[i];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;t[i];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;best.clear();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;i&nbsp;indicates&nbsp;the&nbsp;last&nbsp;lake</span><span style="color: #008000"><br />
<img id="Codehighlighter1_893_1649_Open_Image" onclick="this.style.display='none'; Codehighlighter1_893_1649_Open_Text.style.display='none'; Codehighlighter1_893_1649_Closed_Image.style.display='inline'; Codehighlighter1_893_1649_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_893_1649_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_893_1649_Closed_Text.style.display='none'; Codehighlighter1_893_1649_Open_Image.style.display='inline'; Codehighlighter1_893_1649_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_893_1649_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_893_1649_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;tempBest(</span><span style="color: #000000">26</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;valueGet&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;timeLeft&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;h&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">12</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;j&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;i;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeLeft&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;t[j&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(timeLeft&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">heap.empty())<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.pop();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;j&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;i;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.push(node(j,&nbsp;f[j]));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_1213_1526_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1213_1526_Open_Text.style.display='none'; Codehighlighter1_1213_1526_Closed_Image.style.display='inline'; Codehighlighter1_1213_1526_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1213_1526_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1213_1526_Closed_Text.style.display='none'; Codehighlighter1_1213_1526_Open_Image.style.display='inline'; Codehighlighter1_1213_1526_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((</span><span style="color: #000000">!</span><span style="color: #000000">heap.empty())&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;(timeLeft&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">))&nbsp;</span><span id="Codehighlighter1_1213_1526_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1213_1526_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap.top().first;<br />
<img id="Codehighlighter1_1291_1394_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1291_1394_Open_Text.style.display='none'; Codehighlighter1_1291_1394_Closed_Image.style.display='inline'; Codehighlighter1_1291_1394_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1291_1394_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1291_1394_Closed_Text.style.display='none'; Codehighlighter1_1291_1394_Open_Image.style.display='inline'; Codehighlighter1_1291_1394_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(heap.top().second&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_1291_1394_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1291_1394_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeLeft</span><span style="color: #000000">--</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempBest[next]</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valueGet&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;heap.top().second;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;valueLeft&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap.top().second&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;d[next];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.pop();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(valueLeft&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.push(node(next,&nbsp;valueLeft));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1551_1645_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1551_1645_Open_Text.style.display='none'; Codehighlighter1_1551_1645_Closed_Image.style.display='inline'; Codehighlighter1_1551_1645_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1551_1645_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1551_1645_Closed_Text.style.display='none'; Codehighlighter1_1551_1645_Open_Image.style.display='inline'; Codehighlighter1_1551_1645_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(valueGet&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;max)&nbsp;</span><span id="Codehighlighter1_1551_1645_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1551_1645_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;valueGet;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;best&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tempBest;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(timeLeft&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;best[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;timeLeft;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;best[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;best[i]&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">\nNumber&nbsp;of&nbsp;fish&nbsp;expected:&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;max);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;n;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<img src ="http://www.blogjava.net/zellux/aggbug/153630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-17 17:25 <a href="http://www.blogjava.net/zellux/archive/2007/10/17/153630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CLRS 习题 16.1-3 Interval-graph Coloring Problem</title><link>http://www.blogjava.net/zellux/archive/2007/10/14/152667.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 13 Oct 2007 16:48:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/14/152667.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/152667.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/14/152667.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/152667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/152667.html</trackback:ping><description><![CDATA[问题：<br />
已知一些活动的起止时间{Si}, {Fi}，把它们安排在若干个大厅中进行，要求任一大厅任意时间段内不能有两项活动同时进行，求出所需的最少的大厅数。<br />
<br />
分析：(from CLRS Instructor's Manual)<br />
<br />
这是一个区间图的着色问题(Interval-graph Coloring Problem)，用点表示活动，把时间冲突的活动连起来，然后进行点的着色，要求同一线段的两端不能有相同颜色的点。<br />
<br />
首先最容易想到的就是用书上的Greedy-Activity-Selector找出可安排在大厅1的最长序列，然后删去这些活动，再次调用该方法，找出安排在大厅2的活动，以此类推。<br />
复杂度O(n*n)<br />
<br />
还有一个O(n*logn)的算法，甚至在起止时间都是比较小的数字时复杂度只有O(n)。<br />
<br />
主要思想是依次遍历每个活动，把它们安排到不同的大厅中。<br />
维护两张表，一张记录当前时间t已经安排了活动的大厅，另一张记录当前时间空闲的大厅<br />
然后从头扫描排序后的时间点序列（如果事件a的结束时间等于时间b的开始时间，那么前者应该排在后者后面）<br />
碰到开始时间t，把该活动放到空闲列表的第一个大厅中（如果空闲列表为空则新加一个大厅），然后把该大厅放入已安排的大厅列表中；<br />
碰到结束时间t，从已安排的大厅列表中移出相应大厅到空闲列表。<br />
<br />
复杂度分析：<br />
排序：O(n logn)，如果时间范围有限制还可以做到O(n)<br />
处理：O(n) 
<img src ="http://www.blogjava.net/zellux/aggbug/152667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-14 00:48 <a href="http://www.blogjava.net/zellux/archive/2007/10/14/152667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求相邻数最大间隔</title><link>http://www.blogjava.net/zellux/archive/2007/10/07/150850.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 07 Oct 2007 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/07/150850.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/150850.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/07/150850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/150850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/150850.html</trackback:ping><description><![CDATA[Problem: You are given n real numbers - they are NOT sorted. Develop a linear time（O(n)）algorithm to find the largest gap between consecutive numbers when the n numbers are sorted. For example, given:<br />
10 23 7 1 35 27 50 41<br />
the algorithm should produce 13 as its result, since the sorted list is:<br />
1 7 10 23 27 35 41 50<br />
and the largest gap is 13 (between 10 and 23).<br />
<br />
Please note that your algorithm cannot actually sort the n numbers.<br />
<br />
&nbsp;&nbsp; Macsy (真心) 于 &nbsp;(Fri Oct &nbsp;5 11:59:16 2007) &nbsp;提到:<br />
<br />
有一个方法需要额外的O(n)的空间。<br />
首先找到最大最小数max,min<br />
max gap 肯定不小于 (max-min)/n 。<br />
然后以(max-min)/n为步长，建立n个桶<br />
每个桶里面记录落在这个桶中的最大最小值。<br />
最后顺序扫描这n个桶中的值就可以了。<br />
<br />
大概代码是<br />
input: a[n];<br />
<br />
min=min_of(a[1..n]);<br />
max=max_of(a[1..n]);<br />
step=(max-min)/n;<br />
<br />
b[0..n].min=maxfloat; b[0..n].max=-maxfloat;<br />
for i=1 to n<br />
&nbsp;&nbsp;ind = (a[i]-min)/step;<br />
&nbsp;&nbsp;b[ind].min=min(b[ind].min, a[i]);<br />
&nbsp;&nbsp;b[ind].max=max(b[ind].max, a[i]);<br />
<br />
maxgap=step;<br />
last=b[0].max;<br />
for i=1 to n<br />
&nbsp;&nbsp;if (b[i].min != maxfloat)<br />
&nbsp;&nbsp; &nbsp;maxgap=max(maxgap, b[i].min-last);<br />
&nbsp;&nbsp; &nbsp;last=b[i].max;<br />
<br />
output maxgap<br />
<br />
<img src ="http://www.blogjava.net/zellux/aggbug/150850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-07 16:06 <a href="http://www.blogjava.net/zellux/archive/2007/10/07/150850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个百度面试题 - n个数中找最大的两个数最少比较次数</title><link>http://www.blogjava.net/zellux/archive/2007/10/01/150031.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 01 Oct 2007 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/01/150031.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/150031.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/01/150031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/150031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/150031.html</trackback:ping><description><![CDATA[from 水木<br />
<br />
1. 两两比较，找出最大的，n-1次<br />
2. 从找最大的这条路线回溯，次大的必然在这条路线上，找到它需要logn - 1次（败者树的最大高度为logn） <br />
<br />
其实就是一个锦标赛排序<br />
<br />
<object style="width: 499px; height: 265px" height="265" width="499" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" xcodebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
<param name="Movie" value="/images/blogjava_net/zellux/c9m9b.swf"    /> <param name="Quality" value="high"   /><param name="wmode" value="transparent"   /><embed src="http://www.blogjava.net/images/blogjava_net/zellux/c9m9b.swf" width="200" height="200" quality="high" wmode="transparent" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"   ></embed>
</object>
<img src ="http://www.blogjava.net/zellux/aggbug/150031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-01 11:07 <a href="http://www.blogjava.net/zellux/archive/2007/10/01/150031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>O(n)时间求出最小的k个数</title><link>http://www.blogjava.net/zellux/archive/2007/09/04/142675.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 04 Sep 2007 10:55:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/04/142675.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/142675.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/04/142675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/142675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/142675.html</trackback:ping><description><![CDATA[一种做法是用最差情况下复杂度也是O(n)的算法求出第k大的数，然后把这个数作为pivot进行一次paritition，再排序该数左边的部分。复杂度为O(n + klgk)<br />
<br />
http://en.wikipedia.org/wiki/Selection_algorithm<br />
<br />
另外，CLRS上Selection in worst-case linear time算法实际上对in expected linear time在选数时做了一个优化，这样在最差情况下也有O(n)的复杂度了，实际应用中没什么用 (thx to Peter大牛 ^_^)
 <img src ="http://www.blogjava.net/zellux/aggbug/142675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-09-04 18:55 <a href="http://www.blogjava.net/zellux/archive/2007/09/04/142675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CLRS - Lower bounds for sorting</title><link>http://www.blogjava.net/zellux/archive/2007/09/02/142146.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 02 Sep 2007 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/02/142146.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/142146.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/02/142146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/142146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/142146.html</trackback:ping><description><![CDATA[搬到张江了<br />
<br />
1. 比较排序法最差情况下至少需要omega(n lgn)<br />
证明：<br />
通过决策树(decision tree)分析比较排序，n!种可能情况都要被该决策树的叶子覆盖。<br />
设树深度为h，有<br />
n! &lt;= l &lt;= 2<sup>h<br />
</sup>得h &gt;= lg(n!) = omega(n lgn)<br />
<br />
2. 计数排序<br />
很简单的排序算法，不过后面的C数组的运用比较技巧。<br />
for i = 1 to k<br />
&nbsp;&nbsp;&nbsp; do c[i] = 0<br />
for j = 1 to length(a)<br />
&nbsp;&nbsp;&nbsp; do c[a[j]] = c[a[j]] + 1<br />
// c 数组记录了各个元素的出现次数<br />
for i = 1 to k<br />
&nbsp;&nbsp;&nbsp; do c[i] = c[i] + c[i - 1]<br />
// c[i] 记录了小于或等于i的元素个数<br />
for j = length(a) downto 1<br />
&nbsp;&nbsp;&nbsp; do b[c[a[j]]] = a[j]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c[a[j]] = c[a[j]] - 1 <br />
复杂度： k = O(n)时，复杂度为theta(n)
<img src ="http://www.blogjava.net/zellux/aggbug/142146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-09-02 22:22 <a href="http://www.blogjava.net/zellux/archive/2007/09/02/142146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TopCoder SRM 144 - PowerOutage</title><link>http://www.blogjava.net/zellux/archive/2007/08/14/136730.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 14 Aug 2007 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/14/136730.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/136730.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/14/136730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/136730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/136730.html</trackback:ping><description><![CDATA[一开始没看清题目，以为是在网状图中找遍历所有点的最短路径<img src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/images/emcrook.gif" align="absmiddle" border="0"><br>后来才发现是在一棵树中，而且是从根节点出发，这个就简单多了<br>把所有路径加起来乘以2，就是从根节点到各个路径后再返回根节点所需的最短耗费。<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: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PowerOutage&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;estimateTimeOut(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;fromJunction,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;toJunction,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;ductLength)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;ductLength.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;ductLength[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&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;sum&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">&nbsp;findLongestWay(</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;fromJunction,&nbsp;toJunction,&nbsp;ductLength);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;sum;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;findLongestWay(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;root,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;fromJunction,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;toJunction,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;ductLength)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;max&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;fromJunction.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(fromJunction[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;root)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;findLongestWay(toJunction[i],&nbsp;fromJunction,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toJunction,&nbsp;ductLength)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;ductLength[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(temp&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;max)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;max;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
<br><br> <img src ="http://www.blogjava.net/zellux/aggbug/136730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-08-14 17:12 <a href="http://www.blogjava.net/zellux/archive/2007/08/14/136730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何令(i != i)为真</title><link>http://www.blogjava.net/zellux/archive/2007/08/08/135374.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 08 Aug 2007 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/08/135374.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/135374.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/08/135374.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/135374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/135374.html</trackback:ping><description><![CDATA[水木上看到的，<br>while (i != i) {}<br>问如何给i赋值使程序进入死循环<br><br>一种正确答案是<br><span style="color: #eaeaea;">当i为浮点类型，且值为NAN时</span><br style="color: #eaeaea;"><span style="color: #eaeaea;">例如</span><br style="color: #eaeaea;"><span style="color: #eaeaea;">float i = -1;</span><br style="color: #eaeaea;"><span style="color: #eaeaea;">i = sqrt(i);</span><br style="color: #eaeaea;"><br style="color: #eaeaea;"><br><img src ="http://www.blogjava.net/zellux/aggbug/135374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-08-08 23:00 <a href="http://www.blogjava.net/zellux/archive/2007/08/08/135374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>红黑树 (1)</title><link>http://www.blogjava.net/zellux/archive/2007/08/01/133681.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 31 Jul 2007 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/01/133681.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/133681.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/01/133681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/133681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/133681.html</trackback:ping><description><![CDATA[转一篇wikipedia上的文章<br>http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9
<br><br><strong>红黑树</strong>是一种<a href="http://zh.wikipedia.org/w/index.php?title=%E8%87%AA%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%9F%A5%E6%89%BE%E6%A0%91&amp;action=edit" class="new" title="自平衡二叉查找树">自平衡二叉查找树</a>，是在<a href="http://zh.wikipedia.org/w/index.php?title=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6&amp;variant=zh-cn" title="计算机科学">计算机科学</a>中用到的一种<a href="http://zh.wikipedia.org/w/index.php?title=%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84&amp;variant=zh-cn" title="数据结构">数据结构</a>，典型的用途是实现<a href="http://zh.wikipedia.org/w/index.php?title=%E5%85%B3%E8%81%94%E6%95%B0%E7%BB%84&amp;action=edit" class="new" title="关联数组">关联数组</a>。它是在<a href="http://zh.wikipedia.org/w/index.php?title=1972%E5%B9%B4&amp;variant=zh-cn" title="1972年">1972年</a>由<a href="http://zh.wikipedia.org/w/index.php?title=Rudolf_Bayer&amp;variant=zh-cn" title="Rudolf Bayer">Rudolf Bayer</a>发明的，他称之为"对称二叉B树"，它现代的名字是在 Leo J. Guibas 和 <a href="http://zh.wikipedia.org/w/index.php?title=Robert_Sedgewick&amp;action=edit" class="new" title="Robert Sedgewick">Robert Sedgewick</a> 于<a href="http://zh.wikipedia.org/w/index.php?title=1978%E5%B9%B4&amp;variant=zh-cn" title="1978年">1978年</a>写的一篇论文中获得的。它是复杂的，但它的操作有着良好的最坏情况<a href="http://zh.wikipedia.org/w/index.php?title=%E7%AE%97%E6%B3%95%E5%88%86%E6%9E%90&amp;action=edit" class="new" title="算法分析">运行时间</a>，并且在实践中是高效的: 它可以在<a href="http://zh.wikipedia.org/w/index.php?title=%E5%A4%A7O%E7%AC%A6%E5%8F%B7&amp;variant=zh-cn" title="大O符号">O</a>(log <em>n</em>)时间内做查找，插入和删除，这里的<em>n</em>是树中元素的数目。
<br><br>
<h2>用途和好处</h2>
<p>红黑树和<a href="http://zh.wikipedia.org/w/index.php?title=AVL%E6%A0%91&amp;variant=zh-cn" title="AVL树">AVL树</a>一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。这不只是使它们在时间敏感的应用如<a href="http://zh.wikipedia.org/w/index.php?title=%E5%8D%B3%E6%97%B6%E8%AE%A1%E7%AE%97&amp;action=edit" class="new" title="即时计算">即时应用</a>(real time application)中有价值，而且使它们有在提供最坏情况担保的其他数据结构中作为建造板块的价值；例如，在<a href="http://zh.wikipedia.org/w/index.php?title=%E8%AE%A1%E7%AE%97%E5%87%A0%E4%BD%95&amp;variant=zh-cn" title="计算几何">计算几何</a>中使用的很多数据结构都可以基于红黑树。</p>
<p>红黑树在<a href="http://zh.wikipedia.org/w/index.php?title=%E5%87%BD%E6%95%B8%E5%BC%8F%E7%B7%A8%E7%A8%8B&amp;variant=zh-cn" title="函數式編程">函数式编程</a>中也特别有用，在这里它们是最常用的<a href="http://zh.wikipedia.org/w/index.php?title=%E6%8C%81%E4%B9%85%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84&amp;action=edit" class="new" title="持久数据结构">持久数据结构</a>之一，它们用来构造<a href="http://zh.wikipedia.org/w/index.php?title=%E5%85%B3%E8%81%94%E6%95%B0%E7%BB%84&amp;action=edit" class="new" title="关联数组">关联数组</a>和<a href="http://zh.wikipedia.org/w/index.php?title=%E9%9B%86%E5%90%88%28%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6%29&amp;action=edit" class="new" title="集合(计算机科学)">集合</a>，在突变之后它们能保持为以前的版本。除了O(log <em>n</em>)的时间之外，红黑树的持久版本对每次插入或删除需要O(log <em>n</em>)的空间。</p>
<p>红黑树是 <a href="http://zh.wikipedia.org/w/index.php?title=2-3-4%E6%A0%91&amp;variant=zh-cn" title="2-3-4树">2-3-4树</a>的
一种等同。换句话说，对于每个 2-3-4 树，都存在至少一个数据元素是同样次序的红黑树。在 2-3-4
树上的插入和删除操作也等同于在红黑树中颜色翻转和旋转。这使得 2-3-4
树成为理解红黑树背后的逻辑的重要工具，这也是很多介绍算法的教科书在红黑树之前介绍 2-3-4 树的原因，尽管 2-3-4 树在实践中不经常使用。</p>
<br><br>
<h2>性质</h2>
<p>红黑树是每个节点都带有<em>颜色</em>属性的<a href="http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%85%83%E6%90%9C%E5%B0%8B%E6%A8%B9&amp;variant=zh-cn" title="二元搜尋樹">二叉查找树</a>，颜色或<em>红色</em>或<em>黑色</em>。在二叉查找树强制一般要求以外，对于任何有效的红黑树我们增加了如下的额外要求:</p>
<p>性质1. 节点是红色或黑色。</p>
<p>性质2. 根是黑色。</p>
<p>性质3. 所有叶子都是黑色（包括NIL）。</p>
<p>性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)</p>
<p>性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。</p>
<div class="center">
<div class="floatnone"><a href="http://zh.wikipedia.org/w/index.php?title=Image:Red-black_tree_example.svg&amp;variant=zh-cn" class="image" title="An example of a red-black tree"><img alt="An example of a red-black tree" longdesc="/w/index.php?title=Image:Red-black_tree_example.svg&amp;variant=zh-cn" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Red-black_tree_example.svg/450px-Red-black_tree_example.svg.png" height="217" width="450"></a></div>
</div>
<p>这些约束强制了红黑树的关键性质:
从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的
高度成比例，这个在高度上的理论上限允许红黑树在最坏情况下都是高效的，而不同于普通的<a href="http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8F%89%E6%9F%A5%E6%89%BE%E6%A0%91&amp;variant=zh-cn" title="二叉查找树">二叉查找树</a>。</p>
<p>要知道为什么这些特性确保了这个结果，注意到属性4导致了路径不能有两个毗连的红色节点就足够了。最短的可能路径都是黑色节点，最长的可能路径有交替的红色和黑色节点。因为根据属性5所有最长的路径都有相同数目的黑色节点，这就表明了没有路径能多于任何其他路径的两倍长。</p>
<p>在很多树数据结构的表示中，一个节点有可能只有一个子节点，而叶子节点包含数据。用这种范例表示红黑树是可能的，但是这会改变一些属性并使算法复
杂。为此，本文中我们使用 "nil 叶子"
或"空(null)叶子"，如上图所示，它不包含数据而只充当树在此结束的指示。这些节点在绘图中经常被省略，导致了这些树好象同上述原则相矛盾，而实际
上不是这样。与此有关的结论是所有节点都有两个子节点，尽管其中的一个或两个可能是空叶子。</p>
<br>
<h2>操作</h2>
<p>因为每一个红黑树也是一个特化的<a href="http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8F%89%E6%9F%A5%E6%89%BE%E6%A0%91&amp;variant=zh-cn" title="二叉查找树">二叉查找树</a>，因此红黑树上的只读操作与普通<a href="http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8F%89%E6%9F%A5%E6%89%BE%E6%A0%91&amp;variant=zh-cn" title="二叉查找树">二叉查找树</a>上的只读操作相同。然而，在红黑树上进行插入操作和删除操作会导致不再符合红黑树的性质。恢复红黑树的属性需要少量(<a href="http://zh.wikipedia.org/w/index.php?title=%E5%A4%A7O%E7%AC%A6%E5%8F%B7&amp;variant=zh-cn" title="大O符号">O</a>(log <em>n</em>))的颜色变更(实际是非常快速的)和不超过三次<a href="http://zh.wikipedia.org/w/index.php?title=%E6%A0%91%E6%97%8B%E8%BD%AC&amp;action=edit" class="new" title="树旋转">树旋转</a>(对于插入操作是两次)。虽然插入和删除很复杂，但操作时间仍可以保持为 O(log <em>n</em>) 次。</p>
<h3>插入</h3>
<p>我们首先<a href="http://zh.wikipedia.org/w/index.php?title=%E4%BA%8C%E5%8F%89%E6%9F%A5%E6%89%BE%E6%A0%91&amp;variant=zh-cn#.E6.8F.92.E5.85.A5" title="二叉查找树">以二叉查找树的方法</a>增
加节点并标记它为红色。（如果设为黑色，就会导致根到叶子的路径上有一条路上，多一个额外的黑节点，这个是很难调整的。但是设为红色节点后，可能会导致出
现两个连续红色节点的冲突，那么可以通过颜色调换（color flips）和树旋转来调整。）
下面要进行什么操作取决于其他临近节点的颜色。同人类的家族树中一样，我们将使用术语<em>叔父节点</em>来指一个节点的父节点的兄弟节点。注意:</p>
<ul>
    <li>性质1<sup id="_ref-property1_0" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property1" title="">[1]</a></sup>和性质3<sup id="_ref-property3_0" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property3" title="">[2]</a></sup>总是保持着。</li>
    <li>性质4<sup id="_ref-property4_0" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property4" title="">[3]</a></sup>只在增加红色节点、重绘黑色节点为红色，或做旋转时受到威胁。</li>
    <li>性质5<sup id="_ref-property5_0" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property5" title="">[4]</a></sup>只在增加黑色节点、重绘红色节点为黑色，或做旋转时受到威胁。</li>
</ul>
<p>在下面的示意图中，将要插入的节点标为<strong>N</strong>，<strong>N</strong>的父节点标为<strong>P</strong>，<strong>N</strong>的祖父节点标为<strong>G</strong>，<strong>N</strong>的叔父节点标为<strong>U</strong>。在图中展示的任何颜色要么是由它所处情形所作的假定，要么是这些假定所暗含的。</p>
<p>对于每一种情况，我们将使用 <a href="http://zh.wikipedia.org/w/index.php?title=C%E8%AF%AD%E8%A8%80&amp;variant=zh-cn" title="C语言">C</a>示例代码来展示。通过下列函数，可以找到一个节点的叔父和祖父节点:</p>
<div dir="ltr">
<pre class="source-C">node grandparent(node n) {<br>     return n-&gt;parent-&gt;parent;<br> }<br> <br> node uncle(node n) {<br>     if (n-&gt;parent == grandparent(n)-&gt;left)<br>         return grandparent(n)-&gt;right;<br>     else<br>         return grandparent(n)-&gt;left;<br> }
</pre>
</div>
<p><strong>情形1</strong>: 新节点<strong>N</strong>位于树的根上，没有父节点。在这种情形下，我们把它重绘为黑色以满足性质2<sup id="_ref-property2_0" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property2" title="">[5]</a></sup>。因为它在每个路径上对黑节点数目增加一，性质5<sup id="_ref-property5_1" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property5" title="">[4]</a></sup>符合。</p>
<div dir="ltr">
<pre class="source-C">void insert_case1(node n) {<br>     if (n-&gt;parent == NULL)<br>         n-&gt;color = BLACK;<br>     else<br>         insert_case2(n);<br> }
</pre>
</div>
<p><strong>情形2</strong>: 新节点的父节点<strong>P</strong>是黑色，所以性质4<sup id="_ref-property4_1" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property4" title="">[3]</a></sup>没有失效（新节点是红色的）。在这种情形下，树仍是有效的。性质5<sup id="_ref-property5_2" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property5" title="">[4]</a></sup>受到威胁，因为新节点<strong>N</strong>有两个黑色叶子儿子；但是由于新节点<strong>N</strong>是红色，通过它的每个子节点的路径就都有同通过它所取代的黑色的叶子的路径同样数目的黑色节点，所以这个性质依然满足。</p>
<div dir="ltr">
<pre class="source-C">void insert_case2(node n) {<br>     if (n-&gt;parent-&gt;color == BLACK)<br>         return; /* 树仍旧有效 */<br>     else<br>         insert_case3(n);<br> }
</pre>
</div>
<p><strong>注意:</strong> 在下列情形下我们假定新节点有祖父节点，因为父节点是红色；并且如果它是根，它就应当是黑色。所以新节点总有一个叔父节点，尽管在情形4和5下它可能是叶子。</p>
<table>
    <tbody>
        <tr>
            <td>
            <div class="floatright"><a href="http://zh.wikipedia.org/w/index.php?title=Image:Red-black_tree_insert_case_3.png&amp;variant=zh-cn" class="image" title="情况 3 示意图"><img alt="情况 3 示意图" longdesc="/w/index.php?title=Image:Red-black_tree_insert_case_3.png&amp;variant=zh-cn" src="http://upload.wikimedia.org/wikipedia/commons/c/c8/Red-black_tree_insert_case_3.png" height="139" width="300"></a></div>
            <p><strong>情形3</strong>: 如果父节点<strong>P</strong>和叔父节点<strong>U</strong>二者都是红色，则我们可以将它们两个重绘为黑色并重绘祖父节点<strong>G</strong>为红色(用来保持性质5<sup id="_ref-property5_3" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property5" title="">[4]</a></sup>)。现在我们的新节点<strong>N</strong>有了一个黑色的父节点<strong>P</strong>。因为通过父节点<strong>P</strong>或叔父节点<strong>U</strong>的任何路径都必定通过祖父节点<strong>G</strong>，在这些路径上的黑节点数目没有改变。但是，红色的祖父节点<strong>G</strong>的父节点也有可能是红色的，这就违反了性质4<sup id="_ref-property4_2" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property4" title="">[3]</a></sup>。为了解决这个问题，我们在祖父节点<strong>G</strong>上递归地进行<strong>情形1</strong>的整个过程。</p>
            </td>
        </tr>
    </tbody>
</table>
<div dir="ltr">
<pre class="source-C">void insert_case3(node n) {<br>     if (uncle(n) != NULL &amp;&amp; uncle(n)-&gt;color == RED) {<br>         n-&gt;parent-&gt;color = BLACK;<br>         uncle(n)-&gt;color = BLACK;<br>         grandparent(n)-&gt;color = RED;<br>         insert_case1(grandparent(n));<br>     }<br>     else<br>         insert_case4(n);<br> }
</pre>
</div>
<p><strong>注意:</strong> 在余下的情形下，我们假定父节点<strong>P</strong> 是其父亲<strong>G</strong> 的左子节点。如果它是右子节点，<strong>情形4</strong>和<strong>情形5</strong>中的<em>左</em>和<em>右</em>应当对调。</p>
<table>
    <tbody>
        <tr>
            <td>
            <div class="floatright"><a href="http://zh.wikipedia.org/w/index.php?title=Image:Red-black_tree_insert_case_4.png&amp;variant=zh-cn" class="image" title="情况 4 示意图"><img alt="情况 4 示意图" longdesc="/w/index.php?title=Image:Red-black_tree_insert_case_4.png&amp;variant=zh-cn" src="http://upload.wikimedia.org/wikipedia/commons/5/56/Red-black_tree_insert_case_4.png" height="138" width="283"></a></div>
            <p><strong>情形4</strong>: 父节点<strong>P</strong>是红色而叔父节点<strong>U</strong>是黑色或缺少; 还有，新节点<strong>N</strong>是其父节点<strong>P</strong>的右子节点，而父节点<strong>P</strong>又是其父节点的左子节点。在这种情形下，我们进行一次<a href="http://zh.wikipedia.org/w/index.php?title=%E6%A0%91%E6%97%8B%E8%BD%AC&amp;action=edit" class="new" title="树旋转">左旋转</a>调换新节点和其父节点的角色; 接着，我们按<strong>情形5</strong>处理以前的父节点<strong>P</strong>。这导致某些路径通过它们以前不通过的新节点<strong>N</strong>或父节点<strong>P</strong>中的一个，但是这两个节点都是红色的，所以性质5<sup id="_ref-property5_4" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property5" title="">[4]</a></sup>没有失效。</p>
            </td>
        </tr>
    </tbody>
</table>
<div dir="ltr">
<pre class="source-C">void insert_case4(node n) {<br>     if (n == n-&gt;parent-&gt;right &amp;&amp; n-&gt;parent == grandparent(n)-&gt;left) {<br>         rotate_left(n-&gt;parent);<br>         n = n-&gt;left;<br>     } else if (n == n-&gt;parent-&gt;left &amp;&amp; n-&gt;parent == grandparent(n)-&gt;right) {<br>         rotate_right(n-&gt;parent);<br>         n = n-&gt;right;<br>     }<br>     insert_case5(n);<br> }
</pre>
</div>
<table>
    <tbody>
        <tr>
            <td>
            <div class="floatright"><a href="http://zh.wikipedia.org/w/index.php?title=Image:Red-black_tree_insert_case_5.png&amp;variant=zh-cn" class="image" title="情况 5 示意图"><img alt="情况 5 示意图" longdesc="/w/index.php?title=Image:Red-black_tree_insert_case_5.png&amp;variant=zh-cn" src="http://upload.wikimedia.org/wikipedia/commons/6/66/Red-black_tree_insert_case_5.png" height="138" width="310"></a></div>
            <p><strong>情形5</strong>: 父节点<strong>P</strong>是红色而叔父节点<strong>U</strong> 是黑色或缺少，新节点<strong>N</strong> 是其父节点的左子节点，而父节点<strong>P</strong>又是其父节点<strong>G</strong>的左子节点。在这种情形下，我们进行针对祖父节点<strong>P</strong> 的一次<a href="http://zh.wikipedia.org/w/index.php?title=%E6%A0%91%E6%97%8B%E8%BD%AC&amp;action=edit" class="new" title="树旋转">右旋转</a>; 在旋转产生的树中，以前的父节点<strong>P</strong>现在是新节点<strong>N</strong>和以前的祖父节点<strong>G</strong> 的父节点。我们知道以前的祖父节点<strong>G</strong>是黑色，否则父节点<strong>P</strong>就不可能是红色。我们切换以前的父节点<strong>P</strong>和祖父节点<strong>G</strong>的颜色，结果的树满足性质4<sup id="_ref-property4_3" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property4" title="">[3]</a></sup>。性质5<sup id="_ref-property5_5" class="reference"><a href="http://zh.wikipedia.org/wiki/%E7%B4%85%E9%BB%91%E6%A8%B9#_note-property5" title="">[4]</a></sup>也仍然保持满足，因为通过这三个节点中任何一个的所有路径以前都通过祖父节点<strong>G</strong> ，现在它们都通过以前的父节点<strong>P</strong>。在各自的情形下，这都是三个节点中唯一的黑色节点。</p>
            </td>
        </tr>
    </tbody>
</table>
<div dir="ltr">
<pre class="source-C">void insert_case5(node n) {<br>     n-&gt;parent-&gt;color = BLACK;<br>     grandparent(n)-&gt;color = RED;<br>     if (n == n-&gt;parent-&gt;left &amp;&amp; n-&gt;parent == grandparent(n)-&gt;left) {<br>         rotate_right(grandparent(n));<br>     } else {<br>         /* Here, n == n-&gt;parent-&gt;right &amp;&amp; n-&gt;parent == grandparent(n)-&gt;right */<br>         rotate_left(grandparent(n));<br>     }<br> }
</pre>
</div>
<p>注意插入实际上是<a href="http://zh.wikipedia.org/w/index.php?title=%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95&amp;variant=zh-cn" title="原地算法">原地算法</a>，因为上述所有调用都使用了<a href="http://zh.wikipedia.org/w/index.php?title=%E5%B0%BE%E9%83%A8%E9%80%92%E5%BD%92&amp;action=edit" class="new" title="尾部递归">尾部递归</a>。</p>
<p><a name=".E5.88.A0.E9.99.A4"></a>
<h3>[<a href="http://zh.wikipedia.org/w/index.php?title=%E7%B4%85%E9%BB%91%E6%A8%B9&amp;action=edit&amp;section=5" title="编辑本节">编辑</a>] 删除</h3>
<p><strong>如果需要删除的节点有两个儿子，那么问题可以被转化成删除另一个只有一个儿子的节点的问题</strong>（为了表述方便，这里所指的儿子，为非叶子节点的儿子）。对于二叉查找树，在删除带有两个非叶子儿子的节点的时候，我们找到要么在它的左子树中的最大元素、要么在它的右子树中的最小元素，并把它的值转移到要删除的节点中(如在<a href="http://zh.wikipedia.org/w/index.php?title=Binary_search_tree&amp;action=edit" class="new" title="Binary search tree">这里</a>所展示的那样)。我们接着删除我们从中复制出值的那个节点，它必定有少于两个非叶子的儿子。因为只是复制了一个值而不违反任何属性，这就把问题简化为如何删除最多有一个儿子的节点的问题。它不关心这个节点是最初要删除的节点还是我们从中复制出值的那个节点。</p>
<p>在本文余下的部分中，<strong>我们只需要讨论删除只有一个儿子的节点</strong>(如果它两个儿子都为空，即均为叶子，我们任意将其中一个看作它的儿
子)。如果我们删除一个红色节点，它的父亲和儿子一定是黑色的。所以我们可以简单的用它的黑色儿子替换它，并不会破坏属性3和4。通过被删除节点的所有路
径只是少了一个红色节点，这样可以继续保证属性5。另一种简单情况是在被删除节点是黑色而它的儿子是红色的时候。如果只是去除这个黑色节点，用它的红色儿
子顶替上来的话，会破坏属性4，但是如果我们重绘它的儿子为黑色，则曾经通过它的所有路径将通过它的黑色儿子，这样可以继续保持属性4。</p>
<p><strong>需要进一步讨论的是在要删除的节点和它的儿子二者都是黑色的时候</strong>，这是一种复杂的情况。我们首先把要删除的节点替换为它的儿子。出于方便，称呼这个儿子为<strong>N</strong>，称呼它的兄弟(它父亲的另一个儿子)为<strong>S</strong>。在下面的示意图中，我们还是使用P称呼N的父亲，S<sub>L</sub>称呼S的左儿子，S<sub>R</sub>称呼S的右儿子。我们将使用下述函数找到兄弟节点:</p>
<div dir="ltr">
<pre class="source-C">node sibling(node n) {<br>      if (n == n-&gt;parent-&gt;left)<br>          return n-&gt;parent-&gt;right;<br>      else<br>          return n-&gt;parent-&gt;left;<br> }
</pre>
</div>
<p>我们可以使用下列代码进行上述的概要步骤，这里的函数 <code>replace_node</code> 替换 <code>child</code> 到 <code>n</code> 在树中的位置。出于方便，在本章节中的代码将假定空叶子被用不是 NULL 的实际节点对象来表示(在<em>插入</em>章节中的代码可以同任何一种表示一起工作)。</p>
<div dir="ltr">
<pre class="source-C">void delete_one_child(node n) {<br>     /* Precondition: n has at most one non-null child */<br>     node child = (is_leaf(n-&gt;right)) ? n-&gt;left : n-&gt;right;<br>     replace_node(n, child);<br>     if (n-&gt;color == BLACK) {<br>         if (child-&gt;color == RED)<br>             child-&gt;color = BLACK;<br>         else<br>             delete_case1(child);<br>     }<br>     free(n);<br> }
</pre>
</div>
<p>如果 N 和它初始的父亲是黑色，则删除它的父亲导致通过 N 的路径都比不通过它的路径少了一个黑色节点。因为这违反了属性 4，树需要被重新平衡。有几种情况需要考虑:</p>
<p><strong>情况 1:</strong> N 是新的根。在这种情况下，我们就做完了。我们从所有路径去除了一个黑色节点，而新根是黑色的，所以属性都保持着。</p>
<div dir="ltr">
<pre class="source-C">void delete_case1(node n) {<br>     if (n-&gt;parent == NULL)<br>         return;<br>     else<br>         delete_case2(n);<br> }
</pre>
</div>
<p><strong>注意</strong>: 在情况2、5和6下，我们假定 N 是它父亲的左儿子。如果它是右儿子，则在这些情况下的<em>左</em>和<em>右</em>应当对调。</p>
<table>
    <tbody>
        <tr>
            <td>
            <div class="floatright"><a href="http://zh.wikipedia.org/w/index.php?title=Image:Red-black_tree_delete_case_2.png&amp;variant=zh-cn" class="image" title="情况 2 示意图"><img alt="情况 2 示意图" longdesc="/w/index.php?title=Image:Red-black_tree_delete_case_2.png&amp;variant=zh-cn" src="http://upload.wikimedia.org/wikipedia/commons/3/39/Red-black_tree_delete_case_2.png" height="136" width="298"></a></div>
            <p><strong>情况 2:</strong> S 是红色。在这种情况下我们在N的父亲上做左<a href="http://zh.wikipedia.org/w/index.php?title=Tree_rotation&amp;action=edit" class="new" title="Tree rotation">旋转</a>，把红色兄弟转换成N的祖父。我们接着对调 N 的父亲和祖父的颜色。尽管所有的路径仍然有相同数目的黑色节点，现在 N 有了一个黑色的兄弟和一个红色的父亲，所以我们可以接下去按 4、5或6情况来处理。(它的新兄弟是黑色因为它是红色S的一个儿子。)</p>
            </td>
        </tr>
    </tbody>
</table>
<div dir="ltr">
<pre class="source-C">void delete_case2(node n) {<br>     if (sibling(n)-&gt;color == RED) {<br>         n-&gt;parent-&gt;color = RED;<br>         sibling(n)-&gt;color = BLACK;<br>         if (n == n-&gt;parent-&gt;left)<br>             rotate_left(n-&gt;parent);<br>         else<br>             rotate_right(n-&gt;parent);<br>     }<br>     delete_case3(n);<br> }
</pre>
</div>
<table>
    <tbody>
        <tr>
            <td>
            <div class="floatleft"><a href="http://zh.wikipedia.org/w/index.php?title=Image:Red-black_tree_delete_case_3.png&amp;variant=zh-cn" class="image" title="情况 3 示意图"><img alt="情况 3 示意图" longdesc="/w/index.php?title=Image:Red-black_tree_delete_case_3.png&amp;variant=zh-cn" src="http://upload.wikimedia.org/wikipedia/commons/c/c7/Red-black_tree_delete_case_3.png" height="132" width="313"></a></div>
            <p><strong>情况 3:</strong> N 的父亲、S 和 S 的儿子都是黑色的。在这种情况下，我们简单的重绘 S 为红色。结果是通过S的所有路径, 它们就是以前<em>不</em>通
            过 N 的那些路径，都少了一个黑色节点。因为删除 N 的初始的父亲使通过 N 的所有路径少了一个黑色节点，这使事情都平衡了起来。但是，通过 P
            的所有路径现在比不通过 P 的路径少了一个黑色节点，所以仍然违反属性4。要修正这个问题，我们要从情况 1 开始，在 P 上做重新平衡处理。</p>
            </td>
        </tr>
    </tbody>
</table>
<div dir="ltr">
<pre class="source-C">void delete_case3(node n) {<br>     if (n-&gt;parent-&gt;color == BLACK &amp;&amp;<br>         sibling(n)-&gt;color == BLACK &amp;&amp;<br>         sibling(n)-&gt;left-&gt;color == BLACK &amp;&amp;<br>         sibling(n)-&gt;right-&gt;color == BLACK)<br>     {<br>         sibling(n)-&gt;color = RED;<br>         delete_case1(n-&gt;parent);<br>     }<br>     else<br>         delete_case4(n);<br> }
</pre>
</div>
<table>
    <tbody>
        <tr>
            <td>
            <div class="floatright"><a href="http://zh.wikipedia.org/w/index.php?title=Image:Red-black_tree_delete_case_4.png&amp;variant=zh-cn" class="image" title="情况 4 示意图"><img alt="情况 4 示意图" longdesc="/w/index.php?title=Image:Red-black_tree_delete_case_4.png&amp;variant=zh-cn" src="http://upload.wikimedia.org/wikipedia/commons/d/d7/Red-black_tree_delete_case_4.png" height="132" width="313"></a></div>
            <p><strong>情况 4:</strong> S 和 S 的儿子都是黑色，但是 N 的父亲是红色。在这种情况下，我们简单的交换 N 的兄弟和父亲的颜色。这不影响不通过 N 的路径的黑色节点的数目，但是它在通过 N 的路径上对黑色节点数目增加了一，添补了在这些路径上删除的黑色节点。</p>
            </td>
        </tr>
    </tbody>
</table>
<div dir="ltr">
<pre class="source-C">void delete_case4(node n) {<br>     if (n-&gt;parent-&gt;color == RED &amp;&amp;<br>         sibling(n)-&gt;color == BLACK &amp;&amp;<br>         sibling(n)-&gt;left-&gt;color == BLACK &amp;&amp;<br>         sibling(n)-&gt;right-&gt;color == BLACK)<br>     {<br>         sibling(n)-&gt;color = RED;<br>         n-&gt;parent-&gt;color = BLACK;<br>     }<br>     else<br>         delete_case5(n);<br> }
</pre>
</div>
<table>
    <tbody>
        <tr>
            <td>
            <div class="floatleft"><a href="http://zh.wikipedia.org/w/index.php?title=Image:Red-black_tree_delete_case_5.png&amp;variant=zh-cn" class="image" title="情况 5 示意图"><img alt="情况 5 示意图" longdesc="/w/index.php?title=Image:Red-black_tree_delete_case_5.png&amp;variant=zh-cn" src="http://upload.wikimedia.org/wikipedia/commons/3/30/Red-black_tree_delete_case_5.png" height="133" width="247"></a></div>
            <p><strong>情况 5:</strong> S 是黑色，S 的左儿子是红色，S 的右儿子是黑色，而 N 是它父亲的左儿子。在这种情况下我们在 S
            上做右旋转，这样 S 的左儿子成为 S 的父亲和 N 的新兄弟。我们接着交换 S 和它的新父亲的颜色。所有路径仍有同样数目的黑色节点，但是现在
            N 有了一个右儿子是红色的黑色兄弟，所以我们进入了情况 6。N 和它的父亲都不受这个变换的影响。</p>
            </td>
        </tr>
    </tbody>
</table>
<div dir="ltr">
<pre class="source-C">void delete_case5(node n) {<br>     if (n == n-&gt;parent-&gt;left &amp;&amp;<br>         sibling(n)-&gt;color == BLACK &amp;&amp;<br>         sibling(n)-&gt;left-&gt;color == RED &amp;&amp;<br>         sibling(n)-&gt;right-&gt;color == BLACK)<br>     {<br>         sibling(n)-&gt;color = RED;<br>         sibling(n)-&gt;left-&gt;color = BLACK;<br>         rotate_right(sibling(n));<br>     }<br>     else if (n == n-&gt;parent-&gt;right &amp;&amp;<br>              sibling(n)-&gt;color == BLACK &amp;&amp;<br>              sibling(n)-&gt;right-&gt;color == RED &amp;&amp;<br>              sibling(n)-&gt;left-&gt;color == BLACK)<br>     {<br>         sibling(n)-&gt;color = RED;<br>         sibling(n)-&gt;right-&gt;color = BLACK;<br>         rotate_left(sibling(n));<br>     }<br>     delete_case6(n);<br> }
</pre>
</div>
<table>
    <tbody>
        <tr>
            <td>
            <div class="floatright"><a href="http://zh.wikipedia.org/w/index.php?title=Image:Red-black_tree_delete_case_6.png&amp;variant=zh-cn" class="image" title="情况 6 示意图"><img alt="情况 6 示意图" longdesc="/w/index.php?title=Image:Red-black_tree_delete_case_6.png&amp;variant=zh-cn" src="http://upload.wikimedia.org/wikipedia/commons/3/31/Red-black_tree_delete_case_6.png" height="143" width="299"></a></div>
            <p><strong>情况 6:</strong> S 是黑色，S 的右儿子是红色，而 N 是它父亲的左儿子。在这种情况下我们在 N 的父亲上做左旋转，这样 S
            成为 N 的父亲和 S 的右儿子的父亲。我们接着交换 N 的父亲和 S 的颜色，并使 S
            的右儿子为黑色。子树在它的根上的仍是同样的颜色，所以属性 3 没有被违反。但是，N 现在增加了一个黑色祖先: 要幺 N
            的父亲变成黑色，要么它是黑色而 S 被增加为一个黑色祖父。所以，通过 N 的路径都增加了一个黑色节点。</p>
            <p>此时，如果一个路径不通过 N，则有两种可能性:</p>
            <ul>
                <li>它通过 N 的新兄弟。那么它以前和现在都必定通过 S 和 N 的父亲，而它们只是交换了颜色。所以路径保持了同样数目的黑色节点。</li>
                <li>它通过 N 的新叔父，S 的右儿子。那么它以前通过 S、S 的父亲和 S 的右儿子，但是现在只通过 S，它被假定为它以前的父亲的颜色，和 S 的右儿子，它被从红色改变为黑色。合成效果是这个路径通过了同样数目的黑色节点。</li>
            </ul>
            <p>在任何情况下，在这些路径上的黑色节点数目都没有改变。所以我们恢复了属性 4。在示意图中的白色节点可以是红色或黑色，但是在变换前后都必须指定相同的颜色。</p>
            </td>
        </tr>
    </tbody>
</table>
<div dir="ltr">
<pre class="source-C">void delete_case6(node n) {<br>     sibling(n)-&gt;color = n-&gt;parent-&gt;color;<br>     n-&gt;parent-&gt;color = BLACK;<br>     if (n == n-&gt;parent-&gt;left) {<br>         /* Here, sibling(n)-&gt;color == BLACK &amp;&amp;<br>                  sibling(n)-&gt;right-&gt;color == RED */<br>         sibling(n)-&gt;right-&gt;color = BLACK;<br>         rotate_left(n-&gt;parent);<br>     }<br>     else<br>     {<br>         /* Here, sibling(n)-&gt;color == BLACK &amp;&amp;<br>                  sibling(n)-&gt;left-&gt;color == RED */<br>         sibling(n)-&gt;left-&gt;color = BLACK;<br>         rotate_right(n-&gt;parent);<br>     }<br> }
</pre>
</div>
<p>同样的，函数调用都使用了<a href="http://zh.wikipedia.org/w/index.php?title=%E5%B0%BE%E9%83%A8%E9%80%92%E5%BD%92&amp;action=edit" class="new" title="尾部递归">尾部递归</a>，所以算法是<a href="http://zh.wikipedia.org/w/index.php?title=In-place_algorithm&amp;action=edit" class="new" title="In-place algorithm">就地的</a>。此外，在旋转之后不再做递归调用，所以进行了恒定数目(最多 3 次)的旋转。</p>
<br><br><br>
<h2>渐进边界的证明</h2>
<p>包含<em>n</em>个内部节点的红黑树的高度是 O(log(n))。</p>
<p>定义:</p>
<ul>
    <li>h(<em>v</em>) = 以节点<em>v</em>为根的子树的高度。</li>
    <li>bh(<em>v</em>) = 从<em>v</em>到子树中任何叶子的黑色节点的数目(如果<em>v</em>是黑色则不计数它)(也叫做黑色高度)。</li>
</ul>
<p><strong>引理:</strong> 以节点<em>v</em>为根的子树有至少2<sup><em>b</em><em>h</em>(<em>v</em>)</sup> &#8722; 1个内部节点。</p>
<p>引理的证明(通过归纳高度):</p>
<p>基础: h(<em>v</em>) = 0</p>
<p>如果<em>v</em>的高度是零则它必定是 nil，因此 bh(<em>v</em>) = 0。所以:</p>
<p>2<sup><em>b</em><em>h</em>(<em>v</em>)</sup> &#8722; 1 = 2<sup>0</sup> &#8722; 1 = 1 &#8722; 1 = 0</p>
<p>归纳假设: h(<em>v</em>) = k 的<em>v</em>有 2<sup><em>b</em><em>h</em>(<em>v</em>) &#8722; 1</sup> &#8722; 1 个内部节点暗示了 h(<em>v</em>') = k+1 的 <em>v</em>'有2<sup><em>b</em><em>h</em>(<em>v</em>')</sup> &#8722; 1 个内部节点。</p>
<p>因为 <em>v</em>' 有 h(<em>v</em>') &gt; 0 所以它是个内部节点。同样的它有黑色高度要么是 bh(<em>v</em>') 要么是 bh(<em>v</em>')-1 (依据<em>v</em>'是红色还是黑色)的两个儿子。通过归纳假设每个儿子都有至少 2<sup><em>b</em><em>h</em>(<em>v</em>') &#8722; 1</sup> &#8722; 1 个内部接点，所以 <em>v</em>' 有:</p>
<p>2<sup><em>b</em><em>h</em>(<em>v</em>') &#8722; 1</sup> &#8722; 1 + 2<sup><em>b</em><em>h</em>(<em>v</em>') &#8722; 1</sup> &#8722; 1 + 1 = 2<sup><em>b</em><em>h</em>(<em>v</em>')</sup> &#8722; 1</p>
<p>个内部节点。</p>
<p>使用这个引理我们现在可以展示出树的高度是对数性的。因为在从根到叶子的任何路径上至少有一半的节点是黑色(根据红黑树属性4)，根的黑色高度至少是h(root)/2。通过引理我们得到:</p>
<p><img class="tex" alt="n \geq 2^{{h(root) \over 2}} - 1 \leftrightarrow \; \log{(n+1)} \geq {h(root) \over 2} \leftrightarrow \; h(root) \leq 2\log{(n+1)}" src="http://upload.wikimedia.org/math/e/c/6/ec6ac55ae05acf9899588073dbf1cf66.png"></p>
<p>因此根的高度是O(log(n))。</p><img src ="http://www.blogjava.net/zellux/aggbug/133681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-08-01 00:01 <a href="http://www.blogjava.net/zellux/archive/2007/08/01/133681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全排列的非递归版本</title><link>http://www.blogjava.net/zellux/archive/2007/07/31/133540.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 31 Jul 2007 03:58:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/31/133540.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/133540.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/31/133540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/133540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/133540.html</trackback:ping><description><![CDATA[<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;">from smth.org<br><br>p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;malloc(n&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">));<br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;p[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br><br>output(p,&nbsp;n);<br><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&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;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">--</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p[i]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;p[i&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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(j&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;">;&nbsp;p[j]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;p[i&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">];&nbsp;j</span><span style="color: #000000;">--</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">(p[i&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">]),&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">(p[j]));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i,&nbsp;k&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;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;k;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">,&nbsp;k</span><span style="color: #000000;">--</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">(p[j]),&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">(p[k]));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ouput(p,&nbsp;n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n;<br>&nbsp;&nbsp;&nbsp;}<br><br>free(p);</span></div>
<br><img src ="http://www.blogjava.net/zellux/aggbug/133540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-31 11:58 <a href="http://www.blogjava.net/zellux/archive/2007/07/31/133540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 1014 Dividing</title><link>http://www.blogjava.net/zellux/archive/2007/07/30/133416.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 30 Jul 2007 11:59:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/30/133416.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/133416.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/30/133416.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/133416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/133416.html</trackback:ping><description><![CDATA[把总长度求出来，然后用和背包问题类似的dp算法求是否可以达到这个总长度的一半，但是超时了。<br>
找到一个优化方案，结果0ms就过了，orz<br>http://162.105.81.202/course/problemSolving/dividingProve.doc
<br>以下论证均转自这篇文章。<br>&nbsp;结论 对于任意一种珠宝的个数n，如果n&gt;=8, 可以将n改写为 11（n为奇数） 或 12（n为偶数）。<br><br>证明：<br><br>对于任意一组数，6的个数为n(n&gt;=8)<br><br>一、如果可以分成两堆，我们可以分成两种情况：<br>&nbsp;&nbsp; 1.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两堆里都有6，那么我们可知：把n改为n-2，仍然可分。<br>(两堆各减一个6)<br>2. 只有一堆里有6，设为左边，那么左边的总和不小于6*8=48。<br>我们观察，5*6=6*5 ，4*3=6*2 ， 3*2=6 ， 2*3=6 ， 1*6=6<br>而 5*5 + 4*2 + 3*1 + 2*2 + 1*5 = 25 + 8 + 3 + 4 + 5 = 45 &lt; 48<br>由抽屉原理右边必然存在<br>(多于5个的5 或者 多于2个的4 或者 多于1个的3<br>或者 多于2个的2 或者 多于5个的1)<br>即右边至少存在一组数的和等于若干个6，比如右边有3个4，这样把左边的2个6与右边的3个4交换，则又出现左右都有6的情况。 根据1，我们还是可以把n改为n-2且可分的状态不变。<br>综合1，2。我们可以看出只要原来n的个数=8,我们就可以把它改为n-2，这样操作一直进行到n&lt;8。我们可以得出结论，对于大于等于8的偶数，可以换成6。<br>对于大于8的奇数，可以换成7。换完之后仍然可分。<br><br>二、如果不能分成两堆：<br>显然改为n-2时同样也不能分，那么对于大于等于8的偶数，可以换成6；对于大于8的奇数，可以换成7。换完之后仍然不可分。<br><br>综合一、二，我们得出结论把不小于8的偶数改为8，大于8的奇数改为7，原来可分与否的性质不会改变。<br><br>以上是对6的讨论，同样的方法可以推出<br>5的个数 6*4 + 4*4 + 3*4 + 2*4 + 1*4 = 64 &lt; 5*13<br>即5的个数多于12时，偶数换为12，奇数换为11<br>4的个数 6*1 + 5*3 + 3*3 + 2*1 + 1*3 = 35 &lt; 4*9<br>即4的个数多于8时，偶数换为8，奇数换为7<br>3的个数 5*2 + 4*2 + 2*2 + 1*2 = 24 &lt; 3*9<br>即3的个数多于8时，偶数换为8，奇数换为7<br>2的个数 5*1 + 3*1 + 1*1 = 9 &lt; 2*5<br>即2的个数多于4时，偶数换为4，奇数换为3<br>1的个数 多于5则必然可分(在总数是偶数的前提下)<br><br>综上所述,<br>对于任意一种珠宝的个数n，如果n&gt;=8, 可以将n改写为 11（n为奇数） 或 12（n为偶数）。<br><br>进一步分析：<br>对每个数（1-6），以上只是粗略的估计，可以进一步减少其最大有效取值，例如，<br>对于6，5*5 + 4*2 + 3*1 + 2*2 + 1*5 = 25 + 8 + 3 + 4 + 5 = 45<br>就有4和2不能同时出现，5和1不能同时出现，3个5和1个3不能同时出现，4个5不能和1个4同时出现等等，所以组合不出6的整数倍的情况的总价值至多为25，所以当6的个数大于6时，奇数可改为5，偶数可改为6。<br>1-5 也有类似情况。<br><br>为了得出精确值，下面先我们讨论这样一个数论命题。<br><br>命题：<br>可重复的从自然数集中取出n个数（n&gt;=2)，其中必有若干个数之和能被n整除。<br><br>证明：设取出的n个自然数为a1,a2,a3,.....an<br><br>考虑这样的n+1个数 0, a1, a1+a2 , a1+a2+a3 , ...... , a1+a2+a3+...+an， 由于自然数模n的剩余类有n个，所以以上n+1个数中必有两个同余。 这两个数的差必被n整除，而且这两个数的差就是原来的n个数中的一些数的和。<br>这就证明了命题。<br><br>由以上命题<br>对于6而言，我们至多从{1，2，3，4，5}中可重复的找出5个数使它们不能组合成6的倍数。<br>所以这些数的和小于等于5*5=25<br>对于5而言，我们至多从{1，2，3，4，6}中可重复的找出4个数使它们不能组合成5的倍数。<br>所以这些数的和小于等于6*4=24<br>对于4而言，我们至多从{1，2，3，5，6}中可重复的找出3个数使它们不能组合成4的倍数。<br>所以这些数的和小于等于3*6=18 ， 然而，两个6就是4的倍数， 所以最多有一个6<br>此时不能有两个5（2*5+6=16是4的倍数）， 最多才6 + 5 + 3 = 14 &lt; 3*5 =15<br>所以这些数的和小于等于3*5=15<br>对于3而言，我们至多从{1，2，4，5，6}中可重复的找出2个数使它们不能组合成3的倍数。<br>所以这些数的和小于等于2*5=10<br><br>（6就是3的倍数，所以不能取6）<br><br>对于2而言，我们至多从{1，3，4，5，6}中可重复的找出1个数使它们不能组合成6的倍数。<br><br>所以这些数的和小于等于1*5=5<br><br><br><br>考虑到 4*6 &lt; 25 &lt; 5*6 , 我们可以算出6的最大有效个数为5 。<br><br>考虑到 4*5 &lt; 24 &lt; 5*5 , 我们可以算出5的最大有效个数为5 。但是其实应该修正为6， 如果遇到如下特殊情况，左边5个6，右边6个5。此时虽然左右可以交换，但是交换后仍然只有一边有5，与（一、2）中讨论情况不符。<br><br>考虑到 3*4 &lt; 15 &lt; 4*4 , 我们可以算出5的最大有效个数为4 。但是其实应该修正为5， 如果遇到如下特殊情况，左边4个5，右边5个4。此时虽然左右可以交换，但是交换后仍然只有一边有4，与（一、2）中讨论情况不符。<br><br>考虑到 3*3 &lt; 10 &lt; 4*3 , 我们可以算出5的最大有效个数为4 。但是其实应该修正为5， 如果遇到如下特殊情况，左边3个5，右边5个3。此时虽然左右可以交换，但是交换后仍然只有一边有3，与（一、2）中讨论情况不符。<br><br>考虑到 2*2 &lt; 5 &lt; 3*2 , 我们可以算出5的最大有效个数为3 。 但是其实应该修正为4，如果遇到如下特殊情况，左边1个3和1个5，右边4个2。此时虽然左右可以交换，但是交换后仍然只有一边有2，与（一、2）中讨论情况不符。<br><br><br>我们得出最后的精确结论：<br><br>奇数改为 偶数改为<br>6的个数大于5 5 4<br>5的个数大于6 5 6<br>4的个数大于5 5 4<br>3的个数大于5 5 4<br>2的个数大于4 3 4&nbsp;
<br><br><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;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br><br></span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;n[</span><span style="color: #000000;">6</span><span style="color: #000000;">];<br></span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;sum;<br></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;MAX_N&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">60000</span><span style="color: #000000;">;<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;dividable()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;f[MAX_N];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;sum;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;f[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&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;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n[i];&nbsp;j</span><span style="color: #000000;">++</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;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">base</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;(i&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">base</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;sum)&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sum&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;(i</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">);&nbsp;k&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">base</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;k</span><span style="color: #000000;">--</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(f[k])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[k&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">]&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(f[sum])&nbsp;</span><span style="color: #0000ff;">return</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;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;f[sum];<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;">long</span><span style="color: #000000;">&nbsp;cases&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</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;cin&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;n[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(n[</span><span style="color: #000000;">5</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)&nbsp;n[</span><span style="color: #000000;">5</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;n[</span><span style="color: #000000;">5</span><span style="color: #000000;">]&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;(n[</span><span style="color: #000000;">4</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">)&nbsp;n[</span><span style="color: #000000;">4</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;n[</span><span style="color: #000000;">4</span><span style="color: #000000;">]&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;(n[</span><span style="color: #000000;">3</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)&nbsp;n[</span><span style="color: #000000;">3</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;n[</span><span style="color: #000000;">3</span><span style="color: #000000;">]&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;(n[</span><span style="color: #000000;">2</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)&nbsp;n[</span><span style="color: #000000;">2</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;n[</span><span style="color: #000000;">2</span><span style="color: #000000;">]&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;(n[</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">)&nbsp;n[</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;n[</span><span style="color: #000000;">1</span><span style="color: #000000;">]&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;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</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;sum&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;n[i]&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;(i&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;">if</span><span style="color: #000000;">&nbsp;(sum&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cases</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Collection&nbsp;#</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;cases&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">:\n</span><span style="color: #000000;">"</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;(sum&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</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;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Can't&nbsp;be&nbsp;divided.\n\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&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;(dividable())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Can&nbsp;be&nbsp;divided.\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<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;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Can't&nbsp;be&nbsp;divided.\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<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></span></div>
<br><br> <img src ="http://www.blogjava.net/zellux/aggbug/133416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-30 19:59 <a href="http://www.blogjava.net/zellux/archive/2007/07/30/133416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nuts-and-Bolts Problem</title><link>http://www.blogjava.net/zellux/archive/2007/07/25/132328.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 25 Jul 2007 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/25/132328.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/132328.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/25/132328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/132328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/132328.html</trackback:ping><description><![CDATA[<p>问题：</p>
<p>有n个大小各不相同的螺帽及对应的螺钉，要求在O(nlogn)的复杂度内完成配对。螺钉之间、螺帽之间都无法直接比较大小，只能比较一颗螺帽与螺钉，判断他们之间的大小差异。<br></p>
<p>感觉和快速排序的partition差不多。</p>
<p>首先任选一颗螺钉与各螺帽进行比较，分成大小两组，另外得到与改螺钉相匹配的螺帽。</p>
<p>然后用那个螺帽再和其他螺钉比较，也分成大小两组，然后继续二分递归。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zellux/aggbug/132328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-25 16:01 <a href="http://www.blogjava.net/zellux/archive/2007/07/25/132328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Stooge sort</title><link>http://www.blogjava.net/zellux/archive/2007/07/25/132295.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 25 Jul 2007 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/25/132295.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/132295.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/25/132295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/132295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/132295.html</trackback:ping><description><![CDATA[CLRS page 161<br>伪代码描述：<br>Stooge-sort(A, i, j)<br>if A[i] &gt; A[j]<br>&nbsp;&nbsp;&nbsp; then exchange A[i], A[]<br>if i + 1&nbsp; &gt;= j<br>&nbsp;&nbsp;&nbsp; then return<br>k = (j - i + 1) / 3<br>Stooge-sort(A, i, j - k)<br>Stooge-sort(A, i + k , j)<br>Stooge-sort(A, i, j - k)<br>即先排序前2/3部分，然后是后2/3部分，最后再进行前面1/3的排序。<br><br>a. 证明算法正确性<br>由于是递归算法，而初始状态显然成立，因此只要证明当部分排序正确时，整体也能够被正确排序：<br>第一次排序后，第二部分每个数都不小于第一部分的所有数；<br>第二次排序后，第二部分某些数被交换到第三部分中，此时第三部分数都不小于第二部分和第一部分的数，但是第二部分的数并不一定都小于第一部分的（因为可能包含第三部分的数，而这些数与第一部分数的大小关系无法确认）；<br>第三次排序后，第二部分的数都不小于第一部分的数。<br>这样，第一部分的任意数&lt;=第二部分的任意数&lt;=第三部分的任意数<br>而且各部分的数都已排序，因此整体已被排序。<br><br>b. 复杂度分析<br>递归式<br>T(n) = 3T(2n/3) + 1<br>由Master Theorem<br><img src="http://www.cnblogs.com/images/cnblogs_com/sjpisaboy/master2.GIF" border="0">
<br>T(n) = O(n^log(3/2, 3))<br> <img src ="http://www.blogjava.net/zellux/aggbug/132295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-25 14:13 <a href="http://www.blogjava.net/zellux/archive/2007/07/25/132295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Young tableaus</title><link>http://www.blogjava.net/zellux/archive/2007/07/23/131922.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 23 Jul 2007 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/23/131922.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/131922.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/23/131922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/131922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/131922.html</trackback:ping><description><![CDATA[CLRS上第六章的习题，以前感觉挺难的，现在仔细想了发现其实和堆是一样的。<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%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Min-Young&nbsp;tableaus&nbsp;on&nbsp;Page&nbsp;143&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iomanip</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;YTable<br>{<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Type</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">&nbsp;data;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m,&nbsp;n;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;INFINITY&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">9999</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;YTable(</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;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">YTable();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Insert(Type&nbsp;x);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;FloatUp(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Print();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Extract(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y,&nbsp;Type&nbsp;value);<br>};<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>YTable</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::YTable(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;n;<br>&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Type</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">[m];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;m;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Type[n];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;m;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;n;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[i][j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;INFINITY;<br>}<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>YTable</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">YTable()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;m;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;data[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;data;<br>}<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;YTable</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Insert(Type&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(data[m&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">][n&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;INFINITY)<br>&nbsp;&nbsp;&nbsp;&nbsp;&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>&nbsp;&nbsp;&nbsp;&nbsp;data[m&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">][n&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;FloatUp(m&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</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>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;YTable</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::FloatUp(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;maxX&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;maxY&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;y;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(x&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;data[x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">][y]&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;data[maxX][maxY])<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxX&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;x&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;maxY&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;y;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(y&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;data[x][y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;data[maxX][maxY])<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxX&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxY&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;y&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;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(maxX&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;x&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;maxY&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;y)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(data[maxX][maxY],&nbsp;data[x][y]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FloatUp(maxX,&nbsp;maxY);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;YTable</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Print()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;cout.setf(ios::</span><span style="COLOR: #0000ff">fixed</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;m;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;n;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(data[i][j]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;INFINITY)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;setw(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;data[i][j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;X&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;YTable</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Extract(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y,&nbsp;Type&nbsp;value)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;data[x][y]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;FloatUp(x,&nbsp;y);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</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;YTable</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;myTable(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myTable.Insert(x[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Initial&nbsp;state:\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;myTable.Print();<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\nNow&nbsp;change&nbsp;(4,3)&nbsp;to&nbsp;5:\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;myTable.Extract(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;myTable.Print();<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>&nbsp;&nbsp;&nbsp;&nbsp;<br></span></div>
<br><br>
<img src ="http://www.blogjava.net/zellux/aggbug/131922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-23 17:51 <a href="http://www.blogjava.net/zellux/archive/2007/07/23/131922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>