﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>P.Linux Laboratory &#187; 算法</title>
	<atom:link href="http://www.penglixun.com/tag/%e7%ae%97%e6%b3%95/feed" rel="self" type="application/rss+xml" />
	<link>http://www.penglixun.com</link>
	<description>MySQL DBA &#38; Linux SA</description>
	<lastBuildDate>Sun, 22 Jan 2012 16:34:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>李开复——算法的力量</title>
		<link>http://www.penglixun.com/tech/program/algorithm_power.html</link>
		<comments>http://www.penglixun.com/tech/program/algorithm_power.html#comments</comments>
		<pubDate>Sun, 04 Jul 2010 16:15:35 +0000</pubDate>
		<dc:creator>P.Linux</dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.penglixun.com/?p=1142</guid>
		<description><![CDATA[本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/program/algorithm_power.html 算法的力量（李开复） 算法是计算机科... ]]></description>
			<content:encoded><![CDATA[<p><span style="color: #888888;">本文内容遵从<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" target="_blank">CC版权协议</a>, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明</br>网址: http://www.penglixun.com/tech/program/algorithm_power.html </p>
<p></span><a href="http://www.sciencenet.cn/blog/Print.aspx?id=240799">算法的力量（李开复）</a></p>
<p>算法是计算机科学领域最重要的基石之一，但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解，认为学计算机就是学各种编程语言，或者认为，学习最新的语言、技术、标准就是最好的铺路方法。其实大家都被这些公司误导了。编程语言虽然该学，但是学习计算机算法和理论更重要，因为计算机算法和理论更重要，因为计算机语言和开发平台日新月异，但万变不离其宗的是那些算法和理论，例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上，有位同学生动地把这些基础课程比拟为“内功”，把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式，没有功力，是不可能成为高手的。</p>
<p>算法与我</p>
<p>当我在1980年转入计算机科学系时，还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说：“知道为什么只有你们系要加一个‘科学’，而没有‘物理科学系’或‘化学科学系’吗？因为人家是真的科学，不需要画蛇添足，而你们自己心虚，生怕不‘科学’，才这样欲盖弥彰。”其实，这点他们彻底弄错了。真正学懂计算机的人（不只是“编程匠”）都对数学有相当的造诣，既能用科学家的严谨思维来求证，也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。</p>
<p>记得我读博时写的Othello对弈软件获得了世界冠军。当时，得第二名的人认为我是靠侥幸才打赢他，不服气地问我的程序平均每秒能搜索多少步棋，当他发现我的软件在搜索效率上比他快60多倍时，才彻底服输。为什么在同样的机器上，我可以多做60倍的工作呢？这是因为我用了一个最新的算法，能够把一个指数函数转换成四个近似的表，只要用常数时间就可得到近似的答案。在这个例子中，是否用对算法才是能否赢得世界冠军的关键。</p>
<p>还记得1988年贝尔实验室副总裁亲自来访问我的学校，目的就是为了想了解为什么他们的语音识别系统比我开发的慢几十倍，而且，在扩大至大词汇系统后，速度差异更有几百倍之多。他们虽然买了几台超级计算机，勉强让系统跑了起来，但这么贵的计算资源让他们的产品部门很反感，因为“昂贵”的技术是没有应用前景的。在与他们探讨的过程中，我惊讶地发现一个O(n*m)的动态规划(dynamic programming)居然被他们做成了O(n*n*m)。更惊讶的是，他们还为此发表了不少文章，甚至为自己的算法起了一个很特别的名字，并将算法提名到一个科学会议里，希望能得到大奖。当时，贝尔实验室的研究员当然绝顶聪明，但他们全都是学数学、物理或电机出身，从未学过计算机科学或算法，才犯了这么基本的错误。我想那些人以后再也不会嘲笑学计算机科学的人了吧！<br />
<span id="more-1142"></span></p>
<p>网络时代的算法</p>
<p>有人也许会说：“今天计算机这么快，算法还重要吗？”其实永远不会有太快的计算机，因为我们总会想出新的应用。虽然在摩尔定律的作用下，计算机的计算能力每年都在飞快增长，价格也在不断下降。可我们不要忘记，需要处理的信息量更是呈指数级的增长。现在每人每天都会创造出大量数据（照片，视频，语音，文本等等）。日益先进的纪录和存储手段使我们每个人的信息量都在爆炸式的增长。互联网的信息流量和日志容量也在飞快增长。在科学研究方面，随着研究手段的进步，数据量更是达到了前所未有的程度。无论是三维图形、海量数据处理、机器学习、语音识别，都需要极大的计算量。在网络时代，越来越多的挑战需要靠卓越的算法来解决。</p>
<p>再举另一个网络时代的例子。在互联网和手机搜索，如果要找附近的咖啡店，那么搜索引擎该怎么处理这个请求呢？最简单的办法就是把整个城市的咖啡馆都找出来，然后计算出它们的所在位置与你之间的距离，再进行排序，然后返回最近的结果。但该如何计算距离呢？图论里有不少算法可以解决这个问题。</p>
<p>这么做也许是最直观的，但绝对不是最迅速的。如果一个城市只有为数不多的咖啡馆，那么这么做应该没什么问题，反正计算量不大。但如果一个城市里有很多咖啡馆，又有很多用户都需要类似的搜索，那么服务器所承受的压力就大多了。在这种情况下，我们该怎样优化算法呢？</p>
<p>首先，我们可以把整个城市的咖啡馆做一次“预处理”。比如，把一个城市分成若干个“格子(grid)”，然后根据用户所在的位置把他放到某一个格子里，只对格子里的咖啡馆进行距离排序。</p>
<p>问题又来了，如果格子大小一样，那么绝大多数结果都可能出现在市中心的一个格子里，而郊区的格子里只有极少的结果。在这种情况下，我们应该把市中心多分出几个格子。更进一步，格子应该是一个“树结构”，最顶层是一个大格——整个城市，然后逐层下降，格子越来越小，这样有利于用户进行精确搜索——如果在最底层的格子里搜索结果不多，用户可以逐级上升，放大搜索范围。</p>
<p>上述算法对咖啡馆的例子很实用，但是它具有通用性吗？答案是否定的。把咖啡馆抽象一下，它是一个“点”，如果要搜索一个“面”该怎么办呢？比如，用户想去一个水库玩，而一个水库有好几个入口，那么哪一个离用户最近呢？这个时候，上述“树结构”就要改成“r-tree”，因为树中间的每一个节点都是一个范围，一个有边界的范围（参考：http://www.cs.umd.edu/~hjs/rtrees/index.html）。</p>
<p>通过这个小例子，我们看到，应用程序的要求千变万化，很多时候需要把一个复杂的问题分解成若干简单的小问题，然后再选用合适的算法和数据结构。</p>
<p>并行算法：Google的核心优势</p>
<p>上面的例子在Google里就要算是小case了！每天Google的网站要处理十亿个以上的搜索，GMail要储存几千万用户的2G邮箱，Google Earth要让数十万用户同时在整个地球上遨游，并将合适的图片经过互联网提交给每个用户。如果没有好的算法，这些应用都无法成为现实。</p>
<p>在这些的应用中，哪怕是最基本的问题都会给传统的计算带来很大的挑战。例如，每天都有十亿以上的用户访问Google的网站，使用Google的服务，也产生很多很多的日志（Log）。因为Log每份每秒都在飞速增加，我们必须有聪明的办法来进行处理。我曾经在面试中问过关于如何对Log进行一些分析处理的问题，有很多面试者的回答虽然在逻辑上正确，但是实际应用中是几乎不可行的。按照它们的算法，即便用上几万台机器，我们的处理速度都根不上数据产生的速度。</p>
<p>那么Google是如何解决这些问题的？</p>
<p>首先，在网络时代，就算有最好的算法，也要能在并行计算的环境下执行。在Google的数据中心，我们使用的是超大的并行计算机。但传统的并行算法运行时，效率会在增加机器数量后迅速降低，也就是说，十台机器如果有五倍的效果，增加到一千台时也许就只有几十倍的效果。这种事半功倍的代价是没有哪家公司可以负担得起的。而且，在许多并行算法中，只要一个结点犯错误，所有计算都会前功尽弃。</p>
<p>那么Google是如何开发出既有效率又能容错的并行计算的呢？</p>
<p>Google最资深的计算机科学家Jeff Dean认识到，Google所需的绝大部分数据处理都可以归结为一个简单的并行算法：Map and Reduce（http://labs.google.com/papers/mapreduce.html）。这个算法能够在很多种计算中达到相当高的效率，而且是可扩展的（也就是说，一千台机器就算不能达到一千倍的效果，至少也可以达到几百倍的效果）。Map and Reduce的另外一大特色是它可以利用大批廉价的机器组成功能强大的server farm。最后，它的容错性能异常出色，就算一个server farm宕掉一半，整个fram依然能够运行。正是因为这个天才的认识，才有了Map and Reduce算法。借助该算法，Google几乎能无限地增加计算量，与日新月异的互联网应用一同成长。</p>
<p>算法并不局限于计算机和网络</p>
<p>举一个计算机领域外的例子：在高能物理研究方面，很多实验每秒钟都能几个TB的数据量。但因为处理能力和存储能力的不足，科学家不得不把绝大部分未经处理的数据丢弃掉。可大家要知道，新元素的信息很有可能就藏在我们来不及处理的数据里面。同样的，在其他任何领域里，算法可以改变人类的生活。例如人类基因的研究，就可能因为算法而发明新的医疗方式。在国家安全领域，有效的算法可能避免下一个911的发生。在气象方面，算法可以更好地预测未来天灾的发生，以拯救生命。</p>
<p>所以，如果你把计算机的发展放到应用和数据飞速增长的大环境下，你一定会发现；算法的重要性不是在日益减小，而是在日益加强。</p><h2  class="related_post_title">类似的文章</h2><ul class="related_post"><li>2010年06月22日 -- <a href="http://www.penglixun.com/tech/database/database_algorithm_and_data_structure_cache_buffer_lock.html" title="数据库算法与数据结构——Cache&#038;Buffer&#038;Lock">数据库算法与数据结构——Cache&#038;Buffer&#038;Lock</a> (1)</li><li>2010年05月10日 -- <a href="http://www.penglixun.com/tech/database/database_algorithm_and_data_structure_about_sort.html" title="数据库算法与数据结构系列——排序相关">数据库算法与数据结构系列——排序相关</a> (0)</li><li>2010年04月10日 -- <a href="http://www.penglixun.com/tech/database/database_algorithm_and_data_structure_about_btree.html" title="数据库算法与数据结构系列——B树相关">数据库算法与数据结构系列——B树相关</a> (6)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.penglixun.com/tech/program/algorithm_power.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>数据库算法与数据结构——Cache&amp;Buffer&amp;Lock</title>
		<link>http://www.penglixun.com/tech/database/database_algorithm_and_data_structure_cache_buffer_lock.html</link>
		<comments>http://www.penglixun.com/tech/database/database_algorithm_and_data_structure_cache_buffer_lock.html#comments</comments>
		<pubDate>Tue, 22 Jun 2010 14:40:06 +0000</pubDate>
		<dc:creator>P.Linux</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Buffer]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Lock]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.penglixun.com/?p=1137</guid>
		<description><![CDATA[本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/database_algorithm_and_data_structure_cache_buffer_lock.html Database.Ca... ]]></description>
			<content:encoded><![CDATA[<p><span style="color: #888888;">本文内容遵从<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" target="_blank">CC版权协议</a>, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明</br>网址: http://www.penglixun.com/tech/database/database_algorithm_and_data_structure_cache_buffer_lock.html </p>
<p></span>
<div style="width:425px" id="__ss_4574492"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/plinux/databasecachebufferlock" title="Database.Cache&amp;Buffer&amp;Lock">Database.Cache&amp;Buffer&amp;Lock</a></strong><object id="__sse4574492" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=03-cachebufferlock-100622092931-phpapp02&#038;stripped_title=databasecachebufferlock" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4574492" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=03-cachebufferlock-100622092931-phpapp02&#038;stripped_title=databasecachebufferlock" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/plinux">Lixun Peng</a>.</div>
</div><h2  class="related_post_title">类似的文章</h2><ul class="related_post"><li>2009年12月14日 -- <a href="http://www.penglixun.com/tech/system/buffer_and_cache_diff.html" title="Buffer与Cache">Buffer与Cache</a> (1)</li><li>2009年10月29日 -- <a href="http://www.penglixun.com/tech/system/the_diffrents_of_page_cache_and_buffer_cache.html" title="Page Cache和Buffer Cache的区别">Page Cache和Buffer Cache的区别</a> (0)</li><li>2010年10月30日 -- <a href="http://www.penglixun.com/tech/database/static_compile_mysql_with_tcmalloc.html" title="静态编译TCMalloc到MySQL">静态编译TCMalloc到MySQL</a> (6)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.penglixun.com/tech/database/database_algorithm_and_data_structure_cache_buffer_lock.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>二分法实现TopK算法的方法</title>
		<link>http://www.penglixun.com/tech/program/dichotomy_topk_cpp.html</link>
		<comments>http://www.penglixun.com/tech/program/dichotomy_topk_cpp.html#comments</comments>
		<pubDate>Wed, 20 Jan 2010 10:06:51 +0000</pubDate>
		<dc:creator>P.Linux</dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[TopK]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.penglixun.com/?p=911</guid>
		<description><![CDATA[本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/program/dichotomy_topk_cpp.html 在Jacky一篇关于Oracle排序算法的文章... ]]></description>
			<content:encoded><![CDATA[<p><span style="color: #888888;">本文内容遵从<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" target="_blank">CC版权协议</a>, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明</br>网址: http://www.penglixun.com/tech/program/dichotomy_topk_cpp.html </p>
<p></span>在Jacky一篇关于<a href="http://www.hellodba.net/2009/12/oracle_sort.html">Oracle排序算法</a>的文章中，讨论了下Oracle的Short sort算法。文章中对此算法有详细描述，这里不赘述，大致就是通过Heap来实现。<br />
虽然Heap在处理优先队列类型的问题上很有优势，但是我一致觉得它不太适合做排序，调堆的代价其实是比较高的，每加入一个元素删除一个元素都要调堆。<br />
对于TopK的问题，我还是觉得二分法实现比较好。首先按快排的算法把数据分成两堆，左大右小，再判断左边的大堆是不是数量小于了K，小于了了就使用上次的右边界进入排序流程，不到则继续二分。<br />
程序如下：</p>

<div class="wp_codebox"><table><tr id="p9112"><td class="code" id="p911code2"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;time.h&gt;</span>
<span style="color: #339900;">#include &lt;math.h&gt;</span>
<span style="color: #339900;">#define MAXN 10000</span>
<span style="color: #339900;">#define LIMIT 500</span>
&nbsp;
<span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> last<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> count_sw, count_cmp<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">//初始化测试数据</span>
<span style="color: #0000ff;">void</span> init <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">srand</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">time</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #666666;">//参与查询的数据</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i<span style="color: #000080;">&lt;</span>MAXN<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span>  <span style="color: #0000dd;">rand</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">%</span>MAXN<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">void</span> swap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>x, <span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>y<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> t <span style="color: #008080;">;</span>
	t <span style="color: #000080;">=</span> x<span style="color: #008080;">;</span>
	x <span style="color: #000080;">=</span> y<span style="color: #008080;">;</span>
	y <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> <span style="color: #0000dd;">qsort</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> arr<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>, <span style="color: #0000ff;">int</span> start, <span style="color: #0000ff;">int</span> end<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>start <span style="color: #000080;">&lt;</span> end<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> mid <span style="color: #000080;">=</span> arr<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">rand</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">%</span><span style="color: #008000;">&#40;</span>end<span style="color: #000040;">-</span>start<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> start<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> start <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> end <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>arr<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> mid<span style="color: #008000;">&#41;</span> count_cmp<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>arr<span style="color: #008000;">&#91;</span><span style="color: #000040;">--</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> mid<span style="color: #008000;">&#41;</span> count_cmp<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>i<span style="color: #000080;">&gt;=</span>j<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			swap<span style="color: #008000;">&#40;</span>arr<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, arr<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			count_sw<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000dd;">qsort</span> <span style="color: #008000;">&#40;</span>arr, start, i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000dd;">qsort</span> <span style="color: #008000;">&#40;</span>arr, j<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, end<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> topK<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> arr<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>, <span style="color: #0000ff;">int</span> start, <span style="color: #0000ff;">int</span> end, <span style="color: #0000ff;">int</span> k<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>start <span style="color: #000080;">&lt;</span> end<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> mid <span style="color: #000080;">=</span> arr<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">rand</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">%</span><span style="color: #008000;">&#40;</span>end<span style="color: #000040;">-</span>start<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> start<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> start <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> end <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>arr<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> mid<span style="color: #008000;">&#41;</span> count_cmp<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>arr<span style="color: #008000;">&#91;</span><span style="color: #000040;">--</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> mid<span style="color: #008000;">&#41;</span> count_cmp<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>i<span style="color: #000080;">&gt;=</span>j<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			swap<span style="color: #008000;">&#40;</span>arr<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, arr<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			count_sw<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">-</span>start <span style="color: #000080;">&gt;</span> k<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			last <span style="color: #000080;">=</span> i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
			topK <span style="color: #008000;">&#40;</span>arr, start, i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>, k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span><span style="color: #008000;">&#123;</span>
			<span style="color: #0000dd;">qsort</span><span style="color: #008000;">&#40;</span>arr, start, last<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	count_sw <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	count_cmp <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	topK<span style="color: #008000;">&#40;</span>c, <span style="color: #0000dd;">0</span>, MAXN<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Result:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> MAXN <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> c<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Swaps:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> count_sw <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Campare:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> count_cmp <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>测试结果比Heap要好一些。</p><h2  class="related_post_title">类似的文章</h2><ul class="related_post"><li>2010年07月5日 -- <a href="http://www.penglixun.com/tech/program/algorithm_power.html" title="李开复——算法的力量">李开复——算法的力量</a> (1)</li><li>2010年06月22日 -- <a href="http://www.penglixun.com/tech/database/database_algorithm_and_data_structure_cache_buffer_lock.html" title="数据库算法与数据结构——Cache&#038;Buffer&#038;Lock">数据库算法与数据结构——Cache&#038;Buffer&#038;Lock</a> (1)</li><li>2009年08月20日 -- <a href="http://www.penglixun.com/entertainment/chasing_girls_algorithm.html" title="追MM各种算法">追MM各种算法</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.penglixun.com/tech/program/dichotomy_topk_cpp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>追MM各种算法</title>
		<link>http://www.penglixun.com/entertainment/chasing_girls_algorithm.html</link>
		<comments>http://www.penglixun.com/entertainment/chasing_girls_algorithm.html#comments</comments>
		<pubDate>Thu, 20 Aug 2009 08:24:05 +0000</pubDate>
		<dc:creator>P.Linux</dc:creator>
				<category><![CDATA[娱乐活动]]></category>
		<category><![CDATA[MM]]></category>
		<category><![CDATA[NP]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.penglixun.com/PLX/Blog/?p=307</guid>
		<description><![CDATA[本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/entertainment/chasing_girls_algorithm.html 来自CC大牛的Q-Zone 动态规划 你追... ]]></description>
			<content:encoded><![CDATA[<p><span style="color: #888888;">本文内容遵从<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" target="_blank">CC版权协议</a>, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明</br>网址: http://www.penglixun.com/entertainment/chasing_girls_algorithm.html </p>
<p></span>来自CC大牛的Q-Zone</p>
<p><span style="color: #3366ff;"><strong>动态规划</strong><br />
</span>你追一个MM的时候，需要对该MM身边的各闺中密友都好，这样你追MM这个问题就分解为对其MM朋友的问题，只有把这些问题都解决了，最终你才能追到MM。</p>
<p>该方法适用于聪明的MM，懂得“看一个人，不是看他如何对你，而是看他如何对他人。”的道理，并且对付这样的MM总能得到最优解。</p>
<p>该方法的缺点是开销较大，因为每个子问题都要好好对待。。。。<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p><strong><span style="color: #3366ff;"><span id="more-307"></span>贪心法<br />
</span></strong>你追一个MM的时候，从相识到相知，每次都采用最aggressive的方式，进攻进攻再进攻！从不采用迂回战术或是欲擒故纵之法！目标是以最快的速度确立两人关系。<br />
该法优点是代价小，速度快，但缺点是不是每次都能得到最优解。。。。。<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p><strong><span style="color: #3366ff;">回溯法</span></strong><br />
追一个MM，但也许你还是情窦初开的新手，不知道如何才能讨得MM的欢心，于是你只好一条路一条路的试，MM不开心了，你就回溯回去换另一种方式。当然其 间你也许会从某些途径得到一些经验，能够判断哪些路径不好，会剪枝（这就是分支估界了）。你也可以随机选择一些路径来实施，说不定能立杆见影（这就是回溯 的优化了）但总的来说，你都需要一场持久战。。。。<br />
该算法一般也能得到最优解，因为大多数MM会感动滴！！但其缺点是开销大！除非你是非要谈一场恋爱不可，否则不推荐使用。特别是你可能还有许多其他的事情要做，比如学习，比如事业。。。。<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p><span style="color: #3366ff;"><strong>NP完全问题</strong></span><br />
呵呵，那你为什么那么贱，非要去追呢？记住：“天涯何处无芳草！” 不过如果你“非如此不可”的话，建议升级你的硬件，好好学习，好好工作，加强实力，人到中年的时候也许你能解开NP难。。。。</p>
<p>补充NP：在你追了若干美女都失败告终后，你发现有一批美女追起来是一样困难的，如果你能追到其中任何一个就能追到其他所有的美女，你把这样的女人叫作NP-Complete。<br />
P=NP：这是一个美好的猜想，追美女和恐龙的难度其实一样。<br />
APX与Random：NP的美女难追，你无法完全占有她。你只好随机的去靠近她，装作若无其事；或者用一种策略，追到她的一个approximation ratio，例如50%。<br />
APX-hard：这样的女人，连一个固定的百分比都不给你，还是另谋高就吧。<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p><span style="color: #3366ff;"><strong>深度优先和广度优先</strong></span>：<br />
深度优先就是追一个mm追到底，直到失败然后换个mm继续追……<br />
广度优先就是同时追多个mm，一起发展……<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p><span style="color: #3366ff;"><strong>二叉树的前序、中序和后序遍历：</strong></span><br />
前序就是直接搞定MM，然后搞定她爸妈（左）和你自己爸妈（右）<br />
中序就是先搞定未来岳父岳父，然后搞定她，最后告诉你爸妈<br />
后续就是，让未来的岳父岳母和自己爸妈都觉得你们合适之后，才对MM下手，这个时候就没有障碍了啊<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
<span style="color: #3366ff;"><strong>网络流</strong></span><br />
追MM的时候总避免不了送礼物，但是你老是直接送礼物就会给MM造成很大的压力，于是你就想到了通过朋友来转送的方法。你希望送给MM尽可能多的礼 物，所以就是需要找到一中配送方案，就是最大流了。然而你请别人帮忙并不是不要开销的，你让A同学拿去给B同学可能需要一些花费，自然你不是一个大款，想 最小化这个花费，那么就是最小费用最大流了……</p>
<p>为啥我总是遇到NP问题呢~对于NP类问题的唯一解法就是DFS/BFS，悲剧~</p><h2  class="related_post_title">类似的文章</h2><ul class="related_post"><li>2010年07月5日 -- <a href="http://www.penglixun.com/tech/program/algorithm_power.html" title="李开复——算法的力量">李开复——算法的力量</a> (1)</li><li>2010年06月22日 -- <a href="http://www.penglixun.com/tech/database/database_algorithm_and_data_structure_cache_buffer_lock.html" title="数据库算法与数据结构——Cache&#038;Buffer&#038;Lock">数据库算法与数据结构——Cache&#038;Buffer&#038;Lock</a> (1)</li><li>2010年01月20日 -- <a href="http://www.penglixun.com/tech/program/dichotomy_topk_cpp.html" title="二分法实现TopK算法的方法">二分法实现TopK算法的方法</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.penglixun.com/entertainment/chasing_girls_algorithm.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

