﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-一个能思想的人，才真是一个力量无边的人。 —— 巴尔扎克 </title><link>http://www.cppblog.com/IronOxide/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 01:18:15 GMT</lastBuildDate><pubDate>Fri, 17 Apr 2026 01:18:15 GMT</pubDate><ttl>60</ttl><item><title>你第一要做的是开始去做</title><link>http://www.cppblog.com/IronOxide/archive/2012/11/22/195578.html</link><dc:creator>IronOxide</dc:creator><author>IronOxide</author><pubDate>Thu, 22 Nov 2012 14:04:00 GMT</pubDate><guid>http://www.cppblog.com/IronOxide/archive/2012/11/22/195578.html</guid><wfw:comment>http://www.cppblog.com/IronOxide/comments/195578.html</wfw:comment><comments>http://www.cppblog.com/IronOxide/archive/2012/11/22/195578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IronOxide/comments/commentRss/195578.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IronOxide/services/trackbacks/195578.html</trackback:ping><description><![CDATA[转载自外刊IT评论网 
<div class="entry-content">
<p>很多人都问我，&#8220;我想做web设计，如何入手？&#8221;或&#8220;我要开发web应用程序，需要学哪些技术？&#8221;，当然，推荐他们一摞书籍或十几篇关于55条超越竞争对手115%的技巧文章是最简单的，但问题的实际情况是，如果你想开始做某件事，你并不需要先去学会什么新知识。对你来说，最重要的却是立即着手去做。<br /><span id="more-784"></span><br />行动起来，着手去做。如果你想学web设计，那就去做个网站。如果你想成为企业家、在网上买你的产品，那就去做个电子商务应用程序。也许你现在还不具备这些开发技能，但何必为这些担心？<span style="color: red"><strong>也许你根本不知道你究竟缺少哪些技能呢。</strong></span></p>
<h3>从你能做的开始做</h3>
<p>如果你想在web上做点什么，不要担心着需要去学HTML，CSS，Ruby，PHP，SQL等知识。它们对于完成一个最终的产品是必要的，但开始时你并不需要它们。你可以在Keynote或Powerpoint里把你的想法的物理模型模拟出来。用方框把一个个表单域表示出来，标上说明，把一个个页面用线关联起来。你可以利用现有的软件知识制作出一个非常健壮的用户界面交互原型。根本没有任何计算机知识？那就用你的铅笔和纸和便利贴。画出一个个屏幕样式，把它们贴在墙上，试试各个界面的流程。</p>
<blockquote class="pullquote">
<p>你也许甚至连需要什么技能都不知道，所以就不要忧虑这些了。从你已经知道的着手。</p></blockquote>
<p>你可以用草图或幻灯片做很多事情。你可以看到你的想法形象化了，这样可以去评价它是否是一个真正具有价值的东西。到了这一步，你才可以进行下一步，去学习些HTML知识，把你的原型在浏览器里实现。此时，你要尽可能的发挥你所具有的知识和工具，把事情做的最好。</p>
<h3>防止不自信</h3>
<p>很多时候我们不能开始做事、无可作为的原因是缺少技术、资源、和工具。但这真正阻挡我们的却是自我挑剔和找借口。在<a href="http://en.wikipedia.org/wiki/Drawing_on_the_Right_Side_of_the_Brain"><em>Drawing on the Right Side of the Brain</em></a>这本优秀的书中，作者贝蒂&#183;爱德华讨论了为什么当还是孩子时喜欢写写画画而到了青春期大部分人都停止了开发这种能力。</p>
<blockquote>
<p>&#8220;跟据很多成人的绘画技能来看，进入青春期标志着人们在艺术才能方面发展的突然中止。作为孩子，他们面临一个艺术危机，面临着他们对周围这世界日益增长的复杂的意识和自身艺术技能水平的冲突。&#8221;</p></blockquote>
<p>孩子们的自我批判意识会逐渐增强，他们同样喜欢绘画，但当他们意识到画不好时，就完全放弃了绘画。</p>
<p>这种感觉会持续到成年。我们想起设计一个网站，或去开发一个应用程序时，如果我们拥有的资源和工具达不到我们预设的要求和水平，我们永远不会开始去做。即使互联网让我们看到了那些无数的伟大作品、天才个人和优秀的操作过程作为样板，也无济于事。人们很容易跟那些最好的比较起来发现自己的各种不充分和缺失，但从来没想过，任何人都不是天生都拥有这些技能的，如果他们不从开始做起，永远也走不到这一天。</p>
<h3>去干&#8212;&#8212;无须试</h3>
<p>成功的人会找到一种方法让自己坚持做下去&#8212;&#8212;尽管疑虑不满。艺术家文森特&#183;梵高，只是在他的人生的后十年才称得上是艺术家。我们都因他的伟大艺术作品而认识他，但他并非一开始就是大师。对比一下<em>Drawing on the Right Side of the Brain</em>这本书里提供的两幅画，一副是其早期的作品，一副是两年后的作品：</p>
<div style="width: 540px" id="attachment_785" class="wp-caption alignnone"><img class="size-full wp-image-785 " title="文森特&#183;梵高" alt="文森特&#183;梵高" src="http://wkee.net/qee/wordpress/wp-content/uploads/2010/09/453-van_gogh.jpg" width="530" height="361" /> 
<p class="wp-caption-text">文森特&#183;梵高 木匠， 1880 和 Woman Mourning, 1882</p></div>
<p>他不是什么神童（27岁才开始学画），他通过艰苦努力练就了一身技艺。如果当他感觉到技术水平比不上保罗&#183;高更时，他屈服了自己的疑虑和绝望，他很有可能就放弃了自己的前程。</p>
<p>所有的这些，都是想说一个道理，<span style="color: red"><strong>有很多本来该成的事情因为我们没有去做而没有成</strong></span>。如果是由于认为你自己不够好，不具备技能、知识、经验，而放弃追逐自己的梦想，那简直就是浪费。事实上，事情中存在问题正是一种驱动和鞭策。它会给你巨大的挑战同时巨大的回报。为什么要不厌其烦的做那些已经做过一百遍的事情呢，你已经从中学不到什么了。<span style="color: red"><strong>不要再担心为了完成一个任务你需要知道哪些东西，你已经拥有了开始去做所需要的任何东西了。</strong></span></p></div><img src ="http://www.cppblog.com/IronOxide/aggbug/195578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IronOxide/" target="_blank">IronOxide</a> 2012-11-22 22:04 <a href="http://www.cppblog.com/IronOxide/archive/2012/11/22/195578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>For God's sake, follow your dreams</title><link>http://www.cppblog.com/IronOxide/archive/2012/11/17/195307.html</link><dc:creator>IronOxide</dc:creator><author>IronOxide</author><pubDate>Sat, 17 Nov 2012 12:45:00 GMT</pubDate><guid>http://www.cppblog.com/IronOxide/archive/2012/11/17/195307.html</guid><wfw:comment>http://www.cppblog.com/IronOxide/comments/195307.html</wfw:comment><comments>http://www.cppblog.com/IronOxide/archive/2012/11/17/195307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IronOxide/comments/commentRss/195307.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IronOxide/services/trackbacks/195307.html</trackback:ping><description><![CDATA[<div><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; ">转载自：<a href="http://www.aqee.net/for-gods-sake-follow-your-dreams/">http://www.aqee.net/for-gods-sake-follow-your-dreams/</a><br />周末的时候我正准备和几个朋友打游戏，热身的过程中同一个不是很熟的队员发生了一次有趣的谈话。</p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; ">&#8220;你是做什么的？&#8221;他问我。&#8220;哦，我给自己干，我有一个软件公司&#8221;，我回答。&#8220;真的吗！真令人羡慕！我在XXX公司工作，但我一直有个愿望去做动画设计，做独立职业人。这是我的梦想。可我现在陷入了这个错误的行业中了。&#8221;</p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; ">&#8220;你还活着，不是吗？&#8221;我尽量小声的对他说。他继续说：&#8220;你不知道，我已经想这一天等了10年了，可一旦你有了家庭，你很难在干其它的事情了.&#8221;<br /><br /><br />我实在是按耐不住，于是就对他说：&#8220;那好，如果你是真的这样想，你也许应该报个动画设计培训班，或者你也可以在家里自学呀。只要你下定决心开始做。&#8221;我得到这样一句轻轻的回复：&#8220;嗨，这太难了，有了家庭，全职工作，没有时间。我很想这样做，但却不行。&#8221;</p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; ">很无奈，我建议道：&#8220;你也许可以考虑几周或几个月的脱产培训，或者干脆辞职。&#8221;他看了看我，好像我是要砍掉他的右手。&#8220;你疯了吗？那我的收入从哪里来？&#8221;</p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; ">我开始明白，如果谈话继续下去的话，我会和这个还不是很熟的人在第一次见面就会争吵起来，我选择只是笑了一下，就走开了。但这事让我有所思考。<span style="color: red; "><strong>为什么人们不愿意冒一点风险去追逐自己的梦想？是他们的梦想不值得这样做吗？如果不是，为什么我们要对这样的人恨恨不已呢？我们是否愧对自己没有给梦想一次公平的机会呢？</strong></span></p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; ">现在，我明白了，并不是每个人都愿意把全部的时间都投入到实现梦想中。但我们也不该因此就从来不向我们梦想的前方迈出一步。<span style="color: red; "><strong>我的意思是，就像小孩学走路的第一步，如果你不能破釜沉舟，那也不能就此把梦想扼杀掉呀。</strong></span></p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; "><span style="color: red; "><strong>当还是小孩子的时候，我们都有过疯狂的主意和梦想。当人们问起 &#8211; &#8220;你长大后想干什么？&#8221;时，你不会说&#8220;我想做一份稳定的工作，我想在一家财富100强的公司里当总经理&#8221;或者&#8220;我想在政府部门里找个铁饭碗&#8221;。你希望去做一些能让你兴奋的事情，你有热情的事情 &#8211; &#8220;军人，科学家，音乐家，舞蹈家，世界小姐&#8221;等等。你根本不会考虑能从中获取多少钱，你只是想去做这些。</strong></span></p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; "><span style="color: red; "><strong>可是为什么长大后我们就失去了所有的热情、动力、愿望以及守住我们的梦想的力量了呢？为什么金钱就支配了我们的热情，大多数情况是扼杀了热情？为什么&#8220;一份稳定的收入&#8221;就能禁锢我们的梦想？为什么我们要停止思考我们的热爱的事情？</strong></span></p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; ">我们为什么会受这每月稳定工作收入的诱惑，以至于完全忽视了一个真相：追求自己的梦想永远不会太迟。我可以理解人们为什么会这样，人们是&#8220;害怕失败&#8221;。我们担心失败，这种担心导致了我们给自己编织了一个谎言：有些东西永远是不属于你的。&#8220;我没有时间，我有家庭，当我有了足够的钱后我会去做的，等等&#8221;，这些都是借口。这样我们就默认了丢掉梦想也没什么，不去做那些你热爱的事情也没什么，日复一日的做那些重复的枯燥的事情也没什么。</p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; ">就像Tony Robbins说的 &#8211; &#8220;<strong><span style="color: red; ">唯一你够阻挡你去获取你想要的东西的事情是你一直在告诉自己为什么它不属于你</span><span style="color: red; ">。&#8221;</span></strong></p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; ">我们在等待什么？当所有的星星都能按你希望的方向连成一线的时刻吗？这样就能保证你一定成功吗？这条路永远是不通的。这个光辉的时刻你永远等不到。形式环境永远都不会达到你的满意。永远都会有某方面的事情对你有所不利。你不得不横下一条心，冒一回险。一旦我们设立了一个目标，我们不可能等待各方面都完美的时机、各方面都如我所期待的那种情况。我们需要的是着手去做。我们可以在全职工作之余慢慢的进行。我很喜欢我现在所做的事情，而且我也是做完我的白天的正式工作后做这些的。这不容易，但很有意思，因为我正在实现我梦想的事情，我对我正在开发的软件充满热情。</p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; "><span style="color: red; "><strong>也许只有我是这样想的，也许我是个怪人。也许我很傻，但我宁愿犯傻，宁愿活在我的梦想里拼搏，也不要找出一堆的借口。金钱的利诱不会带来真正的成功，真正的成功来自于爱和热情。你必须爱你所做的事情，你必须对你所做的事有热情。</strong></span></p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; ">失败并不可怕。可怕的是当你60岁时回首往事才发现&#8220;也许我应该给自己一次实现梦想的机会，也许我会成功的，也许我应该守住梦想&#8221;。但此时已经太晚了。你也许正在走向这个结局。</p><p style="border: 0px; margin: 0px 0px 24px; padding: 0px; vertical-align: baseline; font-family: 微软雅黑, 'Microsoft YaHei'; font-size: 14px; line-height: 24px; "><span style="color: red; "><strong>不要害怕去实现自己的梦想。这将是你犯的最大的错误。</strong></span></p></div> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/IronOxide/aggbug/195307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IronOxide/" target="_blank">IronOxide</a> 2012-11-17 20:45 <a href="http://www.cppblog.com/IronOxide/archive/2012/11/17/195307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优秀程序员的十个习惯(摘) </title><link>http://www.cppblog.com/IronOxide/archive/2012/11/17/195288.html</link><dc:creator>IronOxide</dc:creator><author>IronOxide</author><pubDate>Fri, 16 Nov 2012 16:22:00 GMT</pubDate><guid>http://www.cppblog.com/IronOxide/archive/2012/11/17/195288.html</guid><wfw:comment>http://www.cppblog.com/IronOxide/comments/195288.html</wfw:comment><comments>http://www.cppblog.com/IronOxide/archive/2012/11/17/195288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IronOxide/comments/commentRss/195288.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IronOxide/services/trackbacks/195288.html</trackback:ping><description><![CDATA[<div>在这个世界上，有数百万的人热衷于软件开发，他们有很多名字，如：软件工程师（Software Engineer），程序员（Programmer），编码人（Coder），开发人员（Developer）。经过一段时间后，这些人能够成为一个优秀的编码人员，他们非常熟悉如何用计算机语言来完成自己的工作。但是，如果你要成为一个优秀的程序员，你还可以需要有几件事你需要注意，如果你能让下面十个条目成为你的习惯，那么你才能真正算得上是优秀程序员。</div><p>1.&nbsp;<strong>学无止境</strong>。就算是你有了10年以上的程序员经历，你也得要使劲地学习，因为你在计算机这个充满一创造力的领域，每天都会有很多很多的新事物出现。你需要跟上时代的步伐。你需要去了解新的程序语言，以及了解正在发展中的程序语言，以及一些编程框架。还需要去阅读一些业内的新闻，并到一些热门的社区去参与在线的讨论，这样你才能明白和了解整个软件开发的趋势。在国内，一些著名的社区例如：CSDN，ITPUB，CHINAUINX等等，在国外，建议你经常上一上digg.com去看看各种BLOG的聚合。</p><p>&nbsp;</p><p>2.&nbsp;<strong>掌握多种语言</strong>。程序语言总是有其最适合的领域。当你面对需要解决的问题时，你需要找到一个最适合的语言来解决这些问题。比如，如果你需要性能，可能C/C++是首选，如果你需要跨平台，可能Java是首选，如果你要写一个Web上的开发程序，那么 PHP，ASP，Ajax，JSP可能会是你的选择，如果你要处理一些文本并和别的应用交互，可能Perl, Python会是最好的。所以，花一些时间去探索一下其它你并熟悉的程序语言，能让你的眼界变宽，因为你被武装得更好，你思考问题也就更为全面，这对于自己和项目都会有好的帮助。</p><p>3.&nbsp;<strong>理性面对不同的操作系统或技术</strong>。程序员们总是有自己心目中无可比拟的技术和操作系统，有的人喜欢Ubuntu，有的人喜欢Debian，还有的人喜欢Windows，以及FreeBSD，MacOSX或Solaris等等。看看我的BLOG(<a href="http://blog.csdn.net/haoel">http://blog.csdn.net/haoel</a>)中的那篇《<a href="http://blog.csdn.net/haoel/archive/2007/03/19/1533720.aspx" target="_blank">其实Unix很简单</a>》后的回复你就知道程序员们在维护起自己的忠爱时的那份执着了。只有一部分优秀的程序员明白不同操作系统的优势和长处和短处，这样，在系统选型的时候，才能做到真正的客观和公正，而不会让情绪影响到自己。同样，语言也是一样，有太多的程序员总是喜欢纠缠于语言的对比，如：Java和Perl。哪个刚刚出道的程序员没有争论去类似的话题呢？比如VC++和Delphi等等。争论这些东西只能表明自己的肤浅和浮燥。优秀的程序并不会执着于这些，而是能够理性的分析和理心地面对，从而才能客观地做出正确的选择。</p><p>4.&nbsp;<strong>别把自己框在单一的开发环境中。</strong>&nbsp;再一次，正如上面所述，每个程序员都有自己忠爱的工具和技术，有的喜欢老的（比如我就喜欢Vi编辑程序），而有的喜欢新的比如gedit或是Emacs 等。有的喜欢使用像VC++一样的调试器，而我更喜欢GDB命令行方面的调式器。等等等等。程序员在使用什么样的工具上的争论还少吗？到处都是啊。使用什么样的工具本来无所谓，只要你能更好更快地达到你的目的。但是有一点是优秀程序员都应该了解的&#8212;&#8212;那就是应该去尝试一下别的工作环境。没有比较，你永远不知道谁好谁不好，你也永远不知道你所不知道的。</p><p>5.&nbsp;<strong>使用版本管理工具管理你的代码。</strong>千万不要告诉我你不知道源码的版本管理，如果你的团队开发的源代码并没有版本管理系统，那么我要告诉你，你的软件开发还处于石器时代。赶快使用一个版式本管理工具吧。CVS 是一个看上去平淡无奇的版本工具，但它是被使用最广的版本管理系统，Subversion 是CVS的一个升级版，其正在开始接管CVS的领地。Git 又是一个不同的版本管理工具。还有Visual SourceSafe等。使用什么样的版本管理工具依赖于你的团队的大小和地理分布，你也许正在使用最有效率或最没有效率的工具来管理你的源代码。但一个优秀的程序员总是会使用一款源码版本管理工具来管理自己的代码。如果你要我推荐一个，我推荐你使用开源的Subversion。</p><p>6.&nbsp;<strong>是一个优秀的团队成员。</strong>&nbsp;除非你喜欢独奏，除非你是孤胆英雄。但我想告诉你，今天，可能没有一个成熟的软件是你一个人能做的到的，你可能是你团队中最牛的大拿，但这并不意味着你就是好的团队成员。你的能力只有放到一个团队中才能施展开来。你在和你的团队成员交流中有礼貌吗？你是否经常和他们沟通，并且大家都喜欢和你在一起讨论问题？想一想一个足球队吧，你是这个队中好的成员吗？当别人看到你在场上的跑动，当别人看到你的传球和接球和抢断，能受到鼓舞吗？</p><p>7.&nbsp;<strong>把你的工作变成文档。</strong>&nbsp;这一条目当然包括了在代码中写注释，但那还仅仅不够，你还需要做得更多。有良好的注释风格的代码是一个文档的基础，他能够让你和你的团队容易的明白你的意图和想法。写下文档，并不仅仅是怕我们忘了当时的想法，而且还是一种团队的离线交流的方法，更是一种知识传递的方法。记录下你所知道的一切会是一个好的习惯。因为，我相信你不希望别人总是在你最忙的时候来打断你问问题，或是你在休假的时候接到公司的电话来询问你问题。而你自己如果老是守着自己的东西，其结果只可能是让你自己长时间地深陷在这块东西内，而你就更本不可以去做更多的事情。包括向上的晋升。你可能以为&#8220;教会徒弟能饿死师父&#8221;，但我告诉你，你的保守会让你失去更多更好的东西，请你相信我，我绝不是在这里耸人听闻。</p><p>8.&nbsp;<strong>注意备份和安全。</strong>&nbsp;可能你觉得这是一个&#8220;废话&#8221;，你已明白了备份的重要性。但是，我还是要在这里提出，丢失东西是我们人生中的一部份，你总是会丢东西，这点你永远无法避免。比如：你的笔记本电脑被人偷了，你的硬盘损坏了，你的电脑中病毒了，你的系统被人入侵了，甚至整个大楼被烧了，等等，等等。所以，做好备份工作是非常非常重要的事情，硬盘是不可信的，所以定期的刻录光盘或是磁带可能会是一个好的方法，网络也是不可信的，所以小心病毒和黑客，不但使用软件方面的安全策略，你更需要一个健全的管理制度。此外，尽量的让你的数据放在不同的地方，并做好定期（每日，每周，每月）的备份策略。</p><p>9.&nbsp;<strong>设计要足够灵活。</strong>&nbsp;可能你的需求只会要求你实现一个死的东西，但是，你作为一个优秀的程序，你应该随时在思考这个死的东西是否可以有灵活的一面，比如把一些参数变成可以配置的，把一些公用的东西形成你的函数库以便以后重用，是否提供插件方面的功能？你的模块是否要以像积木一样随意组合？如果要有修改的话，你的设计是否能够马上应付？当然，灵活的设计可能并不是要你去重新发明轮子，你应该尽可能是使用标准化的东西。所谓灵话的设计就是要让让考虑更多需求之外的东西，把需求中这一类的问题都考虑到，而不是只处理需求中所说的那一特定的东西。比如说，需要需要的屏幕分辨率是800&#215;600，那么你的设计能否灵活于其他的分辨率？程序设计总是需要我们去处理不同的环境，以及未来的趋势。我们需要用动态的眼光去思考问题，而不是刻舟求剑。也许有一天，你今天写的程序就要移植到别的环境中去，那个时候你就能真正明白什么是灵活的设计了。</p><p>10.&nbsp;<strong>不要搬起石头砸自己的脚。</strong>程序员总是有一种不好的习惯，那就是总是想赶快地完成自己手上的工作。但情况却往往事已愿违。越是想做得快，就越是容易出问题，越是想做得快，就越是容易遗漏问题，最终，程序改过来改过去，按下葫芦起了瓢，最后花费的时间和精力反而更多。欲速而不达。优秀程序员的习惯是前面多花一些时间多作一些调查，试验一下不网的解决方案，如果时间允许，一个好的习惯是，每4个小时的编程，需要一个小时的休息，然后又是4个小时的编码。当然，这因人而异，但其目的就是让你时常回头看看，让你想一想这样三个问题：1）是否这么做是对的？2）是否这么做考虑到了所有的情况？3）是否有更好的方法？想好了再说，时常回头看看走过的路，时常总结一下过去事，会对你有很大的帮助。</p><p>以上是十条优秀程序员的习惯或行为规范，希望其可以对你有所帮助。</p><p>本文来源于网上phil的BLOG，但我在写作过程中使用了自己的语言和方法重新描述了一下这十条，所以，我希望你在转载的时候能够注明作者和出处以表示对我的尊重。谢谢！</p> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/IronOxide/aggbug/195288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IronOxide/" target="_blank">IronOxide</a> 2012-11-17 00:22 <a href="http://www.cppblog.com/IronOxide/archive/2012/11/17/195288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux练级书单</title><link>http://www.cppblog.com/IronOxide/archive/2012/11/17/195287.html</link><dc:creator>IronOxide</dc:creator><author>IronOxide</author><pubDate>Fri, 16 Nov 2012 16:21:00 GMT</pubDate><guid>http://www.cppblog.com/IronOxide/archive/2012/11/17/195287.html</guid><wfw:comment>http://www.cppblog.com/IronOxide/comments/195287.html</wfw:comment><comments>http://www.cppblog.com/IronOxide/archive/2012/11/17/195287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IronOxide/comments/commentRss/195287.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IronOxide/services/trackbacks/195287.html</trackback:ping><description><![CDATA[本人是Linux方面的菜鸟。给自己弄了一套练级书单。按照书单顺序，每周最少读一章，最多读二章。并以blog文的形式总结一周所学，每周最少一篇，最多二篇。<br />坚持两年，望学有所成。共勉 。<br /><br />初级：管理<br />1.《鸟哥私房菜：初级篇》<br />2.《鸟哥私房菜：高级篇》<br /><br />中级：编程<br />3.《Linux程序设计》<br />4.《Unix环境高级编程》<br />5.《Unix网络编程卷1：套接字联网1》<br />6.《Unix网络编程卷2：进程间通信》<br /><br />高级：内核驱动<br />7.《嵌入式Linux基础教程》<br />8.《精通Linux设备驱动程序开发》<br />9.《深入理解计算机系统》<br />10.《深入Linux内核架构》<br /> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/IronOxide/aggbug/195287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IronOxide/" target="_blank">IronOxide</a> 2012-11-17 00:21 <a href="http://www.cppblog.com/IronOxide/archive/2012/11/17/195287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从第K元素看数据结构</title><link>http://www.cppblog.com/IronOxide/archive/2012/08/29/188669.html</link><dc:creator>IronOxide</dc:creator><author>IronOxide</author><pubDate>Wed, 29 Aug 2012 13:16:00 GMT</pubDate><guid>http://www.cppblog.com/IronOxide/archive/2012/08/29/188669.html</guid><wfw:comment>http://www.cppblog.com/IronOxide/comments/188669.html</wfw:comment><comments>http://www.cppblog.com/IronOxide/archive/2012/08/29/188669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IronOxide/comments/commentRss/188669.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IronOxide/services/trackbacks/188669.html</trackback:ping><description><![CDATA[<p align="left"><span style="font-family: 宋体"><strong>声明：本文涉及的源代码及文章请点击<a href="http://www.cppblog.com/Files/IronOxide/从第K小元素看数据结构.zip"><span style="color: #3366ff">这里</span></a>下载，本文版权归IronOxide所有。博客地址：<a href="http://www.cppblog.com/IronOxide/"><span style="color: #3366ff">http://www.cppblog.com/IronOxide/</span></a><br /></strong>这篇文章讨论的是序列中第</span>K<span style="font-family: 宋体">大或第</span>K<span style="font-family: 宋体">小元素，由于第</span>K<span style="font-family: 宋体">大元素可以转化为求第</span>N-K+1<span style="font-family: 宋体">小元素（</span>N<span style="font-family: 宋体">为序列的长度），所以，本文专注于讨论第</span>K<span style="font-family: 宋体">小元素。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">本文讨论的几个问题：</span></p>
<p style="text-indent: -18pt; margin-left: 39pt"><span>1.<span style="font: 7pt 'Times New Roman'"> </span></span><span style="font-family: 宋体">对给定整数序列，求该序列中第</span>K<span style="font-family: 宋体">小的元素。</span></p>
<p style="text-indent: -18pt; margin-left: 39pt"><span>2.<span style="font: 7pt 'Times New Roman'"> </span></span><span style="font-family: 宋体">对某一整数序列，允许动态更改序列中的数。动态查询序列中第</span>K<span style="font-family: 宋体">小元素。</span></p>
<p style="text-indent: -18pt; margin-left: 39pt"><span>3.<span style="font: 7pt 'Times New Roman'"> </span></span><span style="font-family: 宋体">给定一个整数序列和若干个区间，回答该区间内第</span>K<span style="font-family: 宋体">小元素。</span></p>
<p style="text-indent: -18pt; margin-left: 39pt"><span>4.<span style="font: 7pt 'Times New Roman'"> </span></span><span style="font-family: 宋体">对某一整数序列，允许动态更改序列中的数。动态查询序列中的第</span>K<span style="font-family: 宋体">小元素。</span></p>
<p><span style="font-family: 宋体">【关键字】</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">第</span>K<span style="font-family: 宋体">小元素</span><span> </span><span style="font-family: 宋体">树状数组</span><span> </span><span style="font-family: 宋体">线段树</span> <span style="font-family: 宋体">平衡二叉树</span> <span style="font-family: 宋体">归并树</span><span> </span><span style="font-family: 宋体">划分树</span> <span style="font-family: 宋体">单调队列</span> <span style="font-family: 宋体">堆</span> <span style="font-family: 宋体">块状表</span> </p>
<p style="text-indent: 21.75pt"></p>
<p align="center"><strong><span style="font-family: 宋体; font-size: 24pt">【问题一】</span></strong><strong></strong></p>
<p><span></span></p>
<p><span></span><strong><u><span style="font-family: 宋体">问题描述</span></u></strong><span style="font-family: 宋体">：</span></p>
<p><span></span><span style="font-family: 宋体">给出一个乱序整数序列</span>a[1&#8230;n] <span style="font-family: 宋体">，求该序列中的第</span>K<span style="font-family: 宋体">小元素。（</span>1&lt;=K&lt;=N<span style="font-family: 宋体">）。</span></p>
<p><span></span></p>
<p><span></span><strong><u><span style="font-family: 宋体">算法分析</span></u></strong><span style="font-family: 宋体">：</span></p>
<p><span></span><span style="font-family: 宋体">用基于快速排序的分治算法，期望复杂度为</span>O(N)<span style="font-family: 宋体">。</span> </p>
<p><span></span><strong><u><span style="font-family: 宋体">代码</span></u></strong><span style="font-family: 宋体">：</span><span> </p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;qs(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">a&nbsp;,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l&nbsp;,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r&nbsp;,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;k){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r)&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;a[l]&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&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;l&nbsp;,&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r&nbsp;,&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[(l</span><span style="color: #000000">+</span><span style="color: #000000">r)</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;,&nbsp;temp&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(a[i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;x)&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;i&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(a[j]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;x)&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;j&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;j){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[i]&nbsp;;&nbsp;&nbsp;a[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[j]&nbsp;,&nbsp;&nbsp;a[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;temp&nbsp;;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;;&nbsp;&nbsp;j</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">while</span><span style="color: #000000">(i</span><span style="color: #000000">&lt;=</span><span style="color: #000000">j)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(k&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;j)&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;qs(a&nbsp;,&nbsp;l&nbsp;,&nbsp;j&nbsp;,&nbsp;k);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(k&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;i)&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;qs(a&nbsp;,&nbsp;i&nbsp;,&nbsp;r&nbsp;,&nbsp;k);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;x&nbsp;;<br />}<br /></span></div>
<p></span>&nbsp;</p>
<p><strong><span></span></strong><strong><u><span style="font-family: 宋体"></p>
<p>练习</span></u></strong></p>
<p><span><a href="http://www.rqnoj.cn/Problem_350.html"><span style="color: #3366ff">RQNOJ 350</span></a> </span><span style="font-family: 宋体">这题数据量比较小</span>1&#8804;N&#8804;10000,1&#8804;M&#8804;2000 <span style="font-family: 宋体">。所以计算量不会超过</span>10^7<span style="font-family: 宋体">。当然用到后面的归并树或划分树，能将复杂度降低。</span></p>
<p>&nbsp;</p>
<p align="center"><span style="font-family: 宋体; font-size: 24pt">【问题二】</span></p>
<p><span></span><strong><u><span style="font-family: 宋体">问题描述</span></u></strong><span style="font-family: 宋体">：</span></p>
<p><span></span><span style="font-family: 宋体">给出一个乱序整数序列</span>a[1...n] <span style="font-family: 宋体">，有</span>3<span style="font-family: 宋体">种操作：</span></p>
<p style="text-indent: 21pt" align="left"><span style="font-family: 宋体">操作一：</span>ADD<span> NUM </span><span style="font-family: 宋体">往序列添加一个数</span>NUM<span style="font-family: 宋体">。</span><br /><span></span><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 操作二：</span>DEL<span> NUM </span><span style="font-family: 宋体">从序列中删除一个数</span>NUM<span style="font-family: 宋体">（若有多个，只删除一个）。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">操作三：</span>QUERY K<span> </span><span style="font-family: 宋体">询问当前序列中第</span>K<span style="font-family: 宋体">小的数。</span></p>
<p><span></span><span style="font-family: 宋体">输出每次询问的数。假设操作的次数为</span>M<span style="font-family: 宋体">。</span></p>
<p><span></span></p>
<p><span></span><strong><u><span style="font-family: 宋体">算法分析：</span></u></strong></p>
<p><span></span><span style="font-family: 宋体">这题实际上就是一边动态增删点，一边查询第</span>K<span style="font-family: 宋体">小数。这类题有两种思维方法：一是二分答案，对当前测试值</span>mid<span style="font-family: 宋体">，查询</span>mid<span style="font-family: 宋体">在当前序列中的排名</span>rank <span style="font-family: 宋体">，</span> <span style="font-family: 宋体">然后根据</span>rank<span style="font-family: 宋体">决定向左边还是右边继续二分。另一种是直接求第</span>K<span style="font-family: 宋体">小元素。</span></p>
<p><span></span><span style="font-family: 宋体">这个题可以用各种类型的数据结构解决，其时间复杂度和编程复杂度稍有区别：</span></p>
<p><span></span><strong><span style="font-family: 宋体">线段树：</span></strong><span style="font-family: 宋体">运用第一种思维，当添加（删除）一个数</span>x<span style="font-family: 宋体">时，相当于往线段树上添加（删除）一条</span>(x , maxlen)<span style="font-family: 宋体">（注意是闭区间）长度的线段。这样询问时，覆盖</span>[mid , mid]<span style="font-family: 宋体">区间的线段数就是比</span>mid<span style="font-family: 宋体">小的数，加上</span>1<span style="font-family: 宋体">就是</span>rank<span style="font-family: 宋体">。二分次数为</span>log(maxlen) <span style="font-family: 宋体">，查一次</span>mid<span style="font-family: 宋体">的</span>rank <span style="font-family: 宋体">，</span> <span style="font-family: 宋体">复杂度为</span>O(logN) <span style="font-family: 宋体">。所以总复杂度上界为</span>O(M*logN*logN) <span style="font-family: 宋体">。为方便比较，这里认为</span>log(maxlen)<span style="font-family: 宋体">等于</span>logN<span style="font-family: 宋体">。</span><strong></strong></p>
<p><strong><span></span></strong><strong><span style="font-family: 宋体">树状数组：</span></strong></p>
<p><strong><span></span></strong><span style="font-family: 宋体">第一种思维：这个相对简单，因为树状数组求比</span>mid<span style="font-family: 宋体">小的数就一个</span>getsum(mid-1)<span style="font-family: 宋体">就搞定。</span></p>
<p><span style="font-family: 宋体">复杂度同线段树一样。只是常数很小，代码量也很小。</span></p>
<p><strong><span></span></strong><span style="font-family: 宋体">第二种思维：我只能说很巧妙。回顾树状数组求和时的操作：</span></p>
<p><span></span><strong><u><span style="font-family: 宋体">代码</span></u></strong></p>
<p><span></span></p>
<p><span></span><span style="font-family: 宋体"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; text-decoration: ; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getsum(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(&nbsp;;&nbsp;x</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;&nbsp;x</span><span style="color: #000000">-=</span><span style="color: #000000">lowbit(x)&nbsp;)&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;arr[x]&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;res&nbsp;;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}</span></div>
<p><br />对二进制数</span>10100010 <span style="font-family: 宋体">是依次累加</span>arr[10100010] , arr[10100000] , arr[10000000] <span style="font-family: 宋体">。从而得到小于</span>x<span style="font-family: 宋体">的数的个数。当反过来看的时候，就有了这种方法：从高位到低位依次确定答案的当前为是</span>0<span style="font-family: 宋体">还是</span>1<span style="font-family: 宋体">，首先假设是</span>1<span style="font-family: 宋体">，判断累计结果是否会超过</span>K<span style="font-family: 宋体">，超过</span>K<span style="font-family: 宋体">则假设不成立，应为</span>0<span style="font-family: 宋体">，否则继续确定下一位。看程序就明白了。</span></p>
<p><span></span><strong><u><span style="font-family: 宋体">代码</span></u></strong><span style="font-family: 宋体"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; text-decoration: ; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getkth(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;k){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ans&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;,&nbsp;cnt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;,&nbsp;i&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">20</span><span style="color: #000000">&nbsp;;&nbsp;i</span><span style="color: #000000">&gt;=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">i&nbsp;;<br />&nbsp;&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">(ans</span><span style="color: #000000">&gt;=</span><span style="color: #000000">maxn</span><span style="color: #000000">||</span><span style="color: #000000">cnt</span><span style="color: #000000">+</span><span style="color: #000000">c[ans]</span><span style="color: #000000">&gt;=</span><span style="color: #000000">k)&nbsp;ans</span><span style="color: #000000">-=</span><span style="color: #000000">1</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">i&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;cnt&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">c[ans]&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ans</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></div>
<p><br />复杂度：自然就比第一种少了一个阶。</span>O(M*logN)<span style="font-family: 宋体">。</span></p>
<p><strong><span></span></strong><strong><span style="font-family: 宋体">平衡二叉树：</span></strong></p>
<p><strong><span></span></strong><span style="font-family: 宋体">各种平衡二叉树都可以解决这个问题：</span>Size Balance Tree <span style="font-family: 宋体">，</span>Spaly <span style="font-family: 宋体">，</span>Treap <span style="font-family: 宋体">，红黑树等等。</span> <span style="font-family: 宋体">不得不说，</span>Size Balance Tree<span style="font-family: 宋体">解这个问题是比较方便的。因为</span>SBT<span style="font-family: 宋体">本身就有一个</span>Select<span style="font-family: 宋体">操作，直接调用一下，就出来了。</span><span> </span></p>
<p><span></span><strong><u><span style="font-family: 宋体">代码</span></u></strong></p>
<p><span></span><span style="font-family: 宋体">复杂度：用的是第二种思维。</span>O(M*logN)<span style="font-family: 宋体">。</span></p>
<p><span></span></p>
<p><span></span><strong><u><span style="font-family: 宋体">总结：</span></u></strong></p>
<p><span></span><span style="font-family: 宋体">其实，综合起来，各种数据结构，各种算法</span> <span style="font-family: 宋体">，各种纠结。平衡树太复杂，线段树又高了点（一般情况不会有问题的）。最好的方法还是<strong><u>树状数组的二进制算法</u></strong>，时间复杂度和编程复杂度达到双赢。</span></p>
<p><span></span><span style="font-family: 宋体">但是，总结起来，发现线段树或者树状数组所消耗的空间跟数据的范围有关，当序列元素是浮点数或者范围很大时，就有点力不从心了（当然，离线的情况可以离散化，在线的某些情况可以离散化），而用平衡二叉树就不存在这样的问题。原来<strong><u>平衡二叉树才是王道</u></strong>。</span></p>
<p><span></span></p>
<p><span></span><strong><u><span style="font-family: 宋体">练习：</span></u></strong></p>
<p><span></span><span style="font-family: 宋体">最近发现，基于这种思想的题目还真是不少啊</span>~ ~ <a href="http://poj.org/problem?id=3481"><span style="color: #3366ff">POJ Double Queue</span></a></p>
<p><span><a href="http://61.187.179.132/JudgeOnline/problem.php?id=1503"><span style="color: #3366ff">[NOI2004]</span><span style="font-family: 宋体; color: #3366ff">郁闷的出纳员</span></a> </span><span style="font-family: 宋体">工资反过来看，职员工资不变，而是工资下界在变而已。当降低工资下界时，为了知道哪些职员走人了，我还用了个二叉堆。。。。。</span></p>
<p><span><a href="http://poj.org/problem?id=2761"><span style="color: #3366ff">POJ 2761 Feed the dogs</span></a> </span><span style="font-family: 宋体">首先该题用接下来<strong><u>问题</u></strong></span><strong><u>3</u></strong><span style="font-family: 宋体">的一个特例。但其特殊性在于任意两个区间不包含，导致把区间按左端点（不会存在相同左端点滴，否则必包含）排序之后，依次扫描每个区间，当前区间和前一个区间相交的部分不动，前一区间有而当前区间没有的部分删除，前一区间没有而当前区间有的部分添加。这能保证每个元素正好添删各一次。</span></p>
<p><span><a href="http://poj.org/problem?id=2823"><span style="color: #3366ff">POJ 2823 Sliding Window</span></a> </span><span style="font-family: 宋体">太特殊了，最大值就是第</span>K <span style="font-family: 宋体">小</span> <span style="font-family: 宋体">，</span> <span style="font-family: 宋体">最小值就是第</span>1<span style="font-family: 宋体">小（这是一个很重要的启示：<strong><u><span style="color: black">树状数组也可以动态求最值</span></u></strong>）。<strong><u>单调队列</u></strong>可以弄成线性算法。</span></p>
<p align="left"><span><a href="http://acm.hunnu.edu.cn/online/?action=problem&amp;type=show&amp;id=10571"><span style="color: #3366ff">HUNNU 10571 Counting Girls </span></a></span><strong><u><span style="font-family: 宋体">第四届华中南邀请赛</span></u></strong> <span style="font-family: 宋体">但数据与题目稍有不符</span> <span style="font-family: 宋体">但可以确定每个数大于等于</span>0<span style="font-family: 宋体">且不超过</span>200000 <span style="font-family: 宋体">。关键是求第</span>X th <span style="font-family: 宋体">到第</span> Y th <span style="font-family: 宋体">个</span>MM<span style="font-family: 宋体">的</span>rating <span style="font-family: 宋体">和要注意下。</span></p>
<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=2852"><span style="color: #3366ff">KiKi's K-Number</span></a> <span style="font-family: 宋体">这题就没什么好说的了。求</span>[a+1,MaxnInt]<span style="font-family: 宋体">的第</span>K <span style="font-family: 宋体">小的数，先求出</span>[0,a]<span style="font-family: 宋体">有多少个数，设为</span>cnt<span style="font-family: 宋体">，只要求第</span>K+cnt<span style="font-family: 宋体">小的数就可以了。哦，题目说是求第</span>K<span style="font-family: 宋体">大的，实际是求第</span>K<span style="font-family: 宋体">小的，这有点意思</span>~</p>
<p>&nbsp;</p>
<p align="center"><span style="font-family: 宋体; font-size: 24pt">【问题三】</span></p>
<p><strong><u><span style="font-family: 宋体">问题描述</span></u></strong> </p>
<p><span style="font-family: 宋体">给定一个序列</span>a[1...n] <span style="font-family: 宋体">，</span> <span style="font-family: 宋体">有</span>m <span style="font-family: 宋体">个询问</span> <span style="font-family: 宋体">，</span> <span style="font-family: 宋体">每次询问</span>a[i...j]<span style="font-family: 宋体">之间第</span>K<span style="font-family: 宋体">小的数。</span></p>
<p><span style="font-family: 宋体">（引用一句英文：</span>You can assume that n&lt;100001 and m&lt;50001<span style="font-family: 宋体">）</span> </p>
<p><strong><u><span style="font-family: 宋体">算法分析</span></u></strong></p>
<p><strong><u><span style="font-family: 宋体">块状表</span></u></strong> </p>
<p><span style="font-family: 宋体">如果这道题能够想到用块状表的话，思维复杂度和编程复杂度都不高</span>~<span style="font-family: 宋体">，考虑这样操作：</span></p>
<p><span style="font-family: 宋体">首先预处理，将序列划分成</span>sqrt(N)<span style="font-family: 宋体">个小段，每段长</span>[sqrt(N)] <span style="font-family: 宋体">，划分时，将每小段排好序。</span></p>
<p><span style="font-family: 宋体">然后就是查询了，对区间</span>[i,j]<span style="font-family: 宋体">的查询，同样采用二分求比测试值</span>mid<span style="font-family: 宋体">小的个数。</span>i<span style="font-family: 宋体">和</span>j<span style="font-family: 宋体">所在的零散的两小段直接枚举求，中间完整的小段则二分查找求。<br />这样一次查询时间复杂度为<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/ironoxide/formula5.PNG" width="374" height="64" /><br /><br /></span><span style="font-family: 宋体">于是总复杂度为：</span> 
<p><span></span></p><span style="font-family: 宋体"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/ironoxide/formula6.PNG" width="401" height="59" /><br />当然，这里计算量是比较大的，实际写了个程序也是超时的。但当</span>M<span style="font-family: 宋体">比较小时，也未尝不是一种好的选择（或者当开阔思路吧，但对<strong><u>问题四</u></strong>却正好打个擦边球）。</span> 
<p>&nbsp;</p>
<p><strong><u><span style="font-family: 宋体">划分树</span></u></strong></p>
<p><span></span><span style="font-family: 宋体">划分树应该是解决这道题复杂度最低的方法，复杂度为<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/ironoxide/formula7.PNG" width="305" height="56" /><br /></span><span></span><span style="font-family: 宋体">思想其实很简答，用线段树把整个序列分成若干区间。建树时，对区间</span>[l,r]<span style="font-family: 宋体">划分：选择该区间的中位数</span>value<span style="font-family: 宋体">（注意：可以先用快速排序对原来序列排个序，于是可以速度得到中位数），将小于等于</span>value<span style="font-family: 宋体">的不超过</span>mid-l+1<span style="font-family: 宋体">个数划分到</span>[l,mid]<span style="font-family: 宋体">区间，其余划分到</span>[mid+1,r]<span style="font-family: 宋体">区间，用一个数组把每层划分后的序列保存起来。</span></p>
<p><span></span></p>
<p><span></span><span style="font-family: 宋体">然后，查找的时候，</span>Find(x , l , r , k)<span style="font-family: 宋体">表示超找</span>x<span style="font-family: 宋体">节点内区间</span>[l,r]<span style="font-family: 宋体">第</span>K<span style="font-family: 宋体">小的数。将该节点区间分成三个区间</span>[seg_left , l-1] <span style="font-family: 宋体">，</span> [l , r ] , [r+1 , seg_right]<span style="font-family: 宋体">来讨论问题，他们在划分过程中分到</span>[l,mid]<span style="font-family: 宋体">区间的个数依次为</span>ls , ms , rs <span style="font-family: 宋体">。若</span>ms&lt;=K<span style="font-family: 宋体">自然查左边区间</span>, Find(2*x , l+ls , l+ls+ms-1,K)<span style="font-family: 宋体">。否则自然查右边，计算下标很烦啊。有代码在</span>~</p>
<p><strong><u><span style="font-family: 宋体">代码</span></u></strong> <br /><span style="font-family: 宋体"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; text-decoration: ; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;build(lld&nbsp;d&nbsp;,lld&nbsp;l&nbsp;,&nbsp;lld&nbsp;r&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r)&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lld&nbsp;i&nbsp;,&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(l</span><span style="color: #000000">+</span><span style="color: #000000">r)</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;,&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">l&nbsp;,&nbsp;k</span><span style="color: #000000">=</span><span style="color: #000000">mid</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;r&nbsp;;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s[d][i</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(tr[d][i]&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;mid){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[d][i]</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tr[d</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">][j</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tr[d][i];&nbsp;<br />&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;tr[d</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">][k</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tr[d][i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;build(d</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;,l&nbsp;,&nbsp;mid);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;build(d</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;,&nbsp;mid</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;,&nbsp;r);<br />}<br /><br />lld&nbsp;getkth(lld&nbsp;d&nbsp;,lld&nbsp;lp&nbsp;,lld&nbsp;rp&nbsp;,&nbsp;lld&nbsp;l&nbsp;,&nbsp;lld&nbsp;r&nbsp;,&nbsp;lld&nbsp;k){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(lp&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;rp&nbsp;)&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;tr[d][lp]&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;lld&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(lp&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;rp)</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(k</span><span style="color: #000000">&lt;=</span><span style="color: #000000">s[d][r]</span><span style="color: #000000">-</span><span style="color: #000000">s[d][l</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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;getkth(d</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;,lp&nbsp;,&nbsp;mid&nbsp;,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lp</span><span style="color: #000000">+</span><span style="color: #000000">s[d][l</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">]</span><span style="color: #000000">-</span><span style="color: #000000">s[d][lp</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;,&nbsp;lp</span><span style="color: #000000">+</span><span style="color: #000000">s[d][r]</span><span style="color: #000000">-</span><span style="color: #000000">s[d][lp</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">]</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;,&nbsp;k&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;getkth(d</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;,mid</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;,&nbsp;rp&nbsp;,&nbsp;mid</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">+</span><span style="color: #000000">(l</span><span style="color: #000000">-</span><span style="color: #000000">lp)</span><span style="color: #000000">-</span><span style="color: #000000">(s[d][l</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">]</span><span style="color: #000000">-</span><span style="color: #000000">s[d][lp</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">])&nbsp;,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mid</span><span style="color: #000000">+</span><span style="color: #000000">(r</span><span style="color: #000000">-</span><span style="color: #000000">lp</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">)</span><span style="color: #000000">-</span><span style="color: #000000">(s[d][r]</span><span style="color: #000000">-</span><span style="color: #000000">s[d][lp</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">])&nbsp;,&nbsp;k</span><span style="color: #000000">-</span><span style="color: #000000">(s[d][r]</span><span style="color: #000000">-</span><span style="color: #000000">s[d][l</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">])&nbsp;);<br />}<br /></span></div>
<p><br /><strong><u>归并树</u></strong></span></p>
<p><span></span><span style="font-family: 宋体">归并树思想就跟简单了，说白了就是线段树每个区间</span>[l,r]<span style="font-family: 宋体">内的数都排好序然后保存起来，</span> <span style="font-family: 宋体">从两个儿子到父亲节点，其实就是<strong><u>两个有序序列归并成一个有序序列</u></strong>，所以就称归并树了。</span></p>
<p><span></span><span style="font-family: 宋体">用前面说的二分答案，对测试值</span>mid<span style="font-family: 宋体">求</span>rank<span style="font-family: 宋体">。查找的时候，将查找区间划分成线段树中若干子区间之并，很明显各个子区间小于</span>mid<span style="font-family: 宋体">的个数加起来，就是该区间小于</span>mid<span style="font-family: 宋体">的个数。而每个子区间又是有序的，所有二分可以很快找到小区间小于</span>mid<span style="font-family: 宋体">的个数。</span></p>
<p><span></span><span style="font-family: 宋体">总结起来，有三次二分：</span></p>
<p><span>1.</span><span style="font-family: 宋体">二分答案；</span></p>
<p><span>2.</span><span style="font-family: 宋体">查找区间</span>[a,b]<span style="font-family: 宋体">划分成不超过</span>log(b - a)<span style="font-family: 宋体">个小区间；</span></p>
<p><span>3.</span><span style="font-family: 宋体">对每个子区间，二分查找小于</span>mid<span style="font-family: 宋体">的个数；</span></p>
<p><span></span></p>
<p><span style="font-family: 宋体">于是，整个算法复杂度为：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/ironoxide/formula8.PNG" width="416" height="66" /><br /></span><strong><u><span style="font-family: 宋体">总结</span></u></strong><span style="font-family: 宋体">：</span></p>
<p><span style="font-family: 宋体">对本问题，提供了三种算法，其中基于快排的划分算法是最快的；块状表思维和编程都比较简单，但是复杂度比较高；归并树算法思想很好，二分答案，求</span>rank <span style="font-family: 宋体">，</span> <span style="font-family: 宋体">后面<strong><u>问题四</u></strong>的算法就是根据这种思维设计出来的。</span><span> </span></p>
<p><strong><u><span style="font-family: 宋体">练习</span></u></strong></p>
<p><a href="http://poj.org/problem?id=2761"><span style="color: #3366ff">POJ 2761 Feed the dogs</span></a><strong><u></u></strong></p>
<p><a href="http://poj.org/problem?id=2104"><span style="color: #3366ff">POJ 2104 K-th Number </span></a><strong><u></u></strong></p>
<p><a href="http://www.rqnoj.cn/Problem_560.html"><span style="color: #3366ff">NOI 2010 <span style="font-family: 宋体; color: #3366ff">超级刚琴</span></span></a> <span style="font-family: 宋体">这题还真有点难度。</span> </p>
<p><span style="font-family: 宋体">思路：划分树</span>+<span style="font-family: 宋体">堆</span>+<span style="font-family: 宋体">单调队列</span> </p>
<p><span></span><span style="font-family: 宋体">对每个区间，起点为</span>i+1,<span style="font-family: 宋体">终点在区间</span>[i+L,i+R]<span style="font-family: 宋体">。计</span>s[i]=a[0]+a[1]+...+a[i] (<span style="font-family: 宋体">规定</span>a[0]=0), <span style="font-family: 宋体">设</span>opt[i,k]<span style="font-family: 宋体">表示第</span>k<span style="font-family: 宋体">大的</span>s[j] (i+L&lt;=j&lt;=i+R)<span style="font-family: 宋体">，即</span>opt[i,k] = Max_k { s[j] | i+L&lt;=j&lt;=i+R} <span style="font-family: 宋体">（</span>Max_k<span style="font-family: 宋体">表示第</span>k<span style="font-family: 宋体">大）。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">先进行两个预处理工作：</span></p>
<p style="text-indent: 21pt; margin-left: 0cm"><span>1.</span><span style="font-family: 宋体">将</span>s[1] , s[2] , s[3] , .. s[n] <span style="font-family: 宋体">建成一颗静态划分树。</span></p>
<p style="text-indent: 21pt; margin-left: 0cm"><span>2.</span><span style="font-family: 宋体">用单调队列预处理出所有</span>opt[i,1]<span style="font-family: 宋体">的值，并将所有</span>opt[i,1]-s[i]<span style="font-family: 宋体">用一个堆维护起来。当然也可以直接通过查询</span>[i+L,i+R]<span style="font-family: 宋体">区间第</span>1<span style="font-family: 宋体">大的值来预处理</span>opt[i,1]<span style="font-family: 宋体">。</span></p>
<p><span></span><span style="font-family: 宋体">下面开始取值，并更新：依次从堆中取出最大值，设是</span>opt[i,j]-s[i]<span style="font-family: 宋体">，把它累加至答案，再查询划分树中</span>[i+L , i+R]<span style="font-family: 宋体">区间第</span>j+1<span style="font-family: 宋体">大的值</span>opt[i,j+1] , <span style="font-family: 宋体">将</span>opt[i,j+1]-s[i]<span style="font-family: 宋体">后入堆。直到累加次数为</span>K<span style="font-family: 宋体">停止。</span></p>
<p>&nbsp;</p>
<p align="center"><strong><span style="font-family: 宋体; font-size: 24pt">【</span></strong><span style="font-family: 宋体; font-size: 24pt">问题四<strong>】</strong></span><strong></strong></p>
<p><strong><u><span style="font-family: 宋体">问题描述</span></u></strong></p>
<p><span style="font-family: 宋体">给定一个原始序列</span>a[1...n] , <span style="font-family: 宋体">有两种操作：</span></p>
<p><span style="font-family: 宋体">操作一：</span> QUERY i j k <span style="font-family: 宋体">询问当前序列中，</span>a[i...j]<span style="font-family: 宋体">之间第</span>k<span style="font-family: 宋体">小的数是多少</span> </p>
<p><span style="font-family: 宋体">操作二：</span> CHANG I T <span style="font-family: 宋体">将</span>a[i]<span style="font-family: 宋体">改为</span>T <span style="font-family: 宋体">；</span></p>
<p><span style="font-family: 宋体">输出每次询问的结果。</span>N&lt;=50000 , <span style="font-family: 宋体">操作次数</span>M&lt;=10000 <br /></p>
<p><strong><u><span style="font-family: 宋体">算法分析</span></u></strong></p>
<p><strong><u><span style="font-family: 宋体">块状表</span></u></strong></p>
<p><span></span><span style="font-family: 宋体">将</span>a[1...n]<span style="font-family: 宋体">分成</span>sqrt(N)<span style="font-family: 宋体">段，每段长</span>[sqrt(N)],<span style="font-family: 宋体">为方便二分查找每段，将每段排好序，对操作二，先删去</span>a[i] , <span style="font-family: 宋体">在插入</span>T , <span style="font-family: 宋体">维护该块得有序性，复杂度为</span>O(sqrt(N))<span style="font-family: 宋体">。</span></p>
<p><span></span><span style="font-family: 宋体">对操作一，二分答案，设当前测试值为</span>mid , <span style="font-family: 宋体">先统计两端零散块，</span>O(2*sqrt(N)) <span style="font-family: 宋体">。对中间完整块，每块二分查找，总复杂度为：<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/ironoxide/formula4.PNG" width="422" height="79" /><br /><br /></span>
<p><span></span></p><strong><u><span style="font-family: 宋体"><font face="Courier New"></font>线段树</span>+<span style="font-family: 宋体">平衡二叉树</span></u></strong> 
<p>&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">序列被线段树划分为区间节点，而每个节点又是一颗平衡二叉树，平衡二叉树放的是该区间段的所有数。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">对操作二，依次更新从跟区间到叶子节点区间的平衡树即可（先删除</span>a[i],<span style="font-family: 宋体">在插入</span>T<span style="font-family: 宋体">），考虑复杂度，第一层规模为</span>N<span style="font-family: 宋体">，第二层规模为</span>N/2<span style="font-family: 宋体">，第</span>k<span style="font-family: 宋体">层规模为</span> N/2^k <span style="font-family: 宋体">。进行依次操作二的复杂度为：<br />&nbsp;&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/ironoxide/formula1.PNG" width="793" height="91" /><br />&nbsp;&nbsp;&nbsp; 这里 K = [logN]<br /></span><span style="font-family: 宋体">对操作一：询问区间被划分为不超过</span>[logN]<span style="font-family: 宋体">个线段树节点之并，每次区间查找上界为</span>logN <span style="font-family: 宋体">。所以，对每个测试值</span>mid , <span style="font-family: 宋体">耗时</span>(logN)^2 , <span style="font-family: 宋体">故查询一次的复杂度为：<br />&nbsp;&nbsp;&nbsp; <img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/ironoxide/formula2.PNG" width="267" height="58" /><br /></span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">总复杂度为</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/ironoxide/formula3.PNG" width="299" height="59" /></p>
<p style="text-indent: 21pt"></p>
<p><strong><u><span style="font-family: 宋体">练习</span></u></strong></p>
<p><a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112"><span style="color: #3366ff">ZOJ 2112 Dynamic Rankings</span></a></p><img src ="http://www.cppblog.com/IronOxide/aggbug/188669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IronOxide/" target="_blank">IronOxide</a> 2012-08-29 21:16 <a href="http://www.cppblog.com/IronOxide/archive/2012/08/29/188669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2012年京东商城软件开发校园招聘</title><link>http://www.cppblog.com/IronOxide/archive/2012/08/29/188668.html</link><dc:creator>IronOxide</dc:creator><author>IronOxide</author><pubDate>Wed, 29 Aug 2012 12:59:00 GMT</pubDate><guid>http://www.cppblog.com/IronOxide/archive/2012/08/29/188668.html</guid><wfw:comment>http://www.cppblog.com/IronOxide/comments/188668.html</wfw:comment><comments>http://www.cppblog.com/IronOxide/archive/2012/08/29/188668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IronOxide/comments/commentRss/188668.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IronOxide/services/trackbacks/188668.html</trackback:ping><description><![CDATA[<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; font-weight: bold">声明：本文版权归IronOxide所有，博客地址：<a href="http://www.cppblog.com/IronOxide/"><span style="color: #3366ff">http://www.cppblog.com/IronOxide/</span></a><br /><br />第一部分 数据结构与算法<br /><br /></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">1. </span><span style="font-family: '宋体'; font-size: 10pt">设数组中初始状态是递增的，分别用堆排序，快速排序，冒泡排序和归并排序方法对其进行排序（按递增顺序），【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">冒泡排序</span><span style="font-family: '宋体'; font-size: 10pt">】最省时间，【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">快速排序</span><span style="font-family: '宋体'; font-size: 10pt">】最费时间。<br /><br /></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">2. </span><span style="font-family: '宋体'; font-size: 10pt">红黑树中已经有n个数据，寻找某个key是否存在的时间复杂度为【</span><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">O(logn)</span><span style="font-family: '宋体'; font-size: 10pt">】。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />3. </span><span style="font-family: '宋体'; font-size: 10pt">7个相同的球放到4个不同的盒子里的，每个盒子至少放一个，方法有【</span><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">20</span><span style="font-family: '宋体'; font-size: 10pt">】种。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />4. </span><span style="font-family: '宋体'; font-size: 10pt">两个无环点链表L1，L2，其长度分别为m和n(</span><span style="font-family: 'Times New Roman'; font-size: 10pt">m&gt;n</span><span style="font-family: '宋体'; font-size: 10pt">)</span><span style="font-family: 'Times New Roman'; font-size: 10pt">,</span><span style="font-family: '宋体'; font-size: 10pt">判定</span><span style="font-family: 'Times New Roman'; font-size: 10pt">L1,L2</span><span style="font-family: '宋体'; font-size: 10pt">是否相交的时间复杂度是【</span><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">O(m+n)</span><span style="font-family: '宋体'; font-size: 10pt">】，空间复杂度是（不包括原始链表</span><span style="font-family: 'Times New Roman'; font-size: 10pt">L1,L2</span><span style="font-family: '宋体'; font-size: 10pt">）【</span><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">O(1)</span><span style="font-family: '宋体'; font-size: 10pt">】。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />5. </span><span style="font-family: '宋体'; font-size: 10pt">平面上有两个n条直线两两相交，但没有三条直线交与一点，问这n条直线把平面划分成【</span><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">(n*n+n+2)/2</span><span style="font-family: '宋体'; font-size: 10pt">】个区域。<br /><br /></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; font-weight: bold">第二部分 软件工程与数据库</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />在京东商城的商品展示页面下方，总会有一些关于本商品的客户评论信息。模仿该评论模块，有如下三个表：</span><span style="font-family: 'Times New Roman'; font-size: 10pt">price(</span><span style="font-family: '宋体'; font-size: 10pt">商品表</span><span style="font-family: 'Times New Roman'; font-size: 10pt">)</span><span style="font-family: '宋体'; font-size: 10pt">，userinfo(用户表),threads(评论主题表)<br /><br /></span></p><font size="3"><span style="line-height: normal"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/ironoxide/tablesmall.jpg" /><br /><br /></span></font>
<p style="margin-top: 0pt; margin-bottom: 0pt"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">1.</span><span style="font-family: '宋体'; font-size: 10pt">请画出以上三张表对应实体的ER图（实体字段标明主键外键即可，用箭头表示）</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />2.</span><span style="font-family: '宋体'; font-size: 10pt">在</span><span style="font-family: 'Times New Roman'; font-size: 10pt">product</span><span style="font-family: '宋体'; font-size: 10pt">表中加入一条新纪录</span><span style="font-family: 'Times New Roman'; font-size: 10pt">(1004,'</span><span style="font-family: '宋体'; font-size: 10pt">京东空调</span><span style="font-family: 'Times New Roman'; font-size: 10pt">',3000).</span><span style="font-family: '宋体'; font-size: 10pt">请写出对应的</span><span style="font-family: 'Times New Roman'; font-size: 10pt">SQL</span><span style="font-family: '宋体'; font-size: 10pt">语句。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">INSERT INTO product(Pid,Pname,Price) VALUES(1004,'</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">京东空调</span><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">',3000);</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />3.</span><span style="font-family: '宋体'; font-size: 10pt">更新</span><span style="font-family: 'Times New Roman'; font-size: 10pt">product</span><span style="font-family: '宋体'; font-size: 10pt">表中</span><span style="font-family: 'Times New Roman'; font-size: 10pt">pid</span><span style="font-family: '宋体'; font-size: 10pt">为1001的商品的价格为3666。请写出对应的SQL语句。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">UPDATE product SET Price=3666 WHERE pid=1001;</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />4.</span><span style="font-family: '宋体'; font-size: 10pt">在</span><span style="font-family: 'Times New Roman'; font-size: 10pt">product</span><span style="font-family: '宋体'; font-size: 10pt">表中查询</span><span style="font-family: 'Times New Roman'; font-size: 10pt">pname</span><span style="font-family: '宋体'; font-size: 10pt">中带有</span><span style="font-family: 'Times New Roman'; font-size: 10pt">"</span><span style="font-family: '宋体'; font-size: 10pt">京</span><span style="font-family: 'Times New Roman'; font-size: 10pt">"</span><span style="font-family: '宋体'; font-size: 10pt">的商品。请写出对应的SQL语句。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">SELECT * FROM product WHERE pname LIKE '%</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">京</span><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">%';</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />5.</span><span style="font-family: '宋体'; font-size: 10pt">查询</span><span style="font-family: 'Times New Roman'; font-size: 10pt">product</span><span style="font-family: '宋体'; font-size: 10pt">表中</span><span style="font-family: 'Times New Roman'; font-size: 10pt">price</span><span style="font-family: '宋体'; font-size: 10pt">在1000.0与3000.0之间的所有商品并按照价格降序排序。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">SELECT * FROM product WHERE price&lt;3000.0 AND price&gt;1000.0 ORDER BY price DESC;<br /><br /></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; font-weight: bold">第三部分 数字与逻辑</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />1.</span><span style="font-family: '宋体'; font-size: 10pt">数字与逻辑<br /><br /></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">A</span><span style="font-family: 'Times New Roman'; font-size: 10pt">. 0 2 6 14 </span><span style="font-family: '宋体'; font-size: 10pt">【</span><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">30</span><span style="font-family: '宋体'; font-size: 10pt">】 </span><span style="font-family: 'Times New Roman'; font-size: 10pt">62</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10pt">B. 11 22 33 45 </span><span style="font-family: '宋体'; font-size: 10pt">【</span><span style="font-family: 'Times New Roman'; color: #3366ff; font-size: 10pt">57</span><span style="font-family: '宋体'; font-size: 10pt">】 </span><span style="font-family: 'Times New Roman'; font-size: 10pt">71</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10pt">C. 1 7 10 </span><span style="font-family: '宋体'; font-size: 10pt">【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">不知道</span><span style="font-family: '宋体'; font-size: 10pt">】 </span><span style="font-family: 'Times New Roman'; font-size: 10pt">3 4 -1</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />2.</span><span style="font-family: '宋体'; font-size: 10pt">逻辑推理</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">A</span><span style="font-family: 'Times New Roman'; font-size: 10pt">.</span><span style="font-family: '宋体'; font-size: 10pt">你让工人为你工作7天，给工人的回报是1根金条。金条平分成相连的7段，你必须在每天结束时给他们1段金条，如果只许你两次把金条弄断，你如何给你的工人付费。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; font-weight: bold">解：</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">假设金条长度为7，将金条分成7=1+2+4（实际上就是2的幂）。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">第一天，把长度为1的小段给工人。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">第二天，把长度为2的小段给工人，并收回长度为1的小段。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">第三天，把长度为1的小段给工人。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">第四天，把长度为4的小段给工人，并收回长度为1和长度为2的小段。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">第五天，把长度为1的小段给工人。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">第六天，把长度为2的小段给工人，并收回长度为1的小段。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">第七天，把长度为1的小段给工人。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />B</span><span style="font-family: 'Times New Roman'; font-size: 10pt">.</span><span style="font-family: '宋体'; font-size: 10pt">有7克，2克砝码各一个，天平一只，如何只用这些物品3次将140的盐分为50，,90克各一份？</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; font-weight: bold">解：</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">答案有多解：</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">步骤一：把2克的砝码放到天平一段，然后把140克盐往天平两端加，直到平衡。这样就把所有的盐分成69克和71克两部分。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">步骤二：把7克砝码和2克砝码放到天平左端，把71克盐网天平两端加，直到平衡。这样左端的盐重31克，右端的盐重40克。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">步骤三：把31克盐和69克盐合成一堆，往天平上加，直到平衡。这样就把100克盐分成了两个50克，把上面称出的40克和一个50克合并就得90克，剩余的就是50克了。<br /><br /></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; font-weight: bold">第四部分 其他</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />1.</span><span style="font-family: '宋体'; font-size: 10pt"> 线程是【</span><span style="font-family: Arial; color: #3366ff; font-size: 10pt; background-origin: initial; background-clip: initial">进程</span><span style="font-family: '宋体'; font-size: 10pt">】中某个单一顺序的控制流。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">参考资料：</span><a href="http://baike.baidu.com/view/1053.htm"><span style="font-family: 'Times New Roman'; color: #0000ff; font-size: 10pt">http://baike.baidu.com/view/1053.htm</span></a> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">多线程可以让同一个【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">进程</span><span style="font-family: '宋体'; font-size: 10pt">】的不同部分【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">并发</span><span style="font-family: '宋体'; font-size: 10pt">】执行，从而实现加速。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">参考资料：</span><a href="http://baike.baidu.com/view/65706.htm"><span style="font-family: 'Times New Roman'; color: #0000ff; font-size: 10pt">http://baike.baidu.com/view/65706.htm</span></a> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />2.</span><span style="font-family: '宋体'; font-size: 10pt">死锁是指【</span><span style="font-family: Arial; color: #3366ff; font-size: 10pt; background-origin: initial; background-clip: initial">两个或两个以上的进程</span> <span style="font-family: '宋体'; font-size: 10pt">】在执行过程中，因争夺资源二造成的一种【</span><span style="font-family: Arial; color: #3366ff; font-size: 10pt; background-origin: initial; background-clip: initial">互相等待</span> <span style="font-family: '宋体'; font-size: 10pt">】现象，若无外力作用，它们将无法推进下去。内存中造成死锁的原因有【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">可剥夺资源和不可剥夺资源</span><span style="font-family: '宋体'; font-size: 10pt">】，【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">竞争不可剥夺资源</span><span style="font-family: '宋体'; font-size: 10pt">】，【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">竞争临时资源</span><span style="font-family: '宋体'; font-size: 10pt">】。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">参考资料：</span><a href="http://baike.baidu.com/view/121723.htm"><span style="font-family: 'Times New Roman'; color: #0000ff; font-size: 10pt">http://baike.baidu.com/view/121723.htm</span></a> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10pt"><br />3.</span><span style="font-family: 'Times New Roman'; font-size: 10pt">ISO</span><span style="font-family: '宋体'; font-size: 10pt">网络模型图与</span><span style="font-family: 'Times New Roman'; font-size: 10pt">TCP/IP</span><span style="font-family: '宋体'; font-size: 10pt">网络模型图对应关系为</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">应用层</span><span style="font-family: '宋体'; font-size: 10pt">】，【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">表示层</span><span style="font-family: '宋体'; font-size: 10pt">】，【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">会话层</span><span style="font-family: '宋体'; font-size: 10pt">】对应【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">应用层</span><span style="font-family: '宋体'; font-size: 10pt">】</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">传输层</span><span style="font-family: '宋体'; font-size: 10pt">】对应【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">传输层</span><span style="font-family: '宋体'; font-size: 10pt">】</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">网络层</span><span style="font-family: '宋体'; font-size: 10pt">】对应【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">网际层</span><span style="font-family: '宋体'; font-size: 10pt">】</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">数据链路层</span><span style="font-family: '宋体'; font-size: 10pt">】【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">物理层</span><span style="font-family: '宋体'; font-size: 10pt">】对应【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">网络接口</span><span style="font-family: '宋体'; font-size: 10pt">】</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">参考网址</span><a href="http://blog.csdn.net/yuliu0552/article/details/6711659"><span style="font-family: 'Times New Roman'; color: #0000ff; font-size: 10pt">http://blog.csdn.net/yuliu0552/article/details/6711659</span></a> <br /><br /></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/ironoxide/untitled.png" /><br /><br /></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">4.</span><span style="font-family: '宋体'; font-size: 10pt">你所见过的最大影子是【</span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">月亮的影子</span><span style="font-family: '宋体'; font-size: 10pt">】。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />5.</span><span style="font-family: '宋体'; font-size: 10pt">京东商城的商品搜索功能是整个网站架构中非常重要的一个模块。当用户在搜索栏中写入他们想要搜索的关键字时，往往会有一些热门的关键词出现在提示框中。对于这一功能的实现，你认为需要：</span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">1.用户输入一些关键字查询时，将用户的相关信息(ip,cookie,keyword,username etc.)，暂时存储。（临时对象，临时文件等等）。</span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">2.定时从暂时缓存处，一次行读取，写入到数据库中。</span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">3.记录下来关键字后，需要定时从数据库中提取出来。</span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">4.数据库存储建议采用Oracle，因为这个数据量会增加很快，且很大。最好采用分表处理。</span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">5.定时生成相关关键字页面，可以与定时关键字写入数据库放在一起</span><span style="font-family: '宋体'; font-size: 10pt">。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">由于关键词的存储量非常大，在你看来这么关键词该：</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"></span><span style="font-family: '宋体'; color: #3366ff; font-size: 10pt">需要将用户关键字记录表分解处理.即每个月的第一天的零点生成一个新的数据库表，名字(user_key_200604),名字后面的数字是年月（六位数字）。用户每次查询时，记录到当月的记录表中，（以后提供的用户的查询日志，默认只提供当月的查询记录）。</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">参考资料：</span><a href="http://blog.sina.com.cn/s/blog_53fc0ac20100pr7j.html"><span style="font-family: 'Times New Roman'; color: #0000ff; font-size: 10pt">http://blog.sina.com.cn/s/blog_53fc0ac20100pr7j.html</span></a> <br /><br /></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; font-weight: bold">第五部分 选答题（任选一题作答，使用JAVA</span><span style="font-family: 'Times New Roman'; font-size: 10pt; font-weight: bold">,C#,C++</span><span style="font-family: '宋体'; font-size: 10pt; font-weight: bold">等主流语言编写）</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />1.</span><span style="font-family: '宋体'; font-size: 10pt">求给定数组中最大的K个数</span><span style="font-family: 'Times New Roman'; font-size: 10pt">function array[] findK(array[] a , int k)</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">解：</span><a href="http://blog.csdn.net/v_JULY_v/article/details/6370650"><span style="font-family: 'Times New Roman'; color: #0000ff; font-size: 10pt">http://blog.csdn.net/v_JULY_v/article/details/6370650</span></a> </p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt"><br />2.</span><span style="font-family: '宋体'; font-size: 10pt">求给定数组中存在的和为最大的子数组，子数组中各元素要求是在原数组中连续的部分</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">（</span><span style="font-family: 'Times New Roman'; font-size: 10pt">3,-2,3,4,5,-8</span><span style="font-family: '宋体'; font-size: 10pt">）</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt">解：</span><a href="http://blog.csdn.net/v_july_v/article/details/6444021"><span style="font-family: 'Times New Roman'; color: #0000ff; font-size: 10pt">http://blog.csdn.net/v_july_v/article/details/6444021</span></a> </p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<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"><br />&nbsp;&nbsp;dp[i]&nbsp;=&nbsp;max(dp[i-1]+a[i]&nbsp;,a[i]);<br />&nbsp;&nbsp;Time&nbsp;&nbsp;O(n)<br />&nbsp;&nbsp;Space&nbsp;O(n)<br /></span><span style="color: #008000">*/</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;MaxSubSeq(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a[]&nbsp;,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">left&nbsp;,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">right&nbsp;,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">answer){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;the&nbsp;start&nbsp;position&nbsp;is&nbsp;left&nbsp;and&nbsp;the&nbsp;end&nbsp;position&nbsp;is&nbsp;right.&nbsp;sum[leftrgiht]&nbsp;=&nbsp;answer&nbsp;&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;previous&nbsp;,&nbsp;current&nbsp;,&nbsp;preBegin&nbsp;,&nbsp;preEnd&nbsp;,&nbsp;curBegin&nbsp;,&nbsp;curEnd;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;previous&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;answer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;preBegin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;preEnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;right&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</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;;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;n&nbsp;;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(previous&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;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[i]&nbsp;;&nbsp;curBegin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;curEnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i&nbsp;;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;previous&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;a[i]&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curBegin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;preBegin&nbsp;;&nbsp;curEnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previous&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;current&nbsp;&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preBegin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;curBegin&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preEnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;curEnd&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(answer&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;current&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;answer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;current&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;curBegin&nbsp;;&nbsp;&nbsp;right&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;curEnd&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div>
<p style="margin-top: 0pt; margin-bottom: 0pt"><br /></p><img src ="http://www.cppblog.com/IronOxide/aggbug/188668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IronOxide/" target="_blank">IronOxide</a> 2012-08-29 20:59 <a href="http://www.cppblog.com/IronOxide/archive/2012/08/29/188668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Redis源码剖析：哈希表</title><link>http://www.cppblog.com/IronOxide/archive/2012/08/29/188667.html</link><dc:creator>IronOxide</dc:creator><author>IronOxide</author><pubDate>Wed, 29 Aug 2012 12:41:00 GMT</pubDate><guid>http://www.cppblog.com/IronOxide/archive/2012/08/29/188667.html</guid><wfw:comment>http://www.cppblog.com/IronOxide/comments/188667.html</wfw:comment><comments>http://www.cppblog.com/IronOxide/archive/2012/08/29/188667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IronOxide/comments/commentRss/188667.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IronOxide/services/trackbacks/188667.html</trackback:ping><description><![CDATA[<span style="font-family: '宋体'; font-size: 10pt; font-weight: bold">声明：本文版权归IronOxide所有，博客地址：<a href="http://www.cppblog.com/IronOxide/"><span style="color: #3366ff">http://www.cppblog.com/IronOxide/</span></a></span><br />&nbsp;<br /><strong><span style="font-size: 12pt">Hash</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">表（</span></strong><strong><span style="font-size: 12pt">Hash Table</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">）</span></strong><strong><span style="font-size: 12pt"></span></strong>
<p><strong>&nbsp;</strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; hash</span><span style="font-family: 宋体">表实际上由</span>size<span style="font-family: 宋体">个的桶组成一个桶数组</span>table[0...size-1] <span style="font-family: 宋体">。当一个对象经过哈希之后，</span><span style="font-family: 宋体">得到一个相应的</span>value , <span style="font-family: 宋体">于是我们把这个对象放到桶</span>table[ value ]<span style="font-family: 宋体">中。当一个桶中有</span><span style="font-family: 宋体">多个对象时，我们把桶中的对象组织成为一个链表。这在冲突处理上称之为</span><span style="font-family: 宋体; color: red">拉链法。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体; font-size: 12pt">负载因子（</span></strong><strong><span style="font-size: 12pt">load factor</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">）</span></strong><strong><span style="font-size: 12pt"> </span></strong></p>
<p><strong>&nbsp;</strong></p>
<p><span>&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-family: 宋体">假设一个</span>hash<span style="font-family: 宋体">表中桶的个数为</span> size , <span style="font-family: 宋体">存储的元素个数为</span>used .<span style="font-family: 宋体">则我们称</span> used / size <span style="font-family: 宋体">为</span><span style="font-family: 宋体; color: red">负载因子</span><span style="color: red">loadFactor </span>. <span style="font-family: 宋体">一般的情况下，当</span>loadFactor&lt;=1<span style="font-family: 宋体">时，</span>hash<span style="font-family: 宋体">表查找的期望复杂度为</span>O(1).&nbsp;<span style="font-family: 宋体">因此，每次往</span>hash<span style="font-family: 宋体">表中添加元素时，我们必须保证是在</span>loadFactor &lt;1<span style="font-family: 宋体">的情况下，才能够添加。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: 宋体; font-size: 12pt">容量扩张（</span></strong><strong><span style="font-size: 12pt">Expand</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">）</span></strong><strong><span style="font-size: 12pt">&amp;&nbsp;</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">分摊转移</span></strong><strong></strong></p>
<p><strong>&nbsp;</strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">当我们添加一个新元素时，一旦</span>loadFactor<span style="font-family: 宋体">大于等于</span>1<span style="font-family: 宋体">了，我们不能单纯的往</span>hash<span style="font-family: 宋体">表里边添加元素。因为添加完之后，</span>loadFactor<span style="font-family: 宋体">将大于</span>1<span style="font-family: 宋体">，这样也就不能保证查找的期望时间复杂度为常数级了。这时，我们应该对桶数组进行一次容量扩张，让</span>size<span style="font-family: 宋体">增大</span> <span style="font-family: 宋体">。这样就能保证添加元素后</span> used / size <span style="font-family: 宋体">仍然小于等于</span>1 <span style="font-family: 宋体">，</span> <span style="font-family: 宋体">从而保证查找的期望时间复杂度为</span>O(1).<span style="font-family: 宋体">但是，如何进行容量扩张呢？</span> C++<span style="font-family: 宋体">中的</span>vector<span style="font-family: 宋体">的容量扩张是一种好方法。于是有了如下思路</span> <span style="font-family: 宋体">：　</span>Hash<span style="font-family: 宋体">表中每次发现</span>loadFactor==1<span style="font-family: 宋体">时，就开辟一个原来桶数组的两倍空间（称为新桶数组），然后把原来的桶数组中元素全部转移过来到新的桶数组中。注意这里转移是需要元素一个个重新哈希到新桶中的，原因后面会讲到。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">这种方法的缺点是，容量扩张是一次完成的，期间要花很长时间一次转移</span>hash<span style="font-family: 宋体">表中的所有元素。这样在</span>hash<span style="font-family: 宋体">表中</span>loadFactor==1<span style="font-family: 宋体">时，往里边插入一个元素将会等候很长的时间。<br />&nbsp;&nbsp;&nbsp;&nbsp;</span>redis<span style="font-family: 宋体">中的</span>dict.c<span style="font-family: 宋体">中的设计思路是用两个</span>hash<span style="font-family: 宋体">表来进行进行扩容和转移的工作：当从第一个</span>hash<span style="font-family: 宋体">表的</span>loadFactor=1<span style="font-family: 宋体">时，如果要往字典里插入一个元素，首先为第二个</span>hash<span style="font-family: 宋体">表开辟</span>2<span style="font-family: 宋体">倍第一个</span>hash<span style="font-family: 宋体">表的容量，同时将第一个</span>hash<span style="font-family: 宋体">表的一个非空桶中元素全部转移到第二个</span>hash<span style="font-family: 宋体">表中，然后把待插入元素存储到第二个</span>hash<span style="font-family: 宋体">表里。继续往字典里插入第二个元素，又会将第一个</span>hash<span style="font-family: 宋体">表的一个非空桶中元素全部转移到第二个</span>hash<span style="font-family: 宋体">表中，然后把元素存储到第二个</span>hash<span style="font-family: 宋体">表里&#8230;&#8230;直到第一个</span>hash<span style="font-family: 宋体">表为空。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-family: 宋体">这种策略</span><span style="font-family: 宋体; color: red">就把第一个</span><span style="color: red">hash</span><span style="font-family: 宋体; color: red">表所有元素的转移分摊为多次转移</span><span style="font-family: 宋体">，而且每次转移的期望时间复杂度为</span>O(1)<span style="font-family: 宋体">。这样就不会出现某一次往字典中插入元素要等候很长时间的情况了。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">为了更深入的理解这个过程，先看看在</span>dict.h<span style="font-family: 宋体">中的两个结构体：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="font-family: Courier; color: #000000">typedef&nbsp;</span><span style="font-family: Courier; color: #0000ff">struct</span><span style="font-family: Courier; color: #000000">&nbsp;dictht&nbsp;{<br /></span><span style="font-family: Courier; color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;dictEntry&nbsp;</span><span style="font-family: Courier; color: #000000">**</span><span style="font-family: Courier; color: #000000">table;<br /></span><span style="font-family: Courier; color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="font-family: Courier; color: #0000ff">long</span><span style="font-family: Courier; color: #000000">&nbsp;size;<br /></span><span style="font-family: Courier; color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="font-family: Courier; color: #0000ff">long</span><span style="font-family: Courier; color: #000000">&nbsp;sizemask;<br /></span><span style="font-family: Courier; color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="font-family: Courier; color: #0000ff">long</span><span style="font-family: Courier; color: #000000">&nbsp;used;<br /></span><span style="font-family: Courier; color: #000000">}&nbsp;dictht;<br /><br /></span><span style="font-family: Courier; color: #000000">typedef&nbsp;</span><span style="font-family: Courier; color: #0000ff">struct</span><span style="font-family: Courier; color: #000000">&nbsp;dict&nbsp;{<br /></span><span style="font-family: Courier; color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;dictType&nbsp;</span><span style="font-family: Courier; color: #000000">*</span><span style="font-family: Courier; color: #000000">type;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: Courier; color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="font-family: Courier; color: #000000">*</span><span style="font-family: Courier; color: #000000">privdata;<br /></span><span style="font-family: Courier; color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;dictht&nbsp;ht[</span><span style="font-family: Courier; color: #000000">2</span><span style="font-family: Courier; color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: Courier; color: #0000ff">int</span><span style="font-family: Courier; color: #000000">&nbsp;rehashidx;&nbsp;</span><span style="font-family: Courier; color: #008000">/*</span><span style="font-family: Courier; color: #008000">&nbsp;rehashing&nbsp;not&nbsp;in&nbsp;progress&nbsp;if&nbsp;rehashidx&nbsp;==&nbsp;-1&nbsp;</span><span style="font-family: Courier; color: #008000">*/</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: Courier; color: #0000ff">int</span><span style="font-family: Courier; color: #000000">&nbsp;iterators;&nbsp;</span><span style="font-family: Courier; color: #008000">/*</span><span style="font-family: Courier; color: #008000">&nbsp;number&nbsp;of&nbsp;iterators&nbsp;currently&nbsp;running&nbsp;</span><span style="font-family: Courier; color: #008000">*/</span><span style="color: #000000"><br /></span><span style="font-family: Courier; color: #000000">}&nbsp;dict;</span><span style="color: #000000"><br /></span></div>
<p style="text-indent: 21pt"></p>
<p style="text-indent: 26.25pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.5" class="MsoNormal"><span lang="EN-US"><font face="Calibri">dictht</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">指的就是上面说的桶数组，</span><span lang="EN-US"><font face="Calibri">size</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">用来表示容量，一般为</span><span lang="EN-US"><font face="Calibri">2^n </font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">，</span><span lang="EN-US"><font face="Calibri">sizemask</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">（一般为</span><span lang="EN-US"><font face="Calibri">2^n-1,</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">二进制表示为</span><span lang="EN-US"><font face="Calibri">n</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">个</span><span lang="EN-US"><font face="Calibri">1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">）用来对哈希值取模</span><span lang="EN-US"><font face="Calibri"> , used</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">表示</span><span lang="EN-US"><font face="Calibri">hash</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">表中存储了多少个元素。</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dict</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">表示字典，由两个桶数组组成，</span><span lang="EN-US"><font face="Calibri">type</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">是一些函数指针（哈希函数及</span><span lang="EN-US"><font face="Calibri">key</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">，</span><span lang="EN-US"><font face="Calibri">value</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的一些处理函数）。<br /><br /></span></p>
<p style="text-indent: 21pt"></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-size: 12pt" lang="EN-US"><font face="Calibri">d-&gt;rehashidx <o:p></o:p></font></span></strong></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-size: 12pt" lang="EN-US"><o:p><font face="Calibri">&nbsp;</font></o:p></span></strong></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">这个变量的理解很关键：</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span lang="EN-US"><font face="Calibri">d-&gt;rehashidx </font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">表明了新元素到底是存储到桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中，还是桶数组</span><span lang="EN-US"><font face="Calibri">1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中，同时指明了</span><span lang="EN-US"><font face="Calibri">d-&gt;h[0]</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中到底是哪一个桶转移到</span><span lang="EN-US"><font face="Calibri">d-&gt;h[1]</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">当</span><span lang="EN-US"><font face="Calibri">d-&gt;rehashidx==-1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">时，这时新添加的元素应该存储在桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">里边。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">当</span><span lang="EN-US"><font face="Calibri">d-&gt;rehashidx!=-1 </font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">时，表示应该将桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中的第一个非空桶元素全部转移到桶数组</span><span lang="EN-US"><font face="Calibri">1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中来</span><span lang="EN-US"><font face="Calibri">(</font></span><span style="font-family: 宋体; color: red; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">不妨称这个过程为桶转移，或者称为</span><span lang="EN-US"><font face="Calibri"><span style="color: red">rehash)</span></font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">。这个过程必须将非空桶中的元素一个个重新哈希放到桶数组</span><span lang="EN-US"><font face="Calibri">1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中，因为</span><span lang="EN-US"><font face="Calibri">d-&gt;h[1]-&gt;sizemask</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">已经不同于</span><span lang="EN-US"><font face="Calibri">d-&gt;h[0]-&gt;sizemask</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">了。这时新添加的元素应该存储在桶数组</span><span lang="EN-US"><font face="Calibri">1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">里边，因为此刻的桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的</span><span lang="EN-US"><font face="Calibri">loadFactor</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">为</span><span lang="EN-US"><font face="Calibri">1 </font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">，而桶数组</span><span lang="EN-US"><font face="Calibri">1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的</span><span lang="EN-US"><font face="Calibri">loadFactor</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">小于</span><span lang="EN-US"><font face="Calibri">1 </font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">。</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p><font face="Calibri">&nbsp;</font></o:p></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">当发现桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中的元素全部都转移到桶数组</span><span lang="EN-US"><font face="Calibri">1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中，即桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">为空时。释放桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的空间，把桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的指针指向桶数组</span><span lang="EN-US"><font face="Calibri">1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">。将</span><span lang="EN-US"><font face="Calibri">d-&gt;rehashidx</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">赋值为</span><span lang="EN-US"><font face="Calibri">-1 </font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">，</span><font face="Calibri"> </font><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">这样桶数组</span><span lang="EN-US"><font face="Calibri">1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">就空了，下次添加元素时，仍然添加到桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中。直到桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的元素个数超过桶的个数，我们又重新开辟桶数组</span><span lang="EN-US"><font face="Calibri">0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的</span><span lang="EN-US"><font face="Calibri">2</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">倍空间给桶数组</span><span lang="EN-US"><font face="Calibri">1 </font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">，</span><font face="Calibri"> </font><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">同时修改</span><span lang="EN-US"><font face="Calibri">d-&gt;rehashidx=0</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">，这样下次添加元素是就添加到桶数组</span><span lang="EN-US"><font face="Calibri">1</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中去了。</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p><font face="Calibri">&nbsp;</font></o:p></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">值得注意的是，在每次删除、查找、替换操作进行之前，根据</span><span lang="EN-US"><font face="Calibri">d-&gt;rehashidx</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的状态来判断是否需要进行桶转移。这可以加快转移速度。</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p><font face="Calibri">&nbsp;</font></o:p></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">下面是一份精简的伪代码，通过依次插入</span><span lang="EN-US"><font face="Calibri">element[1..n]</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">这</span><span lang="EN-US"><font face="Calibri">n</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">个元素到</span><span lang="EN-US"><font face="Calibri">dict</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">来详细描述容量扩张及转移的过程：<br /><br /></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; text-decoration: ; padding-top: 4px"><!--<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">初始化两个hash表</span><span style="color: #008000"><br /></span><span style="color: #000000">d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">0</span><span style="color: #000000">].size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;;&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">1</span><span style="color: #000000">].used&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">分配四个空桶</span><span style="color: #008000"><br /></span><span style="color: #000000">d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">1</span><span style="color: #000000">].size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">1</span><span style="color: #000000">].used&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">初始化一个空表</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;<br /></span><span style="color: #0000ff">for</span><span style="color: #000000">(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;;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;n&nbsp;;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">rehashidx&nbsp;</span><span style="color: #000000">!=-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;){<br />&nbsp;&nbsp;&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">(d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">0</span><span style="color: #000000">]</span><span style="color: #000000">-&gt;</span><span style="color: #000000">used&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">0</span><span style="color: #000000">]中一个非空桶元素转移（重新hash）到&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">1</span><span style="color: #000000">]中&nbsp;&nbsp;；&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;上一步会使得:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;d-&gt;h[0]-&gt;used&nbsp;-=&nbsp;转移的元素个数&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;d-&gt;h[1]-&gt;used&nbsp;+=&nbsp;转移的元素个数&nbsp;；</span><span style="color: #008000"><br /></span><span style="color: #000000">&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;element[i]&nbsp;哈希到&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">1</span><span style="color: #000000">]中&nbsp;&nbsp;;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;d-&gt;h[1]-&gt;used&nbsp;++&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用桶数组1覆盖桶数组0；&nbsp;赋值前要释放d-&gt;h[0]的空间，赋值后重置d-&gt;h[1])</span><span style="color: #008000"><br /></span><span style="color: #000000">&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;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">rehashidx&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">&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把element[i]哈希到d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">0</span><span style="color: #000000">]中；</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;d-&gt;h[0]-&gt;used&nbsp;++&nbsp;;&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">0</span><span style="color: #000000">]</span><span style="color: #000000">-&gt;</span><span style="color: #000000">used&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">0</span><span style="color: #000000">]</span><span style="color: #000000">-&gt;</span><span style="color: #000000">size&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</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: #0000ff">new</span><span style="color: #000000">&nbsp;bucket[</span><span style="color: #000000">2</span><span style="color: #000000">*</span><span style="color: #000000">d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">0</span><span style="color: #000000">]</span><span style="color: #000000">-&gt;</span><span style="color: #000000">size&nbsp;];&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;d-&gt;h[0]-&gt;size&nbsp;等于d-&gt;h[0]-&gt;size的2倍&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把element[i]哈希到d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">1</span><span style="color: #000000">]中&nbsp;;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;d-&gt;h[1]-&gt;used&nbsp;++&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">rehashidx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&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;&nbsp;<br />&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;把element[i]哈希到d</span><span style="color: #000000">-&gt;</span><span style="color: #000000">h[</span><span style="color: #000000">0</span><span style="color: #000000">]中;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;d-&gt;h[0]-&gt;used&nbsp;++&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><br /><br /><br /></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">字典的迭代器（</span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-size: 12pt" lang="EN-US"><font face="Calibri">Iterator</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">）</span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></strong></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p><font face="Calibri">&nbsp;</font></o:p></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">分为<strong style="mso-bidi-font-weight: normal">安全迭代器</strong></span><span lang="EN-US"><font face="Calibri">( safe Iterator )</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">和<strong style="mso-bidi-font-weight: normal">非安全迭代器</strong></span><font face="Calibri"> </font><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">。<br /><br /></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">安全迭代器能够保证在迭代器未释放之前，字典两个</span><span lang="EN-US"><font face="Calibri">hash</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">表之间不会进行桶转移。<br /><br /></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">桶转移对迭代器的影响是非常大的，假设一个迭代器指向</span><span lang="EN-US"><font face="Calibri">d-&gt;h[0]</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的某个桶中的元素实体，在一次桶转移后，这个实体被</span><span lang="EN-US"><font face="Calibri">rehash</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">到</span><span lang="EN-US"><font face="Calibri">d-&gt;h[1]</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中。而在</span><span lang="EN-US"><font face="Calibri">d-&gt;h[1]</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">中根本不知道哪些元素被迭代器放过过，哪些没有被访问过，这样有可能让迭代器重复访问或者缺失访问字典中的一些元素。所以安全迭代器能够保证不多不少不重复的访问到所有的元素（当然在迭代过程中，不能涉及插入新元素和删除新元素的操作）。</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p><font face="Calibri">&nbsp;</font></o:p></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><br /></span></p>
<p style="text-indent: 21pt"><br /></span></p><img src ="http://www.cppblog.com/IronOxide/aggbug/188667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IronOxide/" target="_blank">IronOxide</a> 2012-08-29 20:41 <a href="http://www.cppblog.com/IronOxide/archive/2012/08/29/188667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精短的快速排序代码</title><link>http://www.cppblog.com/IronOxide/archive/2012/02/21/166124.html</link><dc:creator>IronOxide</dc:creator><author>IronOxide</author><pubDate>Tue, 21 Feb 2012 04:59:00 GMT</pubDate><guid>http://www.cppblog.com/IronOxide/archive/2012/02/21/166124.html</guid><wfw:comment>http://www.cppblog.com/IronOxide/comments/166124.html</wfw:comment><comments>http://www.cppblog.com/IronOxide/archive/2012/02/21/166124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IronOxide/comments/commentRss/166124.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IronOxide/services/trackbacks/166124.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&lt;iostream&gt;<br />#include&lt;cstdlib&gt;<br />#include&lt;cstdio&gt;<br />#include&lt;cstring&gt;<br />#include&lt;cmath&gt;<br />#include&lt;ctime&gt;<br />#include&lt;algorithm&gt;<br />#include&lt;<span style="color: #0000FF; ">set</span>&gt;<br />#include&lt;map&gt;<br />#include&lt;queue&gt;<br />#include&lt;stack&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std&nbsp;;<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;QuickSort(<span style="color: #0000FF; ">int</span>&nbsp;a[]&nbsp;,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l&nbsp;,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;r){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(l&nbsp;&gt;=&nbsp;r&nbsp;)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x&nbsp;=&nbsp;a[(l+r)&gt;&gt;1]&nbsp;,&nbsp;i&nbsp;=&nbsp;l&nbsp;,&nbsp;j&nbsp;=&nbsp;r&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">do</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(a[i]&nbsp;&lt;&nbsp;x)&nbsp;++i&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(a[j]&nbsp;&gt;&nbsp;x)&nbsp;--j&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(i&nbsp;&lt;=&nbsp;j&nbsp;)&nbsp;swap(a[i++],a[j--]);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span style="color: #0000FF; ">while</span>(i&lt;=j);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QuickSort(a&nbsp;,&nbsp;i&nbsp;,&nbsp;r)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QuickSort(a&nbsp;,&nbsp;l&nbsp;,&nbsp;j)&nbsp;;&nbsp;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(){<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a[]&nbsp;=&nbsp;{&nbsp;0&nbsp;,&nbsp;-10&nbsp;,&nbsp;1&nbsp;,&nbsp;23&nbsp;,&nbsp;100&nbsp;,&nbsp;2340&nbsp;,&nbsp;-9&nbsp;,&nbsp;124&nbsp;}&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;QuickSort(a&nbsp;,&nbsp;0&nbsp;,&nbsp;7)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0&nbsp;;&nbsp;i&nbsp;&lt;&nbsp;8&nbsp;;&nbsp;++&nbsp;i&nbsp;)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;a[i]&nbsp;&lt;&lt;&nbsp;endl&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;system("pause");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0&nbsp;;<br />}</div><img src ="http://www.cppblog.com/IronOxide/aggbug/166124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IronOxide/" target="_blank">IronOxide</a> 2012-02-21 12:59 <a href="http://www.cppblog.com/IronOxide/archive/2012/02/21/166124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Latin America Regional Contest 2009 解题报告</title><link>http://www.cppblog.com/IronOxide/archive/2011/09/09/155445.html</link><dc:creator>IronOxide</dc:creator><author>IronOxide</author><pubDate>Fri, 09 Sep 2011 06:17:00 GMT</pubDate><guid>http://www.cppblog.com/IronOxide/archive/2011/09/09/155445.html</guid><wfw:comment>http://www.cppblog.com/IronOxide/comments/155445.html</wfw:comment><comments>http://www.cppblog.com/IronOxide/archive/2011/09/09/155445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IronOxide/comments/commentRss/155445.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IronOxide/services/trackbacks/155445.html</trackback:ping><description><![CDATA[<div>比赛网址：<a href="http://acm.hunnu.edu.cn/online/?action=problem&amp;type=list&amp;courseid=68">http://acm.hunnu.edu.cn/online/?action=problem&amp;type=list&amp;courseid=68</a><br />A.树遍历题。本来以为是个树形动态规划，结果确定了比例，每次只要选择前K个儿子节点就可以了。<br />B.<br />C.<br />D.贪心算法，先优先人进去，让他们呆的时间尽量的长，再出来。<br />E.写出用电数x和付价f(x)的函数关系。发现这是一个增函数。假设你用电x,邻居用电为y.则f(x+y)=A.f(y)-f(x)=B.<br />二分求出x+y=C，化简f(y)-f(C-y)=B.发现g(y)=f(y)-f(C-y)也是个增函数。同样二分得出x和y值。<br />F.后缀数组<br />G.<br />H.<br />I.算出i点到其他所有点的距离，然后计算每个距离出线的次数，得出以i为顶点的等腰三角形个数，累加即可。复杂度为O(N^2logN)。<br />J.简单的水题啊&#8230;&#8230;<br />K.把每个区域的学生排序，然后枚举T值。二分计算出T对应的值，取最小值即可。</div><img src ="http://www.cppblog.com/IronOxide/aggbug/155445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IronOxide/" target="_blank">IronOxide</a> 2011-09-09 14:17 <a href="http://www.cppblog.com/IronOxide/archive/2011/09/09/155445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《最小割模型在信息学中应用 --- 胡伯涛》 例题程序</title><link>http://www.cppblog.com/IronOxide/archive/2010/12/19/136950.html</link><dc:creator>IronOxide</dc:creator><author>IronOxide</author><pubDate>Sun, 19 Dec 2010 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/IronOxide/archive/2010/12/19/136950.html</guid><wfw:comment>http://www.cppblog.com/IronOxide/comments/136950.html</wfw:comment><comments>http://www.cppblog.com/IronOxide/archive/2010/12/19/136950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IronOxide/comments/commentRss/136950.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IronOxide/services/trackbacks/136950.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Problem A : Network Wars&nbsp; 提交网址：http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2676参考程序：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeH...&nbsp;&nbsp;<a href='http://www.cppblog.com/IronOxide/archive/2010/12/19/136950.html'>阅读全文</a><img src ="http://www.cppblog.com/IronOxide/aggbug/136950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IronOxide/" target="_blank">IronOxide</a> 2010-12-19 16:54 <a href="http://www.cppblog.com/IronOxide/archive/2010/12/19/136950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>