﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-A Za, A Za, Fighting...</title><link>http://www.cppblog.com/Joe/</link><description>坚信：勤能补拙</description><language>zh-cn</language><lastBuildDate>Sat, 04 Apr 2026 17:16:15 GMT</lastBuildDate><pubDate>Sat, 04 Apr 2026 17:16:15 GMT</pubDate><ttl>60</ttl><item><title>2011找工总结</title><link>http://www.cppblog.com/Joe/archive/2012/02/27/166619.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Mon, 27 Feb 2012 05:19:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2012/02/27/166619.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/166619.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2012/02/27/166619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/166619.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/166619.html</trackback:ping><description><![CDATA[找工，其实早在11年十一月份就结束了，今天来补个总结。<br /><br />11年九月下旬赶回去参加趋势科技在南京的笔试，并成功地在十一之前拿到offer，记得从南京坐高铁回家，怀里揣着趋势的offer很是心安，也给了自己很大的信心（因为，一直觉得自己从广州跑回南京上海找工会处于劣势），至今对于趋势科技面试的轻松氛围，包括最后的群面都印象深刻，是一家很nice的公司。<br /><br />休完十一假期就赶去上海，在上海复旦呆了个把月，感谢舍友彭博帮我在复旦找到落脚地。<br />在上海，前前后后参加了很多的笔试面试，最终拿到了满意的offer，去了EMC，尽量得花5000大洋的毁约费。<br /><br />推荐公司：EMC，TrendMicro，Marvell<br /><br />&#8220;经验&#8221;：<br />自信&amp;微笑，熟练掌握一门语言(如C)，数据结构与算法(推荐《算法导论》)，操作系统(推荐《深入理解计算机系统》)，有个别&#8220;拿得出手&#8221;的小项目，英语<br /><br />----------------------------------------------------------------------------------------------------------------<br />所有投递简历公司那长长的列表(排名按投递简历的时间顺序)：<br /><br /><div>1. 爱立信 上海 <br />SH01 Software Design Engineer (上海)&nbsp;</div><div>[已笔试, 通过群面, 放弃]</div><div></div><div>2. 趋势科技 Trend Micro (上海)</div><div>软件工程师</div><div>https://campus.trendmicro.com.cn</div><div>[已笔试, 已面试, OFFER]</div><div></div><div>3. Marvell (上海)&nbsp;</div><div>[已笔试，已面试，OFFER]</div><div></div><div>4. 百度 (上海)</div><div>[时间冲突，放弃]</div><div></div><div>5. 华为</div><div>软件研发工程师 性能/算法工程师</div><div>[放弃]</div><div></div><div>6. 飞利浦 苏州 (上海)</div><div>嵌入式软件开发工程师 软件应用开发工程师</div><div>[放弃]</div><div></div><div>7. Google (上海)</div><div>[放弃]</div><div></div><div>8. nVidia 英伟达 (上海)</div><div>GPU Architect</div><div>[放弃]</div><div></div><div>9. EMC (上海)</div><div>Software Development Engineer 上海</div><div>[已笔试, 已面试, OFFER]</div><div></div><div>10. AMD (上海)</div><div>System Software Engineer</div><div>[木有笔试机会]</div><div></div><div>11. 腾讯 (上海)</div><div>后台开发 上海</div><div>[已笔试, 已面试, OFFER]</div><div></div><div>12. 微软 (上海)</div><div>软件开发工程师 上海</div><div>[时间冲突，放弃]</div><div></div><div>13 Samsung (南京)</div><div>手机开发 南京</div><div>[放弃]</div><div></div><div>14 IBM CSTL (上海)</div><div>storage software engineer</div><div>[没消息]</div><div></div><div>15. Intel (上海)</div><div>zhaopin.com</div><div>[木有笔试机会]</div><div>16. Cisco (上海)</div><div>embedded software development engineer</div><div>[放弃]</div><div></div><div>17. 大众点评网 (上海)</div><div>技术培训生 - 开发</div><div>[放弃]</div><div></div><div>18. 阿尔卡特朗讯 (上海)</div><div>[放弃]</div><div></div><div>19. 支付宝 (上海)</div><div>[放弃]</div><div></div><div>20. 中航无线电 (上海)</div><div>[放弃]</div><div></div><div>21. Oracle (上海)</div><div>[已面试，算是给了OFFER]<br />22. 江苏移动<br />[放弃]<br /><br /><br /></div><img src ="http://www.cppblog.com/Joe/aggbug/166619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2012-02-27 13:19 <a href="http://www.cppblog.com/Joe/archive/2012/02/27/166619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2011知识点 - 多态的C实现</title><link>http://www.cppblog.com/Joe/archive/2011/10/20/158766.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Thu, 20 Oct 2011 09:22:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/10/20/158766.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/158766.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/10/20/158766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/158766.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/158766.html</trackback:ping><description><![CDATA[示例代码:<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<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;how&nbsp;to&nbsp;simulate&nbsp;C++'s&nbsp;polymorphism&nbsp;with&nbsp;C&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;declaration&nbsp;of&nbsp;virtual&nbsp;method&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />typedef&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">Func1)(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">);<br />typedef&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">Func2)(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br />typedef&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">Func3)(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">);<br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;-------------------&nbsp;Base&nbsp;Class&nbsp;begin&nbsp;------------------</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func1_base(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">func1_base(void)&nbsp;called\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func2_base(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;item)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">func2_base(%d)&nbsp;called\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;item);<br />}<br /><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Vtbl_Base&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Func1&nbsp;f1;<br />&nbsp;&nbsp;&nbsp;&nbsp;Func2&nbsp;f2;<br />};<br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Vtbl_Base&nbsp;bvtbl&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">func1_base,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">func2_base};<br /><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Base&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">vptr;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;pointer&nbsp;to&nbsp;VTABLE&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;field_base;<br />};<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Base_Init(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Base&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;value)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">vptr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">bvtbl;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">field_base&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;value;<br />}<br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;-------------------&nbsp;Base&nbsp;Class&nbsp;end&nbsp;------------------</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;-------------------&nbsp;Derived&nbsp;Class&nbsp;begin&nbsp;------------------</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func1_derived(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">func1_derived(void)&nbsp;called\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;func3_derived(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">item)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">func3_derived(%s)&nbsp;called\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;item);<br />}<br /><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Vtbl_Derived&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Vtbl_Base&nbsp;vtbl_base;<br />&nbsp;&nbsp;&nbsp;&nbsp;Func3&nbsp;f3;<br />};<br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Vtbl_Derived&nbsp;dvtbl&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{{</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">func1_derived,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">func2_base},&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">func3_derived};<br /><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Derived&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Base&nbsp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;field_derived;<br />};<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Derived_Init(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Derived&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">derived,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;b,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;d)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Base_Init((</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Base&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)derived,&nbsp;b);<br />&nbsp;&nbsp;&nbsp;&nbsp;derived</span><span style="color: #000000; ">-&gt;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">.vptr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dvtbl;<br />&nbsp;&nbsp;&nbsp;&nbsp;derived</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">field_derived&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;d;<br />}<br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;-------------------&nbsp;Derived&nbsp;Class&nbsp;end&nbsp;------------------</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;<br />test_polymorphism(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Base&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">obj)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Vtbl_Base&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)(obj</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">vptr))</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">f1();<br />&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Vtbl_Base&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)(obj</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">vptr))</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">f2(obj</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">field_base);<br />}<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br />main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Base&nbsp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;Base_Init(</span><span style="color: #000000; ">&amp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">128</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;test_polymorphism(</span><span style="color: #000000; ">&amp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Derived&nbsp;derived;<br />&nbsp;&nbsp;&nbsp;&nbsp;Derived_Init(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">derived,&nbsp;</span><span style="color: #000000; ">128</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">256</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;test_polymorphism((</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Base&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">derived);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Vtbl_Derived&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">derived))</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">f3(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">polymorphism</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/158766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-10-20 17:22 <a href="http://www.cppblog.com/Joe/archive/2011/10/20/158766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2011好题 - Young氏矩阵[zz]</title><link>http://www.cppblog.com/Joe/archive/2011/10/16/158483.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 16 Oct 2011 11:11:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/10/16/158483.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/158483.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/10/16/158483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/158483.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/158483.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 22px; background-color: #ffffff; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">转:&nbsp;<br /><div><a href="http://www.binghe.org/2011/05/young-tableau/">http://www.binghe.org/2011/05/young-tableau/</a></div><br />一个 m*n 的 Young 氏矩阵(Young tableau) 是一个 m*n 的矩阵,其中每一行的数据都从左到右排序,每一列的数据都从上到下排序.Young&nbsp;氏矩阵中可能会有一些&nbsp;&nbsp;&#8734; 数据项,表示不存在的元素.所以,Young 氏矩阵可以用来存放 r&lt;= mn 个有限的元素.<br />a).画一个包含{9,16,3,2,4,8,5,14,12} 的4*4 的 Young 氏矩阵.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">b).给出一个在非空 m*n 的 Young&nbsp; 氏矩阵上实现 EXTRACT-MIN 算法,使其运行时间为O(m+n).</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">c).说明如何在O(m+n)时间内,将一个新元素手入到一个未满的 m*n Young 氏矩阵中.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">d).给出一个时间复杂度为 O(n^3) 的对 n*n Young 氏矩阵排序的算法.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">e).给出一个运行时间为O(m+n) 的算法,来决定一个给定的数是否存在于一个给定的 m*n&nbsp;&nbsp;的 Young 氏矩阵当中.<span id="more-545" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; "></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">答</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">a).&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">8&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp; 12&nbsp;&nbsp;&nbsp; 14</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">16&nbsp;&nbsp;&nbsp; &#8734;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8734;&nbsp;&nbsp;&nbsp;&nbsp; &#8734;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">&#8734;&nbsp;&nbsp;&nbsp;&nbsp; &#8734;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8734;&nbsp;&nbsp;&nbsp;&nbsp; &#8734;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">PS.该矩阵并不是唯一的.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">b). (1)用递归的思想.在 Young 氏矩阵中，通过递归的解决(m-1)*n,或m*(n-1) 的子问题来求解.则有 T(m,n)=T(m-1,n) or T(m,n-1)+&nbsp;O(1),显然,T=O(m+n).伪代码如下:</p><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; ">EXTRACT_MIN(Young[1...m]&nbsp;[1...n])<br />EXTRACT_MIN=Young[1][1];&nbsp;//类似FORTRAN的写法.函数名即是返回值.<br />Young[1][1]=&nbsp;INFINITY;<br />ADJUST_TO_YOUNG(Young[1...m]&nbsp;[1...n]);<br />END<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; "></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">ADJUST_TO_YOUNG(Young[x...m]&nbsp;[y...n])<br />if(Young[x][y]==&#8734;)<br />return;<br />if(Young[x+1][y]&gt;Young[x][y+1])<br />swap(Young[x][y], Young[x][y+1]);<br />ADJUST_TO_YOUNG(Young[x...m][y+1...n]);<br />else<br />swap(Young[x][y], Young[x+1][y]);<br />ADJUST_TO_YOUNG(Young[x+1...m][y...n]);<br />END</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">(2)类似堆的删除：将Young[1][1]与最右下角元素交换, 然后移动Young[1][1]处的元素至合适位置，即把它与右方或下方元素的比较,并与其中较小的一个交换.反复进行直到它不大于它右方和下方的元素为止.</p></div></div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">c).&nbsp; 类似堆的插入：先将待插入的元素 K 放在 Young[m][n], 然后比较 K 与它左方或上方元素的大小,并与其中较大的一个交换.反复进行直到 K 不小于它左方和上方的元素为止. 在这里,同样有,T(m,n)=T(m-1,n) or T(m,n-1)+&nbsp;O(1),T=O(m+n).伪代码如下:</p><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; ">INSERT(k,Young[m][n])<br />if(Young[m][n]&nbsp;&lt;&nbsp;INFINITY)&nbsp;&nbsp;alert:&nbsp;矩阵已满,无法插入!!<br />while(k&lt;Young[m-1][n]&nbsp;or&nbsp;k&lt;Young[m][n-1])<br />if(Young[m-1][n]&nbsp;&gt;Young[m][n-1])<br />swap(k,Young[m-1][n]);<br />m=m-1;<br />else<br />swap(k,Young[m][n-1]);<br />n=n-1;<br />END</div></div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">d). 调用 n*n 次 EXTRACT_MIN 过程即可.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">e). 总是于最右上角的元素X比较；<br />1）如果==X,结束；<br />2）如果比X小，那么元素只可能在前N-1列中；<br />3）如果比X大，那么元素只可能在后M-1行中；<br />Young 氏矩阵去掉一行或一列还是 Young 氏矩阵；<br />所以每次比较最少去掉一行或一列，这样复杂度就是 O(m+n);</p><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; "><div></div></div></span><img src ="http://www.cppblog.com/Joe/aggbug/158483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-10-16 19:11 <a href="http://www.cppblog.com/Joe/archive/2011/10/16/158483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2011好题 - 寻找俩已排好序数组的中位数</title><link>http://www.cppblog.com/Joe/archive/2011/10/16/158477.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sun, 16 Oct 2011 10:38:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/10/16/158477.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/158477.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/10/16/158477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/158477.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/158477.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 22px; background-color: #ffffff; ">问题:<br />有两个已排好序的数组A和B，长度均为n，找出这两个数组的中间元素。要求时间代价为O(logn)<br /><br />思路:<br />a. 比较自然的思路是归并算法，不过时间复杂度是O(n)，无法满足题目要求<br /><br />b. <br />(&nbsp;<a href="http://www.binghe.org/2011/05/find-median/">http://www.binghe.org/2011/05/find-median/</a>&nbsp;)<br /><br /></span><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 22px; background-color: #ffffff; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">Say the two arrays are sorted and increasing, namely A and B.<br />It is easy to find the median of each array in O(1) time.<br />Assume the median of array A is m and the median of array B is n.<br />Then,<br />1&#8242; If m=n, then clearly the median after merging is also m, the algorithm holds.<br />2&#8242; If m&lt;n, then reserve the half of sequence A in which all numbers are greater than<br />m, also reserve the half of sequence B in which all numbers are smaller than n.<br />Run the algorithm on the two new arrays.<br />3&#8242; If m&gt;n, then reserve the half of sequence A in which all numbers are smaller than<br />m, also reserve the half of sequence B in which all numbers are larger than n.<br /><br />Run the algorithm on the two new arrays.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 14px; text-align: justify; ">Time complexity: O(logn)</p></span><span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 22px; background-color: #ffffff; "><br /><br /><br /><br /><br /></span><img src ="http://www.cppblog.com/Joe/aggbug/158477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-10-16 18:38 <a href="http://www.cppblog.com/Joe/archive/2011/10/16/158477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2011面试题 - 循环报数</title><link>http://www.cppblog.com/Joe/archive/2011/10/11/158089.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Tue, 11 Oct 2011 15:08:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/10/11/158089.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/158089.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/10/11/158089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/158089.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/158089.html</trackback:ping><description><![CDATA[昨天去面试，结果中间还插了一个小时的上机(给个laptop，Windows+VC环境，用惯Vim结果好不习惯^_^)，其中一题如下：<br /><br /><span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif; line-height: 16px; background-color: #ffffff; font-size: small; ">有N个人按照1到N编号围成一个圈做游戏<br />从第一个人开始从1<em style="color: #d14836; font-style: normal; ">报数</em>,数到M的人退出游戏,他后面的人接着重新从1开始<em style="color: #d14836; font-style: normal; ">报数，一直持续到所有人都退出</em>．<br />要求输出退出游戏的人的顺序.<br /><br /></span>这题以前看过，记得貌似有些数学规律的，忘了，所以只能当场用模拟的方法来做。<br />当时用的是循环数组来模拟，结果花了半个小时才编译、测试搞定，面试我的人(挺Nice的)看了之后说，答案输出是对的，其实更自然的模拟是用链表。<br />刚才用链表试了下，果然简单好多，大概五分钟就可以搞定。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">assert.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n,&nbsp;m;<br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Item&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;number;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Item&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">next;<br />};<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "><br />solve(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;m)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(n</span><span style="color: #000000; ">&gt;</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;m</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">n);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Item&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">items&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Item&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)malloc(</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Item)&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;n);<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(items&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;init&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">n</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;items[i].number&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; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;items[i].next&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;items</span><span style="color: #000000; ">+</span><span style="color: #000000; ">i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;items[n</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">].number&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;n;<br />&nbsp;&nbsp;&nbsp;&nbsp;items[n</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">].next&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;items;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;simulate&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;Item&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">cur,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">prev&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;items;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(n</span><span style="color: #000000; ">--</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;m;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">--</span><span style="color: #000000; ">j)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cur;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cur</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;cur</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">number);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cur</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cur</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;free(items);<br />}<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "><br />main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">n,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">m)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;EOF)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Result&nbsp;of&nbsp;(N=%d,&nbsp;M=%d)\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;n,&nbsp;m);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve(n,&nbsp;m);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><img src ="http://www.cppblog.com/Joe/aggbug/158089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-10-11 23:08 <a href="http://www.cppblog.com/Joe/archive/2011/10/11/158089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2011知识点 - 文件描述符 dup/dup2</title><link>http://www.cppblog.com/Joe/archive/2011/10/08/157799.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sat, 08 Oct 2011 07:57:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/10/08/157799.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/157799.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/10/08/157799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/157799.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/157799.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: normal; background-color: #ffffff; "><p class="p0" style="line-height: normal; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: normal; font-weight: bold; font-size: 12pt; ">文件描述符<font face="Arial Black" style="line-height: normal; ">----</font><font face="宋体" style="line-height: normal; ">文件表</font><font face="Arial Black" style="line-height: normal; ">----v</font><font face="宋体" style="line-height: normal; ">节点结构三者的联系</font></span></p><p class="p0" style="line-height: normal; text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: normal; font-size: 10.5pt; "><br />&nbsp; &nbsp; &nbsp; &nbsp;既然文件描述符标识特定进程正在访问的文件，那进程跟文件是怎么联系起来的呢？</span></p><p class="p0" style="line-height: normal; margin-left: 21.25pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: normal; font-size: 10.5pt; ">&nbsp; &nbsp; &nbsp; &nbsp;首先我们得知道每运行一个进程，<font face="Arial Black" style="line-height: normal; ">shell</font><font face="宋体" style="line-height: normal; ">就会默认为其打开三个文件描述符</font><font face="Arial Black" style="line-height: normal; ">(0,1,2)</font><font face="宋体" style="line-height: normal; ">，分别与标准输入</font><font face="Arial Black" style="line-height: normal; ">(stdin)</font><font face="宋体" style="line-height: normal; ">，标准输出</font><font face="Arial Black" style="line-height: normal; ">(stdout)</font><font face="宋体" style="line-height: normal; ">和标准错误</font><font face="Arial Black" style="line-height: normal; ">(stderr)</font><font face="宋体" style="line-height: normal; ">对应。</font></span></p><p class="p0" style="line-height: normal; margin-left: 21.25pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: normal; font-size: 10.5pt; ">&nbsp; &nbsp; &nbsp; &nbsp;接下来讲下内核所使用的三种数据结构，正是这三种数据结构才使进程最终跟文件联系起来。</span><span style="line-height: normal; font-size: 10.5pt; ">建议边看图一边看下面的文字描述</span></p><p class="p0" style="line-height: normal; margin-left: 49.6pt; text-indent: -28.35pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: normal; font-size: 10.5pt; ">&nbsp; &nbsp; &nbsp; a.&nbsp;</span><span style="line-height: normal; font-size: 10.5pt; ">每个进程在进程表中都有一个记录项，每个记录项中有一张打开文件描述符表，可将其视为一个矢量，每个描述符占用一项。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 与每个文件描述符相关联的是：</span><span style="line-height: normal; font-size: 10.5pt; ">(a)&nbsp;</span><span style="line-height: normal; font-size: 10.5pt; ">文件描述符。</span><span style="line-height: normal; font-size: 10.5pt; ">(b)&nbsp;</span><span style="line-height: normal; font-size: 10.5pt; ">指向一个文件表项的指针</span></p><p class="p0" style="line-height: normal; margin-left: 49.6pt; text-indent: -28.35pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: normal; font-size: 10.5pt; ">&nbsp; &nbsp; &nbsp; b. 内核为所有打开文件维持一张文件表。每个文件表项包含：</span><span style="line-height: normal; font-size: 10.5pt; ">(a)&nbsp;</span><span style="line-height: normal; font-size: 10.5pt; ">文件状态标志</span><span style="line-height: normal; font-size: 10.5pt; ">。</span><span style="line-height: normal; font-size: 10.5pt; ">(b)&nbsp;</span><span style="line-height: normal; font-size: 10.5pt; ">当前文件位移量。</span><span style="line-height: normal; font-size: 10.5pt; ">(c)&nbsp;</span><span style="line-height: normal; font-size: 10.5pt; ">指向该文件</span><span style="line-height: normal; font-size: 10.5pt; ">v</span><span style="line-height: normal; font-size: 10.5pt; ">节点表项的指针。</span></p><p class="p0" style="line-height: normal; margin-left: 49.6pt; text-indent: -28.35pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: normal; font-size: 10.5pt; ">&nbsp; &nbsp; &nbsp; c. 每个打开文件（或设备）都有一个</span><span style="line-height: normal; font-size: 10.5pt; ">v</span><span style="line-height: normal; font-size: 10.5pt; ">节点结构。</span><span style="line-height: normal; font-size: 10.5pt; ">是文件的重要信息部分。</span></p></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: normal; background-color: #ffffff; ">&nbsp; &nbsp; &nbsp; 下图表示以上三个数据结构的关系：<br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: normal; background-color: #ffffff; "><p class="p0" style="line-height: normal; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: normal; font-size: 10.5pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd1&nbsp;=&nbsp;open(pathname,&nbsp;oflags);</span></p><p class="p0" style="line-height: normal; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: normal; font-size: 10.5pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd2&nbsp;=&nbsp;dup(fd1);</span></p><p class="p0" style="line-height: normal; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: normal; font-size: 10.5pt; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd3&nbsp;=&nbsp;open(pathname,&nbsp;oflags);</span></p></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: normal; background-color: #ffffff; "><br /><br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: normal; background-color: #ffffff; "><p class="p0" style="line-height: normal; margin-bottom: 0pt; margin-top: 0pt; text-align: center; "><span style="line-height: normal; "><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/lammy/pic/item/6c44b412d586bde0c3fd7898.jpg" style="line-height: normal; "  alt="" /><br /></span></p><p class="p0" style="line-height: normal; margin-bottom: 0pt; margin-top: 0pt; text-align: center; "><span style="line-height: normal; font-size: 10.5pt; ">图一</span></p></span>&nbsp; &nbsp; &nbsp;&nbsp;<br /><br />&nbsp;dup/dup2<br /><span class="Apple-style-span" style="color: #3398cc; font-family: 'Times New Roman'; font-size: 13px; line-height: 20px; background-color: #ffffff; ">相信大部分在Unix/Linux下编程的程序员手头上都有《Unix环境高级编程》(APUE)这本超级经典巨著。作者在该书中讲解dup/dup2之前曾经讲过&#8220;文件共享&#8221;，这对理解dup/dup2还是很有帮助的。这里做简单摘录以备在后面的分析中使用：<br />Stevens said:<br />(1) 每个进程在进程表中都有一个记录项，每个记录项中有一张打开文件描述符表，可将视为一个矢量，每个描述符占用一项。与每个文件描述符相关联的是：<br />(a) 文件描述符标志。<br />(b) 指向一个文件表项的指针。<br />(2) 内核为所有打开文件维持一张文件表。每个文件表项包含：<br />(a) 文件状态标志(读、写、增写、同步、非阻塞等)。<br />(b) 当前文件位移量。<br />(c) 指向该文件v节点表项的指针。<br />图示：<br />文件描述符表<br />------------<br />fd0 0 | p0 -------------&gt; 文件表0 ---------&gt; vnode0<br />------------<br />fd1 1 | p1 -------------&gt; 文件表1 ---------&gt; vnode1<br />------------<br />fd2 2 | p2&nbsp;<br />------------<br />fd3 3 | p3&nbsp;<br />------------<br />... ...<br />... ...<br />------------<br /><br />一、单个进程内的dup和dup2<br />假设进程A拥有一个已打开的文件描述符fd3，它的状态如下：<br />进程A的文件描述符表(before dup2)<br />------------<br />fd0 0 | p0&nbsp;<br />------------<br />fd1 1 | p1 -------------&gt; 文件表1 ---------&gt; vnode1<br />------------<br />fd2 2 | p2&nbsp;<br />------------<br />fd3 3 | p3 -------------&gt; 文件表2 ---------&gt; vnode2<br />------------<br />... ...<br />... ...<br />------------<br /><br />经下面调用：<br />n_fd = dup2(fd3, STDOUT_FILENO);后进程状态如下：<br /><br />进程A的文件描述符表(after dup2)<br />------------<br />fd0 0 | p0&nbsp;<br />------------<br />n_fd 1 | p1 ------------<br />------------ \<br />fd2 2 | p2 \<br />------------ _\|<br />fd3 3 | p3 -------------&gt; 文件表2 ---------&gt; vnode2<br />------------<br />... ...<br />... ...<br />------------<br />解释如下：<br />n_fd = dup2(fd3, STDOUT_FILENO)表示n_fd与fd3共享一个文件表项(它们的文件表指针指向同一个文件表项)，n_fd在文件描述符表中的位置为 STDOUT_FILENO的位置，而原先的STDOUT_FILENO所指向的文件表项被关闭，我觉得上图应该很清晰的反映出这点。按照上面的解释我们 就可以解释CU中提出的一些问题：<br />(1) "dup2的第一个参数是不是必须为已打开的合法filedes？" -- 答案：必须。<br />(2) "dup2的第二个参数可以是任意合法范围的filedes值么？" -- 答案：可以，在Unix其取值区间为[0,255]。<br /><br />另外感觉理解dup2的一个好方法就是把fd看成一个结构体类型，就如上面图形中画的那样，我们不妨把之定义为：<br />struct fd_t {<br />int index;<br />filelistitem *ptr;<br />};<br />然后dup2匹配index，修改ptr，完成dup2操作。<br /><br />在学习dup2时总是碰到&#8220;重定向&#8221;一词，上图完成的就是一个&#8220;从标准输出到文件的重定向&#8221;，经过dup2后进程A的任何目标为STDOUT_FILENO的I/O操作如printf等，其数据都将流入fd3所对应的文件中。下面是一个例子程序：<br />#define TESTSTR "Hello dup2\n"<br />int main() {<br />int fd3;<br /><br />fd3 = open("testdup2.dat", 0666);<br />if (fd &lt; 0) {<br />printf("open error\n");<br />exit(-1);<br />}<br /><br />if (dup2(fd3, STDOUT_FILENO) &lt; 0) {&nbsp;<br />printf("err in dup2\n");<br />}<br />printf(TESTSTR);<br />return 0;<br />}<br />其结果就是你在testdup2.dat中看到"Hello dup2"。<br /><br />二、重定向后恢复<br />CU上有这样一个帖子，就是如何在重定向后再恢复原来的状态？首先大家都能想到要保存重定向前的文件描述符。那么如何来保存呢，象下面这样行么？<br />int s_fd = STDOUT_FILENO;<br />int n_fd = dup2(fd3, STDOUT_FILENO);<br />还是这样可以呢？<br />int s_fd = dup(STDOUT_FILENO);<br />int n_fd = dup2(fd3, STDOUT_FILENO);<br />这两种方法的区别到底在哪呢？答案是第二种方案才是正确的，分析如下：按照第一种方法，我们仅仅在"表面上"保存了相当于fd_t（按照我前面说的理解方 法）中的index，而在调用dup2之后，ptr所指向的文件表项由于计数值已为零而被关闭了，我们如果再调用dup2(s_fd, fd3)就会出错(出错原因上面有解释)。而第二种方法我们首先做一下复制，复制后的状态如下图所示:<br />进程A的文件描述符表(after dup)<br />------------<br />fd0 0 | p0&nbsp;<br />------------<br />fd1 1 | p1 -------------&gt; 文件表1 ---------&gt; vnode1<br />------------ /|<br />fd2 2 | p2 /<br />------------ /<br />fd3 3 | p3 -------------&gt; 文件表2 ---------&gt; vnode2<br />------------ /<br />s_fd 4 | p4 ------/&nbsp;<br />------------<br />... ...<br />... ...<br />------------<br /><br />调用dup2后状态为：<br />进程A的文件描述符表(after dup2)<br />------------<br />fd0 0 | p0&nbsp;<br />------------<br />n_fd 1 | p1 ------------<br />------------ \<br />fd2 2 | p2 \<br />------------ _\|<br />fd3 3 | p3 -------------&gt; 文件表2 ---------&gt; vnode2<br />------------<br />s_fd 4 | p4 -------------&gt;文件表1 ---------&gt; vnode1&nbsp;<br />------------<br />... ...<br />... ...<br />------------<br />dup(fd)的语意是返回的新的文件描述符与fd共享一个文件表项。就如after dup图中的s_fd和fd1共享文件表1一样。<br /><br />确定第二个方案后重定向后的恢复就很容易了，只需调用dup2(s_fd, n_fd);即可。下面是一个完整的例子程序：<br />#define TESTSTR "Hello dup2\n"<br />#define SIZEOFTESTSTR 11<br /><br />int main() {<br />int fd3;<br />int s_fd;<br />int n_fd;<br /><br />fd3 = open("testdup2.dat", 0666);<br />if (fd3 &lt; 0) {<br />printf("open error\n");<br />exit(-1);<br />}<br /><br />/* 复制标准输出描述符 */<br />s_fd = dup(STDOUT_FILENO);<br />if (s_fd &lt; 0) {<br />printf("err in dup\n");<br />}<br /><br />/* 重定向标准输出到文件 */<br />n_fd = dup2(fd3, STDOUT_FILENO);<br />if (n_fd &lt; 0) {<br />printf("err in dup2\n");<br />}<br />write(STDOUT_FILENO, TESTSTR, SIZEOFTESTSTR); /* 写入testdup2.dat中 */<br /><br />/* 重定向恢复标准输出 */<br />if (dup2(s_fd, n_fd) &lt; 0) {<br />printf("err in dup2\n");<br />}<br />write(STDOUT_FILENO, TESTSTR, SIZEOFTESTSTR); /* 输出到屏幕上 */<br />return 0;<br />}<br />注意这里我在输出数据的时候我是用了不带缓冲的write库函数，如果使用带缓冲区的printf，则最终结果为屏幕上输出两行"Hello dup2"，而文件testdup2.dat中为空，原因就是缓冲区作怪，由于最终的目标是屏幕，所以程序最后将缓冲区的内容都输出到屏幕。<br /><br /><br />三、父子进程间的dup/dup2<br />由fork调用得到的子进程和父进程的相同文件描述符共享同一文件表项，如下图所示：<br />父进程A的文件描述符表<br />------------<br />fd0 0 | p0&nbsp;<br />------------<br />fd1 1 | p1 -------------&gt; 文件表1 ---------&gt; vnode1<br />------------ /|\<br />fd2 2 | p2 |<br />------------ |<br />|<br />子进程B的文件描述符表 |<br />------------ |<br />fd0 0 | p0 |<br />------------ |<br />fd1 1 | p1 ---------------------|<br />------------<br />fd2 2 | p2&nbsp;<br />------------<br />所以恰当的利用dup2和dup可以在父子进程之间建立一条&#8220;沟通的桥梁&#8221;。这里不详述。<br /><br />四、小结<br />灵活的利用dup/dup2可以给你带来很多强大的功能，花了一些时间总结出上面那么多，不知道自己理解的是否透彻，只能在以后的实践中慢慢探索了。<br /></span><br /><br />转载:&nbsp;<a href="http://blog.21ic.com/user1/6406/archives/2011/81684.html">http://blog.21ic.com/user1/6406/archives/2011/81684.html</a><br /><br /><br /> &nbsp; &nbsp; &nbsp; &nbsp;<img src ="http://www.cppblog.com/Joe/aggbug/157799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-10-08 15:57 <a href="http://www.cppblog.com/Joe/archive/2011/10/08/157799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2011知识点 - overload与override</title><link>http://www.cppblog.com/Joe/archive/2011/10/07/157709.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Fri, 07 Oct 2011 11:11:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/10/07/157709.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/157709.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/10/07/157709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/157709.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/157709.html</trackback:ping><description><![CDATA[override: 覆盖、重写<br />overload: 重载<br /><br /><span class="Apple-style-span" style="font-family: verdana; line-height: 22px; background-color: #ffffff; "><font size="3"><font color="#000000"><span style="font-family: 宋体; ">虚函数总是在派生类中被改写，这种改写被称为</span><span lang="EN-US">&#8220;override&#8221;</span><span style="font-family: 宋体; ">。我经常混淆</span><span lang="EN-US">&#8220;overload&#8221;</span><span style="font-family: 宋体; ">和</span><span lang="EN-US">&#8220;override&#8221;</span><span style="font-family: 宋体; ">这两个单词。澄清一下：</span></font></font><span lang="EN-US"><br /><font size="3"><font color="#000000"><br />override</font></font></span><font size="3"><font color="#000000"><span style="font-family: 宋体; ">是指派生类重写基类的虚函数，就象我们前面</span><span lang="EN-US">B</span><span style="font-family: 宋体; ">类中重写了</span><span lang="EN-US">A</span><span style="font-family: 宋体; ">类中的</span><span lang="EN-US">foo()</span><span style="font-family: 宋体; ">函数。重写的函数必须有一致的参数表和返回值（</span><span lang="EN-US">C++</span><span style="font-family: 宋体; ">标准允许返回值不同的情况，这个我会在</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体; ">语法</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体; ">部分简单介绍，但是很少编译器支持这个</span><span lang="EN-US">feature</span><span style="font-family: 宋体; ">）。这个单词好象一直没有什么合适的中文词汇来对应，有人译为</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体; ">覆盖</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体; ">，还贴切一些。</span></font></font><font size="3"><font color="#000000"><span lang="EN-US">&nbsp;<br /><br />overload</span><span style="font-family: 宋体; ">约定成俗的被翻译为</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体; ">重载</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体; ">。是指编写一个与已有函数同名但是参数表不同的函数。例如一个函数即可以接受整型数作为参数，也可以接受浮点数作为参数。</span></font></font></span><br /><br /><img src ="http://www.cppblog.com/Joe/aggbug/157709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-10-07 19:11 <a href="http://www.cppblog.com/Joe/archive/2011/10/07/157709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2011知识点 - 构造函数可以为虚函数吗</title><link>http://www.cppblog.com/Joe/archive/2011/10/07/157708.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Fri, 07 Oct 2011 11:06:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/10/07/157708.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/157708.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/10/07/157708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/157708.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/157708.html</trackback:ping><description><![CDATA[答案是：不可以<br />原因：<br />概念上，<span class="Apple-style-span" style="font-family: Arial; line-height: 24px; white-space: pre-wrap; background-color: #ffffff; ">虚函数的意图是动态绑定，程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时候，这个对象的动态类型还不完整(可以是基类，也可以是子类)，没有办法确定它到底是什么类型，故构造函数不能动态绑定。<br /><br />实现上，<span style="font-family: 宋体; font-size: 14px; line-height: 16px; background-color: #e8f7e6; ">vptr是构造函数设置的。通过vptr才能找到虚函数。<br />如果构造函数为虚函数，通过构造函数设置的vptr才能找到构造函数，然后调用它设置vptr，这是不可能实现的。&nbsp;<br /><br /><br /></span><br />参考:<br /><div><a href="http://bbs.seu.edu.cn/wForum/disparticle.php?boardName=C_CPlusPlus&amp;ID=17648">http://bbs.seu.edu.cn/wForum/disparticle.php?boardName=C_CPlusPlus&amp;ID=17648</a></div><div><a href="http://www.cppblog.com/guevara/articles/77360.html">http://www.cppblog.com/guevara/articles/77360.html</a></div></span><img src ="http://www.cppblog.com/Joe/aggbug/157708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-10-07 19:06 <a href="http://www.cppblog.com/Joe/archive/2011/10/07/157708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2011知识点 - 优先级反转</title><link>http://www.cppblog.com/Joe/archive/2011/09/25/156727.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sat, 24 Sep 2011 16:33:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/09/25/156727.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/156727.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/09/25/156727.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/156727.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/156727.html</trackback:ping><description><![CDATA[前两天Marvell面试，被问到优先级反转是什么东东，无奈只能表示不会，还好面试官非常地NICE，很耐心地告诉我这是什么，还聊起NASA的火星探测器就因为优先级反转的原因出现过BUG， 我就一直点头，还说回来会GOOGLE学习下<br /><br /><span class="Apple-style-span" style="color: #555555; font-family: Verdana, 'Lucida Grande', Verdana, Helvetica, sans-serif; font-size: 13px; line-height: 20px; background-color: #ffffff; "><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; ">Priority Inversion 优先级反转是嵌入式实时系统里面的一个经典的问题。简单描述一下这个问题：有三个优先级不同的task,A,B,C; A的优先级最高，B次之，C最低。其中A和C有共享的临界区。如果C已进入临界区，那么A在进入进入临界区之前，就会被阻塞。task B有可能打断C而进入运行状态，这样C什么时候从临界区退出，就是一个未知的时间。A只有C从临界区退出后才能被调度，A被阻塞的时间也是未知的。这样，低优先级的B先于高优先级的A被调度，优先级发生了逆转。<br />这个问题在一般的操作系统里面不是一个严重的问题，最多A被多阻塞了一段时间。但是，在实时系统里面，如果一个任务在规定的时间里面没有被调度运行，系统就相当于失败了，可能引发系统崩溃。<br />解决这个问题有两种手段：<br />1：Priority inheritance(优先级继承)，如果一个高优先级的task被阻塞，与它共享临界区的低优先级的task在进入临界区后，优先级就会继承高优先级task的优先级，保证它不会被其他优先级次高的任务打断。从临界区退出后，C的优先级恢复正常。<br />2：A priority ceiling（最高优先级），给临界区分配最高优先级，如果一个task进入临界区，就把临界区的优先级赋给它，已保证它不会被打断。从临界区退出后，task的优先级恢复正常。</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; ">实时操作系统的一个特点就是，一个实时任务，会在规定的时间内得到响应，并且在规定的时间内完成任务。所以，一切不可预知的动作都是有害的。</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; ">有兴趣可以看看下面两个链接：<br /><a href="http://en.wikipedia.org/wiki/Priority_inversion" title="http://en.wikipedia.org/wiki/Priority_inversion" rel="nofollow" style="color: #467aa7; font-style: normal; text-decoration: none; ">http://en.wikipedia.org/wiki/Priority_inversion</a><br /><a href="http://www.embedded.com/story/OEG20020321S0023" title="http://www.embedded.com/story/OEG20020321S0023" rel="nofollow" style="color: #467aa7; font-style: normal; text-decoration: none; ">http://www.embedded.com/story/OEG20020321S0023</a></p></span><br /><br /><br />来源:&nbsp;<a href="http://www.kernelchina.org/node/210">http://www.kernelchina.org/node/210</a><img src ="http://www.cppblog.com/Joe/aggbug/156727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-09-25 00:33 <a href="http://www.cppblog.com/Joe/archive/2011/09/25/156727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2011推理题 - 两个鸡蛋[zz]</title><link>http://www.cppblog.com/Joe/archive/2011/09/25/156726.html</link><dc:creator>simplyzhao</dc:creator><author>simplyzhao</author><pubDate>Sat, 24 Sep 2011 16:13:00 GMT</pubDate><guid>http://www.cppblog.com/Joe/archive/2011/09/25/156726.html</guid><wfw:comment>http://www.cppblog.com/Joe/comments/156726.html</wfw:comment><comments>http://www.cppblog.com/Joe/archive/2011/09/25/156726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Joe/comments/commentRss/156726.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Joe/services/trackbacks/156726.html</trackback:ping><description><![CDATA[<span style="font-family: 'ms shell dlg'; font-size: 14px; line-height: 28px; "><h2><a id="ctl02_TitleUrl" href="http://www.cnblogs.com/Jason_Yao/articles/1425904.html" style="color: #2e9ce9; text-decoration: none; font-size: 14px; ">2 Egg Problem</a></h2><div id="cnblogs_post_body" style="word-wrap: break-word; "><p style="word-wrap: break-word; ">&nbsp;继续我们的推理问题之旅，今天我们要对付的是一个Google的面试题：Two Egg Problem.</p><p style="word-wrap: break-word; ">我们开始吧！&nbsp;</p><p style="word-wrap: break-word; "><span style="font-size: 12pt; line-height: 27px; font-family: 'Times New Roman'; "><strong>No.2 &nbsp;Google Interview Puzzle : 2 Egg Problem</strong></span></p><p style="word-wrap: break-word; margin-left: 21pt; font-size: 13px; line-height: 19px; "><span style="color: #666666; font-family: Verdana; ">* You are given 2 eggs.</span></p><p style="word-wrap: break-word; margin-left: 21pt; font-size: 13px; line-height: 19px; "><span style="color: #666666; font-family: Verdana; ">* You have access to a 100-storey building.</span></p><p style="word-wrap: break-word; margin-left: 21pt; font-size: 13px; line-height: 19px; "><span style="color: #666666; font-family: Verdana; ">* Eggs can be very hard or very fragile means it may break if dropped from the first floor or may not even break if dropped from 100<sup>th</sup>&nbsp;floor. Both eggs are identical.</span></p><p style="word-wrap: break-word; margin-left: 21pt; font-size: 13px; line-height: 19px; "><span style="color: #666666; font-family: Verdana; ">* You need to figure out the highest floor of a 100-storey building an egg can be dropped without breaking.</span></p><p style="word-wrap: break-word; margin-left: 21pt; font-size: 13px; line-height: 19px; "></p><p style="word-wrap: break-word; margin-left: 21pt; text-indent: 5.25pt; font-size: 13px; line-height: 19px; "><span style="color: #666666; font-family: Verdana; ">Now the question is how many drops you need to make. You are allowed to break 2 eggs in the process</span></p><p style="word-wrap: break-word; margin-left: 21pt; text-indent: 5.25pt; font-size: 13px; line-height: 19px; ">&nbsp;</p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-family: 宋体; "><strong>分析与解答：</strong></span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span>&nbsp;&nbsp;&nbsp;</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">题目要求试的最大次数最小。首先，讨论两个比较</span>trivial<span style="font-family: 宋体; ">的方案。</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; ">&nbsp;</p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-family: 宋体; ">&nbsp;&nbsp; 方案</span>1<span style="font-family: 宋体; ">：从第一层开始扔鸡蛋，如果鸡蛋不碎，则上一层再扔。这样，如果鸡蛋在某一层碎的话，该层就是临界的层。这种方案的优点在于省鸡蛋，只会摔破一个鸡蛋。还有一个鸡蛋可以带回家，做个鸡蛋羹，补充营养个</span>!<span>&nbsp;&nbsp;:)&nbsp;</span><span style="font-family: 宋体; ">缺点就是，如果鸡蛋在</span>100<span style="font-family: 宋体; ">层才碎的话，那就要试</span>100<span style="font-family: 宋体; ">次啦。那你等电梯要等死啦，而且还要接受别人的打量的目光，心说这怪咖为什么每次都只坐一层楼啊&#8230;</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; ">&nbsp;</p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-family: 宋体; ">&nbsp; 方案</span>2<span style="font-family: 宋体; ">：</span>&nbsp;<span style="font-family: 宋体; ">想必很多人都会想到这个方案。我只能说，这是中国计算机教育的成功啊。这就是&#8220;二分查找法&#8221;。首先在第</span>50<span style="font-family: 宋体; ">层楼扔鸡蛋，如果鸡蛋不碎的话，就去</span>75<span style="font-family: 宋体; ">楼。如果碎了的话，那么对不起，同志。由于你只剩一个鸡蛋了，所以你得小心地从第一层开始，这样才能保证你在鸡蛋碎完的时候能找到临界楼层。这种方法的优势在于，如果你知道你的鸡蛋比较硬的话，你就采用这个方法吧。临界楼层越高，这个方法尝试的次数越小。但这种优势是用临界楼层比较小时比较大的尝试次数为代价获得的。我们看到，如果临界层数在</span>49<span style="font-family: 宋体; ">层的话，我们要尝试</span>50<span style="font-family: 宋体; ">次，而临界层数为</span>100<span style="font-family: 宋体; ">层的时候，尝试次数只有</span>7<span style="font-family: 宋体; ">次。但是，现在的问题是，全部情况下的最大尝试次数最小。这样，虽然在某些情况下，这种方法的性能很好。但是就最差情况而言，还是要尝试</span>50<span style="font-family: 宋体; ">次，好像还是有点大。这边，我们想起来，&#8220;二分查找法&#8221;的目标是平均性能最佳，并不是最差性能最佳。我们似乎走错了路！！！不过，方案二相比方案一来讲还是有进步的。</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; ">&nbsp;</p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span>&nbsp;&nbsp;</span><span style="font-family: 宋体; ">方案</span>2<span style="font-family: 宋体; ">似乎陷入了&#8220;短板效应&#8221;的泥沼，由于最坏情况下的坏性能制约了总体性能的提高。解决这个问题的总的原则应是：&#8220;一碗水端平&#8221;，尽量做到各种情况下的尝试次数尽量差不多。这正应合</span>GOOGLE<span style="font-family: 宋体; ">的信条</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">Don't be evil</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">，不以别的情况为代价换取另一些情况的指标的提高。做到&#8220;不伤害&#8221;</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">.(</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">呵呵，这是我瞎联想的</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">)</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">。那么，就照着这条路走吧，我假设每种情况下最大的尝试次数为</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">x.</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: Verdana; ">&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">则第一次扔蛋的楼层应为</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">x;</span></p><p style="word-wrap: break-word; text-indent: 21pt; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">第二次扔蛋的楼层应为</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">&nbsp;x+(x-1);</span></p><p style="word-wrap: break-word; text-indent: 21pt; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">&#8230;</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: Verdana; ">&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">依次类推。</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: Verdana; ">&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">从上面看到，每次我们增加的楼层都是前一次减</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">1.</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">我们所要保证的就是应该在增加的层数变成</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">0</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">之前到顶楼，所以有：</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: Verdana; ">&nbsp;&nbsp;&nbsp;x+(x-1)+</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">&#8230;</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">+1</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">&#8805;</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">100</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: Verdana; ">&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">这是一个等差数列，整理后有：</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: Verdana; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x<sup>2</sup>+x-200</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">&#8805;</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">0</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">发现</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">x</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">&#8805;</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">14</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">。</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; ">&nbsp;</p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">我们总结一下：</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: Verdana; ">&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">第一次在</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">14</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">楼扔，如果碎了的话从一楼再开始扔；</span></p><p style="word-wrap: break-word; text-indent: 10pt; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">否则在</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">14+13=27</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">层扔，如果碎了的话从</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">15</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">层开始扔；</span></p><p style="word-wrap: break-word; text-indent: 10pt; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">否则在</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">27+12=39</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">层扔，如果碎了的话从</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">28</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">层开始扔；</span></p><p style="word-wrap: break-word; text-indent: 10pt; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">&#8230;&#8230;</span></p><p style="word-wrap: break-word; text-indent: 10pt; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">这样，最大尝试次数为</span><span style="font-size: 10pt; color: black; font-family: Verdana; ">14</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">次就行了。不信你试试。</span></p><p style="word-wrap: break-word; text-indent: 10pt; font-size: 13px; line-height: 19px; ">&nbsp;</p><p style="word-wrap: break-word; text-indent: 10pt; font-size: 13px; line-height: 19px; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">最后，为了体现严谨性，给出本题的模型：</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; ">&nbsp;</p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><strong><span style="font-size: 12pt; font-family: 宋体; ">转移方程：</span></strong><strong></strong></p><p style="word-wrap: break-word; text-indent: 10.5pt; font-size: 13px; line-height: 19px; ">minNum[n ] = min(1 + max(i &#8211; 1, minNum[n-i]))&nbsp;<span style="font-family: 宋体; ">，</span>for 1<span style="font-family: 宋体; ">&#8804;</span>i&nbsp;<span style="font-family: 宋体; ">&#8804;</span>n</p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><strong><span style="font-size: 12pt; font-family: 宋体; ">边界条件:</span></strong></p><p style="word-wrap: break-word; text-indent: 15.75pt; font-size: 13px; line-height: 19px; ">minNum[0] = 0; minNum[1] = 1</p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-family: 宋体; ">这里，</span>n<span style="font-family: 宋体; ">为楼层数，</span>i<span style="font-family: 宋体; ">为起始楼层数。</span></p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; ">&nbsp;</p><p style="word-wrap: break-word; font-size: 13px; line-height: 19px; "><span style="font-family: 宋体; ">据说这是一个动态规划问题，我还没来得及仔细研究。其实，我的感觉是，很多理论最初的来源都是很朴素的真理，只是我们没学懂，所以把它们想复杂了。所以，很好的理论就这样不被大多数人所理解了。</span></p><p style="word-wrap: break-word; text-indent: 15.75pt; font-size: 13px; line-height: 19px; ">&nbsp;</p><p style="word-wrap: break-word; text-indent: 15.75pt; font-size: 13px; line-height: 19px; "><span style="font-family: 宋体; ">参考文献：</span></p><p style="word-wrap: break-word; margin-left: 33.75pt; text-indent: -18pt; font-size: 13px; line-height: 19px; "><span>1.<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><a href="http://blog.csdn.net/TravelInHistory/archive/2006/12/07/1434098.aspx" style="color: #2e9ce9; text-decoration: none; ">http://blog.csdn.net/TravelInHistory/archive/2006/12/07/1434098.aspx</a></p><p style="word-wrap: break-word; margin-left: 33.75pt; text-indent: -18pt; font-size: 13px; line-height: 19px; "><span>2.<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><a href="http://classic-puzzles.blogspot.com/2006/12/google-interview-puzzle-2-egg-problem.html" style="color: #2e9ce9; text-decoration: none; ">http://classic-puzzles.blogspot.com/2006/12/google-interview-puzzle-2-egg-problem.html</a></p></div></span><img src ="http://www.cppblog.com/Joe/aggbug/156726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Joe/" target="_blank">simplyzhao</a> 2011-09-25 00:13 <a href="http://www.cppblog.com/Joe/archive/2011/09/25/156726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>