<?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>指尖中的舞蹈</title>
	<atom:link href="http://www.vanjor.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.vanjor.org/blog</link>
	<description>See the ocean , also the sky</description>
	<lastBuildDate>Sun, 01 Jan 2012 02:42:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>2012没有奇迹</title>
		<link>http://www.vanjor.org/blog/2012/01/2012-with-no-miracle/</link>
		<comments>http://www.vanjor.org/blog/2012/01/2012-with-no-miracle/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 02:42:44 +0000</pubDate>
		<dc:creator>vanjor</dc:creator>
				<category><![CDATA[光影]]></category>
		<category><![CDATA[指尖心情]]></category>
		<category><![CDATA[人生]]></category>
		<category><![CDATA[总结]]></category>

		<guid isPermaLink="false">http://www.vanjor.org/blog/2012/01/2012-with-no-miracle/</guid>
		<description><![CDATA[还记得最近看的一篇天涯头条《你所不知道的冰冷的经济真相》，中间最唏嘘不已的是，现在的国家经济状况是由十年前的决定，所以很多应急的一些政策其实都是一种短视行为，因为早早的已近埋下祸根。



    

<span class="readmore"><a href="http://www.vanjor.org/blog/2012/01/2012-with-no-miracle/" title="2012没有奇迹">详细阅读:  共663 字</a></span><table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="嗜睡的旅行者" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fsleepy-traveller%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/04/18/5811220.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">嗜睡的旅行者</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="四月番番" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fapril-fighting-for-next%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/04/20/6032556.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">四月番番</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="人生如传奇" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F03%2Flife-as-legend%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">人生如传奇</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="TF-IDF统计" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F11%2Ftf-idf%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694642.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">TF-IDF统计</font>
                    </a>
                </td>
        </tr>
        <br/>
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">来自无觅网络的相关文章：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="我的阿里框架升级项目总结（谈体验优化与用户习惯的延续）" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.yixieshi.com%2Fucd%2F10821.html&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2012/05/14/26271556.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">我的阿里框架升级项目总结（谈体验优化与用户习惯的延续） (@yixieshi)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="2010 年互联网概况总结" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201101%2F2010-%25E5%25B9%25B4%25E4%25BA%2592%25E8%2581%2594%25E7%25BD%2591%25E6%25A6%2582%25E5%2586%25B5%25E6%2580%25BB%25E7%25BB%2593.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/01/30/2471173.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">2010 年互联网概况总结 (@netoearth)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="QQ2012 Beta 1发布" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201203%2Fqq2012-beta-1%25E5%258F%2591%25E5%25B8%2583.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2012/03/30/18464407.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">QQ2012 Beta 1发布 (@netoearth)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="美国YP iPad 软件设计经验分享" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.yixieshi.com%2Fit%2F10810.html&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2012/05/14/26102370.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">美国YP iPad 软件设计经验分享 (@yixieshi)</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>]]></description>
			<content:encoded><![CDATA[<p align="left">还记得最近看的一篇天涯头条《<a href="http://bbs.city.tianya.cn/tianyacity/content/62/1/568711.shtml" target="_blank">你所不知道的冰冷的经济真相</a>》，中间最唏嘘不已的是，现在的国家经济状况是由十年前的决定，所以很多应急的一些政策其实都是一种短视行为，因为早早的已近埋下祸根。</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2012/01/cat-for-2011.jpg" rel="shadowbox[post-1677];player=img;" title="cat for 2011"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="cat for 2011" border="0" alt="cat for 2011 thumb 2012没有奇迹" src="http://www.vanjor.org/blog/wp-content/uploads/2012/01/cat-for-2011_thumb.jpg" width="364" height="274" /></a></p>
<div>   <span id="more-1677"></span> </div>
<p>生活中存在一种误区，一些事情短时间内看不到收益的时候，不愿去做或难以坚持。如同投资股票市场，总是盯着短线走势，对于自身的规划，存在着许多短视的看法和行为，等到秋季大家都去菜园摘果实的时候，就可以看出当初谁没有好好开垦与播种了。</p>
<p>人生中不断的出现一些危机，当一个危机来临时，我们可能可以去全力以赴解决掉它，但是当危机如同破屋偏遭连夜雨般的到来，恐怕我们将难以去承受了，我们或许会像崇祯皇帝一样，面临着内忧外患之时，去拆东墙补西墙的挣扎为之，但是更需要思考的是，如何避免这种境遇，其实我们都是知道的，因为那些早就在一言一行中铺垫了。</p>
<p>或许，我想，有时候的痛苦是一种视角，就如同，我们总是着眼于短线，当短线的陡降或陡升，会让我们痛苦不已或欣喜若狂，倘若放眼更长远，着短线的波动，将会被平衡与稀释。</p>
<p>坚持是一件很困难的事情，当却又是很聪明的一种做法，因为我们是在努力的将一个十分的困难的事情转化为每天的一点点小困难。中断却又是可怕的，因为真可能将会抹杀掉之前的积累。就是因为那一次的中断，导致随后的次次的中断，导致现在提起笔来是那么的沉重，而在这沉默期，Google Reader 订阅居然上了100，许些惭愧。</p>
<p>放眼2011，自我的感觉是相对幸运的，在一个平静期，却又是在一个巨大的转型期，赢得了机遇，也将迎接新的挑战。</p>
<p>而2012没有奇迹，除非，从现在开始播种。</p>
<table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="嗜睡的旅行者" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fsleepy-traveller%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/04/18/5811220.jpg" width="96px" height="96px" title="2012没有奇迹" alt="5811220 2012没有奇迹" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">嗜睡的旅行者</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="四月番番" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fapril-fighting-for-next%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/04/20/6032556.jpg" width="96px" height="96px" title="2012没有奇迹" alt="6032556 2012没有奇迹" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">四月番番</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="人生如传奇" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F03%2Flife-as-legend%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" title="2012没有奇迹" alt="wordpress default 2012没有奇迹" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">人生如传奇</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="TF-IDF统计" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F11%2Ftf-idf%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694642.png" width="96px" height="96px" title="2012没有奇迹" alt="3694642 2012没有奇迹" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">TF-IDF统计</font>
                    </a>
                </td>
        </tr>
        <br/>
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">来自无觅网络的相关文章：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="我的阿里框架升级项目总结（谈体验优化与用户习惯的延续）" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.yixieshi.com%2Fucd%2F10821.html&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2012/05/14/26271556.png" width="96px" height="96px" title="2012没有奇迹" alt="26271556 2012没有奇迹" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">我的阿里框架升级项目总结（谈体验优化与用户习惯的延续） (@yixieshi)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="2010 年互联网概况总结" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201101%2F2010-%25E5%25B9%25B4%25E4%25BA%2592%25E8%2581%2594%25E7%25BD%2591%25E6%25A6%2582%25E5%2586%25B5%25E6%2580%25BB%25E7%25BB%2593.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/01/30/2471173.png" width="96px" height="96px" title="2012没有奇迹" alt="2471173 2012没有奇迹" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">2010 年互联网概况总结 (@netoearth)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="QQ2012 Beta 1发布" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201203%2Fqq2012-beta-1%25E5%258F%2591%25E5%25B8%2583.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2012/03/30/18464407.jpg" width="96px" height="96px" title="2012没有奇迹" alt="18464407 2012没有奇迹" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">QQ2012 Beta 1发布 (@netoearth)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="美国YP iPad 软件设计经验分享" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.yixieshi.com%2Fit%2F10810.html&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2012/05/14/26102370.jpg" width="96px" height="96px" title="2012没有奇迹" alt="26102370 2012没有奇迹" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">美国YP iPad 软件设计经验分享 (@yixieshi)</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><h3>相关文章</h3><ul><li><a href="http://www.vanjor.org/blog/2011/04/april-fighting-for-next/" title="四月番番 2011.04.20">四月番番</a>(0)</li>
<li><a href="http://www.vanjor.org/blog/2011/04/sleepy-traveller/" title="嗜睡的旅行者 2011.04.18">嗜睡的旅行者</a>(0)</li>
</ul><h3>最近评论</h3><ul></ul>]]></content:encoded>
			<wfw:commentRss>http://www.vanjor.org/blog/2012/01/2012-with-no-miracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>读《浪潮之巅》</title>
		<link>http://www.vanjor.org/blog/2011/09/langchaozhidian/</link>
		<comments>http://www.vanjor.org/blog/2011/09/langchaozhidian/#comments</comments>
		<pubDate>Sun, 11 Sep 2011 12:17:08 +0000</pubDate>
		<dc:creator>vanjor</dc:creator>
				<category><![CDATA[书香]]></category>
		<category><![CDATA[艺览世界]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[浪潮之巅]]></category>

		<guid isPermaLink="false">http://www.vanjor.org/blog/2011/09/langchaozhidian/</guid>
		<description><![CDATA[其实很早之前就看过《浪潮之巅》原来在Google黑板报贴出的 蓝色巨人 那一章，这次还是在中秋长假到来前看到一同事在看这本书的电子书，联想起这个原来网络连载最近已经出书了，并且李开复也推荐过，边周末饶有兴趣的看完了前十八章节。

《浪潮之巅》是Google的研究院吴军写的，Google黑板报中著名的连载《数学之美》也是他写的，对做数据挖掘，自然语言处理入门很有帮助，他写东西的特点是能将那些深奥的东西通过浅显易懂的方式让人理解与易于接受，比教科书中那些枯涩的公式概念更能让人快速入门与了解概况。 

<span class="readmore"><a href="http://www.vanjor.org/blog/2011/09/langchaozhidian/" title="读《浪潮之巅》">详细阅读:  共1500 字</a></span><table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="生命之殇" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F04%2Flife-shang%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F09%2Flangchaozhidian%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694707.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">生命之殇</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="推荐系统之协同过滤概述" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Frs-collaborative-filtering%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F09%2Flangchaozhidian%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/05/10/8195987.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">推荐系统之协同过滤概述</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="Web2.0之Mashup初探" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F08%2Fweb2-0-mashup%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F09%2Flangchaozhidian%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694677.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Web2.0之Mashup初探</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="评论潜在方面观点计算" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F12%2Flatent-aspect-rating-analysis%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F09%2Flangchaozhidian%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694494.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">评论潜在方面观点计算</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>]]></description>
			<content:encoded><![CDATA[<p>其实很早之前就看过《<a href="http://book.douban.com/subject/6709783/" target="_blank">浪潮之巅</a>》原来在Google黑板报贴出的 蓝色巨人 那一章，这次还是在中秋长假到来前看到一同事在看这本书的电子书，联想起这个原来网络连载最近已经出书了，并且李开复也推荐过，边周末饶有兴趣的看完了前十八章节。</p>
<p>《浪潮之巅》是Google的研究院<a href="http://www.cs.jhu.edu/~junwu/" target="_blank">吴军</a>写的，Google黑板报中著名的连载《<a href="http://wiki.52nlp.cn/%E6%95%B0%E5%AD%A6%E4%B9%8B%E7%BE%8E" target="_blank">数学之美</a>》也是他写的，对做数据挖掘，自然语言处理入门很有帮助，他写东西的特点是能将那些深奥的东西通过浅显易懂的方式让人理解与易于接受，比教科书中那些枯涩的公式概念更能让人快速入门与了解概况。 </p>
<div>   <span id="more-1668"></span> </div>
<p>看了浪潮之巅，感受最深的就是一个转搞 IT的研究员居然知道这么多，而且很多是十分深刻有见解，知识面上下几百年，科学界，工业界，教育界，金融街，政府，等等，所谓读史使人明智，作为工科的人，虽然难以做到对人类文明发展史全面的了解，但是对近现在代科技历史发展历程，也是应该有一个全面的深刻的了解的，否则真的是生活工作在一片很小的树叶里，工科的学生真的就要一辈子甘愿做轮子了。</p>
<p>而吴军的这本书恰好比较内幕的全面的介绍了几大巨头科技公司的发展史，以及人类科技发展的一些规律现象，让人发现原来那些很高深诡异的企业原来是这样的，而那些很简单可能恰巧的事物背后原来暗藏着那么多的有趣的奥妙道理与博弈。同时还能读到很多科技界的奇闻趣事，比如motorola就是motor ola的连写，而是ola如同cola 是那是流行的后缀。</p>
<p>对于书中的内容，有几方面感受</p>
<p>1. 文中总结了计算机工业的生态链的几个定理，计算机硬件行业的 <a href="http://zh.wikipedia.org/zh/%E6%91%A9%E5%B0%94%E5%AE%9A%E5%BE%8B" target="_blank">摩尔定理</a>，与 <strong>反摩尔定理</strong>，决定的硬件行业的深刻的内在发展规律，通俗来说就是计算机硬件速度每18个月会翻一番（摩尔定理），如果一个IT公司今天和十八月前卖掉同样多的、同样的产品，它的营业额就要降一半（反摩尔定理）。</p>
<p>以及 <strong>安迪-比尔定理 </strong>则深刻的揭露了，硬件行业与软件行业的相互依赖与影响的规律。<strong>What Andy gives,Bill takes away </strong>(Andy 是原Intel CEO Andy Grove, Bill 就是 Microsoft 的Bill Gates了)，就是计算机软件会不断的吞噬掉计算机硬件的剩余，这个联系到今天的网络带宽也是一样的规律，人们日益活跃的网络带宽需求会吃掉每次网络带宽的增长，这样也就是带来的问题是今天中国的普遍 几兆的带宽决定中国互联网的什么样的生活。 硬件与软件应用的相辅相成的前进中，人民的科技生活也就随之不断的向前发展，当然这里不包括GFW。</p>
<p>以及第十四章中的，信息产业的规律性，<strong>70-20-10律</strong> 行业老大大二大三的份额稳态，<strong>诺威尔定理</strong>，公司市场占有率超过50%就决定了发展的饱和趋势，并决定了一个市场占有主导地位的公司必须不断的开拓新的财源，才能做到长盛不衰。以及可行的开拓的两种方式：Leverage现有的业务和转型。<strong>基因决定定理 </strong>则让我们发现连那些大型的企业都有一种不可忽视的思维定势。</p>
<p>2. 对IT科技与金融界的关系的探讨，通过一种标准型的IT科技公司创业史，在资本市场的操作下，通过天使投资，风险投资，IPO上市，每一次的融资，凭借资本的力量和巨大的杠杆左右，资本市场就在这每次的操作下进行十倍，百倍的扩增，创业者，早起员工，风险投资者的资本就这样一夜暴富；也进一步了解创业的各个环节问题，上市后长远利益与资本投资家的利益要求的矛盾，这才知道原来那些大公司其实都有很多苦不堪言的压力。</p>
<p>3. 关于一种的斯坦福大学的办学理念机制，与硅谷的相互发展与支持。以及对商业模式的探讨，什么样的模式才真的是一个商业的印钞机，创业需要考虑那些核心重要的因素。</p>
<p>决定在amazon买下这本书《<a href="https://www.amazon.cn/%E6%B5%AA%E6%BD%AE%E4%B9%8B%E5%B7%85-%E5%90%B4%E5%86%9B/dp/B005DSK504" target="_blank">浪潮之巅</a>》看下最后几章节，也做下收藏。</p>
<table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="生命之殇" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F04%2Flife-shang%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F09%2Flangchaozhidian%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694707.jpg" width="96px" height="96px" title="读《浪潮之巅》" alt="3694707 读《浪潮之巅》" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">生命之殇</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="推荐系统之协同过滤概述" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Frs-collaborative-filtering%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F09%2Flangchaozhidian%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/05/10/8195987.jpg" width="96px" height="96px" title="读《浪潮之巅》" alt="8195987 读《浪潮之巅》" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">推荐系统之协同过滤概述</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="Web2.0之Mashup初探" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F08%2Fweb2-0-mashup%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F09%2Flangchaozhidian%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694677.jpg" width="96px" height="96px" title="读《浪潮之巅》" alt="3694677 读《浪潮之巅》" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Web2.0之Mashup初探</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="“园丁”的这几天" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F03%2Fthose-days-with-garden%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F09%2Flangchaozhidian%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694618.png" width="96px" height="96px" title="读《浪潮之巅》" alt="3694618 读《浪潮之巅》" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">“园丁”的这几天</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><h3>相关文章</h3><ul><li>0</li></ul><h3>最近评论</h3><ul></ul>]]></content:encoded>
			<wfw:commentRss>http://www.vanjor.org/blog/2011/09/langchaozhidian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hadoop入门部署最佳实践</title>
		<link>http://www.vanjor.org/blog/2011/08/hadoop-step-into-action/</link>
		<comments>http://www.vanjor.org/blog/2011/08/hadoop-step-into-action/#comments</comments>
		<pubDate>Sun, 14 Aug 2011 10:06:58 +0000</pubDate>
		<dc:creator>vanjor</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[技术相关]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[分布式]]></category>
		<category><![CDATA[实践]]></category>

		<guid isPermaLink="false">http://www.vanjor.org/blog/?p=1661</guid>
		<description><![CDATA[最近因为要使用Apache下的开源项目mahout做一些文本数据挖掘研究，要研究Hadoop分布式平台。

本文主要介绍hadoop基本入门概念，各实体含义及其作用。

并参考使用Hadoop 的版本r0.20.203.0，介绍简单集群部署入门，以及结合IDE开发入门实践。

<span class="readmore"><a href="http://www.vanjor.org/blog/2011/08/hadoop-step-into-action/" title="Hadoop入门部署最佳实践">详细阅读:  共6513 字</a></span><table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="最佳实践-Java资源路径定位" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F08%2Fjava-resources-locate%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">最佳实践-Java资源路径定位</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="幸福，忧伤，生活" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F10%2Fmv-neyanbhbin%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/09/15/31140007.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">幸福，忧伤，生活</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="英文论文缩写" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F12%2Fsome-abbrs-for-english%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694492.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">英文论文缩写</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="2012没有奇迹" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2012%2F01%2F2012-with-no-miracle%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2012/01/01/13315905.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">2012没有奇迹</font>
                    </a>
                </td>
        </tr>
        <br/>
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">来自无觅网络的相关文章：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="大象的崛起！Hadoop七年发展风雨录" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201109%2F%25E5%25A4%25A7%25E8%25B1%25A1%25E7%259A%2584%25E5%25B4%259B%25E8%25B5%25B7%25EF%25BC%2581hadoop%25E4%25B8%2583%25E5%25B9%25B4%25E5%258F%2591%25E5%25B1%2595%25E9%25A3%258E%25E9%259B%25A8%25E5%25BD%2595.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/09/13/30599816.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">大象的崛起！Hadoop七年发展风雨录 (@netoearth)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="Installing and Configuring Hadoop" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201007%2Finstalling-and-configuring-hadoop.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/01/19/2190551.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Installing and Configuring Hadoop (@netoearth)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="比Hadoop快11倍的分布式计算系统" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201102%2F%25E6%25AF%2594hadoop%25E5%25BF%25AB11%25E5%2580%258D%25E7%259A%2584%25E5%2588%2586%25E5%25B8%2583%25E5%25BC%258F%25E8%25AE%25A1%25E7%25AE%2597%25E7%25B3%25BB%25E7%25BB%259F.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/02/04/2554240.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">比Hadoop快11倍的分布式计算系统 (@netoearth)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="Hadoop namenode HA方案" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201009%2Fhadoop-namenode-ha%25E6%2596%25B9%25E6%25A1%2588.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Hadoop namenode HA方案 (@netoearth)</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>]]></description>
			<content:encoded><![CDATA[<p>最近因为要使用Apache下的开源项目<a href="http://mahout.apache.org/">mahout</a>做一<a href="http://www.vanjor.org/blog/wp-content/uploads/2011/08/image.png" rel="shadowbox[post-1661];player=img;" title="image"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image thumb Hadoop入门部署最佳实践" align="right" src="http://www.vanjor.org/blog/wp-content/uploads/2011/08/image_thumb.png" width="244" height="197" /></a>些文本数据挖掘研究，要研究<a href="http://hadoop.apache.org/">Hadoop</a>分布式平台。</p>
<p>本文主要介绍hadoop基本入门概念，各实体含义及其作用。</p>
<p>并参考使用Hadoop 的版本<a href="http://hadoop.apache.org/common/docs/r0.20.203.0/">r0.20.203.0</a>，介绍简单集群部署入门，以及结合IDE开发入门实践。</p>
<div></div>
<div><span id="more-1661"></span></div>
<h1>Hadoop简介</h1>
<div class="vp">
<p><a href="http://hadoop.apache.org/">Hadoop官网</a>介绍，主要三个子项目：</p>
<ul>
<li><a href="http://hadoop.apache.org/common/"><strong>Hadoop Common</strong></a>: Hadoop核心，The common utilities that support the other Hadoop subprojects. 原来为Hadoop Core</li>
<li><a href="http://hadoop.apache.org/hdfs/"><strong>Hadoop Distributed File System (HDFS™)</strong></a>: Hadoop分布式文件系统，A distributed file system that provides high-throughput access to application data. </li>
<li><a href="http://hadoop.apache.org/mapreduce/"><strong>Hadoop MapReduce</strong></a>:Hadoop MapReduce 框架， A software framework for distributed processing of large data sets on compute clusters.</li>
</ul>
<p>以及其他有Apache掌管的Hadoop相关开源项目：</p>
<ul>
<li><a href="http://avro.apache.org/"><strong>Avro™</strong></a>: 新的数据序列化格式与传输工具，将逐步取代Hadoop原有的IPC机制。A data serialization system. </li>
<li><a href="http://cassandra.apache.org/"><strong>Cassandra™</strong></a>: A scalable multi-master database with no single points of failure. </li>
<li><a href="http://incubator.apache.org/chukwa/"><strong>Chukwa™</strong></a>: A data collection system for managing large distributed systems. </li>
<li><a href="http://hbase.apache.org/"><strong>HBase™</strong></a>: 类似Google BigTable的分布式NoSQL列数据库。A scalable, distributed database that supports structured data storage for large tables. </li>
<li><a href="http://hive.apache.org/"><strong>Hive™</strong></a>: 数据仓库工具，由Facebook贡献。A data warehouse infrastructure that provides data summarization and ad hoc querying. </li>
<li><a href="http://mahout.apache.org/"><strong>Mahout™</strong></a>: A Scalable machine learning and data mining library. </li>
<li><a href="http://pig.apache.org/"><strong>Pig™</strong></a>: A high-level data-flow language and execution framework for parallel computation. </li>
<li><a href="http://zookeeper.apache.org/"><strong>ZooKeeper™</strong></a>: 分布式锁设施，提供类似Google Chubby的功能，由Facebook贡献。A high-performance coordination service for distributed applications.</li>
</ul></div>
<h1>Hadoop部署</h1>
<div class="vp">
<p>hadoop集群主要为三种模式：</p>
<ul>
<li>Standalone Mode（无集群模式） </li>
<li>Pseudo-Distributed Mode（单机集群模式，又为伪分布式） </li>
<li>Fully-Distributed Mode（多机集群模式）</li>
</ul>
<p>前两种可用来做快速学习研究，参考官方<a href="http://hadoop.apache.org/common/docs/r0.20.203.0/single_node_setup.html">部署文档</a>可很轻松上手。仅需要下载release包：<a href="http://labs.renren.com/apache-mirror/hadoop/common/">http://labs.renren.com/apache-mirror/hadoop/common/</a>，要注意，hadoop的conf/hadoop-env.sh文件中需要配置JAVA_HOME的路径，要求为1.6+版本，JVM根目录就行。另外需要手动格式化分布式文件系统：$ bin/hadoop namenode –format</p>
<p>之后，启动Hadoop后，就可以通过Web界面追踪观察了：</p>
<ul>
<li>NameNode &#8211; <a href="http://localhost:50070/">http://localhost:50070/</a></li>
<li>JobTracker &#8211; <a href="http://localhost:50030/">http://localhost:50030/</a></li>
</ul>
<h2>Hadoop实体&amp;框架</h2>
<div class="vp">
<p>部署完全分布式需要明确一些概念，参考：<a href="http://darxin.info/archive/2010/02/e046f531/">http://darxin.info/archive/2010/02/e046f531/</a></p>
<p>更详细的参考：<a href="http://ishare.iask.sina.com.cn/f/13834023.html">Hadoop in Action</a> 的2.1章节</p>
<p>Hadoop的核心功能有两个：HDFS与MapReduce </p>
<ul>
<li>与HDFS相关的服务有NameNode、SecondaryNameNode 及DataNode；</li>
<li>与MapReduce 相关的服务有JobTracker 和TaskTracker 两种。</li>
</ul>
<p>Hadoop集群中有两种角色：master与slave，master又分为主master与次master。其中：</p>
<ul>
<li>主 master同时提供NameNode 、SecondaryNameNode 及JobTracker 三种服务； </li>
<li>次master只提供SecondaryNameNode 服务； </li>
<li>所有slave可以提供DateNode 或TaskTracker 两种服务。</li>
</ul>
<p>一个Hadoop集群由多台电脑组成，每台电脑可作为一种或多种角色存在。</p>
<ul>
<li>当使用Pseudo-Distributed Mode创建Hadoop集群时，一台电脑同时完成主master和slave两种角色的任务。</li>
<li>在Fully-Distributed Mode下，如果只有一台电脑作为master，则此电脑完成主master的任务；如果有多台电脑作为master存在，则第一台电脑完成主master的任务，其它电脑完成次master的任务。</li>
</ul>
<h3>Hadoop中的5个守护进程</h3>
<div class="vp">
<p>hadoop启动后会有5个守护进程：namenode、secondarynamenode、datanode、jobtracker、tasktracker，参考对<a href="http://www.cnblogs.com/wxblogweb/archive/2011/01/26/hadoop_in_action_2.html">Hadoop in Action的第二章翻译</a></p>
<h4>NameNode</h4>
<p>NameNode就是HDFS主服务器（master), 它控制着从服务器（slave)的后台程序处理低级别的I/O任务,这些从服务器就是后面要提到的DataNode.<strong>每个集群对应一个NameNode。</strong></p>
<p>NameNode是HDFS的守护者；负责跟踪文件是如何分割成小数据块的，这些小块分别都存储到了那个数据节点上，以及整个分布式文件系统的健康环境。</p>
<p>NameNode的功能就是内存以及I/O的集中管理。</p>
<h4>DataNode</h4>
<p>集群中的每一个从服务器(slave)都会运行一个DataNode后台程序。此后台程序负责读写HDFS数据块到本地的文件系统。当你想通过客户端在HDFS控制下的文件块中进行某个数据的读写操作的时候，NameNode将会告诉客户端到哪个DataNode进行此操作。客户端将直接与此DataNode服务器上的deamons程序进行通信，并操作相关的数据块。而且，DataNode之间可以相互复制数据块，作为冗余备份。</p>
<p>DataNode会不断的向NameNode汇报运行状态。从DataNode初始化开始，每一个DataNode要向NameNode汇报每个数据存储的数据内容。数据mapping完成后，DataNode会继续通知NameNode本地的数据变化，同时也会接收NameNode法国来的创建，移动，删除本地数据块等指令。</p>
<h4>Secondary NameNode（在0.21.0中已经被其他节点所取代）</h4>
<p>Secondary NameNode (SNN) 是一个用来监控HDFS状态的辅助deamon。<strong>就像NameNode一样，每一个集群都有一个SNN</strong>，并且它实际上是属于一台单独的服务器。没有一个DataNode和TaskTracker运行在统一台服务器上。SNN不同于NameNode之处在于这个进程并不接收或者记录任何实时的数据变化。但是，它会与NameNode进行通信，以便间歇的保存HDSF元数据的快照。由于NameNode是单点的，所以通过SNN的快照功能，可以将NameNode的宕机时间和数据损失降低到最小。同时，如果NameNode发生问题，SNN可以及时的作为备用NameNode使用。</p>
<h4>JobTracker</h4>
<p>JobTracker deamon用来链接你的应用程序与Hadoop。一旦你提交代码到集群之中，JobTracker 决定哪个文件去被处理，并且为不同的task分配节点，并且监控所有运行的task。一旦某个task失败了，JobTracker就会自动重新开启这个task，也许这个task会在不同的节点上，具体运行情况取决于重启的预设值。<strong>每一个Hadoop集群只有一个JobTracker</strong>。它一般会作为集群的一个master节点。</p>
<h4>TaskTracker</h4>
<p>与存储进程相结合的，运算进程也遵循主从架构：TaskTrackers在各自的从节点上管理每个独立的task。</p>
<p>每个TaskTracker负责独立执行具体的task，而JobTracker负责分配task。虽然每个从节点上都有一个且唯一的一个TaskTracker，但是每个TaskTracker可以部署在多个JVMs之上，用于并行处理多个map以及reduce任务（task）。</p>
<p>TaskTracker的一个重要职责就是与JobTracker交互。如果JobTracker无法准时的获取到TaskTracker提交的信息，JobTracker就会假定TaskTracker已经崩溃了，JobTracker就会将任务分配给其他节点处理。</p>
</p></div>
</p></div>
<h2>Hadoop集群实践</h2>
<div class="vp">
<p>Task：对局域网中5台互连机器构建集群。</p>
<h3>STEP1：HOST ALAIS&amp;&amp;SSH</h3>
<div class="vp">
<h4>HOST配置</h4>
<p>方便管理，编辑5台机器的hosts文件：添加</p>
<pre>
<pre class="brush: java; title: ; notranslate">
#ip1# t1
#ip2# t2
#ip1# t3
#ip2# t4
#ip1# t5
</pre>
</pre>
<p>这样，我们很容易轻松来通过别名管理节点。假定让t1作为master负责namenode 以及jobtracker</p>
<p>t2，t3，t4，t5作为slave作为datanode和tasktracker</p>
<h4>制作发布ssh密钥</h4>
<p>Hadoop启动以后，Namenode是通过<a href="http://www.ssh.com/products/ssh_secure_shell/">SSH</a>（SecureShell）来启动和停止各个节点上的各种守护进程的，这就需要在节点之间执行指令的时候是不需要输入密码的方式，若我们没有设置master与slave之间的信任关系，我们每次用master访问slave是要输入密码的。</p>
<p>么配置信任关系的具体过程如下：具体原理见：<a href="http://hi.baidu.com/shirdrn/blog/item/523aec06fb28ae7d02088193.html">http://hi.baidu.com/shirdrn/blog/item/523aec06fb28ae7d02088193.html</a></p>
<p>假设五台机器一致使用vanjor为hadoop使用用户，</p>
<p>在master机器上执行命令：$ssh-keygen -t rsa，后会在/home/vanjor/.ssh目录下生成：私钥（id_rsa）,公钥（id_rsa.pub）</p>
<p>在/home/vanjor/.ssh目录下通过命令：$cp id_rsa.pub authorized_keys将id_rsa.pub内容复制到authorized_keys，没有则相当于新建后复制了。</p>
<p>在master上将文件authorized_keys拷贝到4台slave的.ssh目录里，命令为：$scp authorized_keys t2:/home/username/.ssh/ .文件权限问题，自行解决.authorized_keys的文件权限都注意通过chmod修改为644,以便远程访问。这样master在ssh到slave中就不需要通过slave口认证了。</p>
</p></div>
<h3>STEP2 解压配置：</h3>
<div class="vp">
<p>Hadoop要求所有机器上hadoop的部署目录结构要相同，并且都有一个相同的用户名的帐户，在5台机器对应相同的目录下解压hadoop源文件。</p>
<h4>配置namenode</h4>
<p>在t1到t5均配置上相同的namenode主服务器地址：</p>
<ul>
<li>位置：conf/core-site.xml</li>
<li>必须项：是</li>
<li>常用值：hdfs://<strong>t1</strong>:9000</li>
<li>说明：NameNode 主服务器的地址</li>
</ul>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;fs.default.name&lt;/name&gt;
         &lt;value&gt;hdfs://t1:9000&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<h4>配置jobtracker</h4>
<p>在t1到t5均配置上相同的jobtracker服务器地址：</p>
<ul>
<li>位置：conf/mapred-site.xml</li>
<li>必须项：是</li>
<li>常用值：http://<strong>t1</strong>:9001</li>
<li>说明：JobTracker 主服务器地址及端口</li>
</ul>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;mapred.job.tracker&lt;/name&gt;
         &lt;value&gt;t1:9001&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<h4>配置datanode</h4>
<p>在四个slave中配置如下</p>
<ul>
<li>位置：conf/hdfs-site.xml</li>
<li>必须项：否</li>
<li>默认值：0.0.0.0:50010</li>
<li>说明：DataNode 服务的地址</li>
</ul>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;dfs.replication&lt;/name&gt;
         &lt;value&gt;1&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt; </pre>
<p>此处1为hdfs冗余备份数目，value为1表示hdfs中每个文件只有单独一份，没有拷贝冗余</p>
<p>其他的一些默认配置参考：<a href="http://darxin.info/archive/2010/02/e046f531/">http://darxin.info/archive/2010/02/e046f531/</a></p>
<p>配置conf下的master与slave文件，五台机器中master均为 添加一行t1, slave中均为添加四行，t2到t5</p>
</p></div>
<p>最后，手工对master节点进行namenode格式化：$bin/hadoop namenode –format</p>
<p>这样master中启动bin/start-all.sh就可以通过web接口看是否运行正常了，更多的可以通过追踪log文件下的日志文件信息。</p>
</p></div>
</div>
<h1>开发&amp;IDE环境</h1>
<div class="vp">
<h4>hadoop eclipse 插件</h4>
<p>Hadoop程序运行可以简单的通过如样列中的：$ bin/hadoop jar hadoop-examples-*.jar grep input output &#8216;dfs[a-z.]+&#8217; ，命令行方式运行，但是实际在开发过程中，每次运行前都要打包发布，过于麻烦。</p>
<p>实际上hadoop已经内置了hadoop eclipse的插件，可在hadoop安装目录\ contrib\eclipse-plugin下找到该插件，复制到eclipse\dropins\hadoop\plugins，中即可，之后运行hadoop程序，在Run as下一级都会有一个Run on Hadoop的按钮了，详细参考：<a href="http://qa.taobao.com/?p=10659">http://qa.taobao.com/?p=10659</a>。</p>
<h4>Hadoop eclipse项目创建</h4>
<p>可以将Hadoop目录下的lib文件夹中所有jar添加到eclipse的project path中，或可以直接配置</p>
<h4>Hadoop maven项目创建</h4>
<p>在mvnrepository中查到：<a href="http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-core/0.20.203.0">http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-core/0.20.203.0</a> 在pom.xml中添加如下即可：</p>
<pre>&lt;dependency&gt;
    &lt;groupId&gt;org.apache.mahout.hadoop&lt;/groupId&gt;
    &lt;artifactId&gt;hadoop-core&lt;/artifactId&gt;
    &lt;version&gt;0.20.203&lt;/version&gt;
&lt;/dependency&gt;</pre>
<pre> </pre>
<pre>Hadoop MapReduce Framework入门，推荐程序WordCount：</pre>
<pre><a href="http://wiki.apache.org/hadoop/WordCount">http://wiki.apache.org/hadoop/WordCount</a></pre>
</div>
<p>&#160;</p>
<p>参考&amp;资料推荐&amp;下载：</p>
<ul>
<li>Hadoop in Action: <a href="http://ishare.iask.sina.com.cn/f/13834023.html">http://ishare.iask.sina.com.cn/f/13834023.html</a></li>
<li>Hadoop-The Definitive Guide: <a href="http://ishare.iask.sina.com.cn/f/13834271.html?from=like">http://ishare.iask.sina.com.cn/f/13834271.html</a></li>
<li>Hadoop 开发者入门专刊: <a href="http://ishare.iask.sina.com.cn/f/13617850.html">http://ishare.iask.sina.com.cn/f/13617850.html</a></li>
</ul>
<table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="最佳实践-Java资源路径定位" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F08%2Fjava-resources-locate%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" title="Hadoop入门部署最佳实践" alt="wordpress default Hadoop入门部署最佳实践" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">最佳实践-Java资源路径定位</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="Java应用程序打包-JarToExe" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F03%2Fjartoexe%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/20/3863204.png" width="96px" height="96px" title="Hadoop入门部署最佳实践" alt="3863204 Hadoop入门部署最佳实践" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Java应用程序打包-JarToExe</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="交叉验证" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F10%2Fcross-validation%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3693712.gif" width="96px" height="96px" title="Hadoop入门部署最佳实践" alt="3693712 Hadoop入门部署最佳实践" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">交叉验证</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="Windows常用shell命令大全" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F12%2Fwindows-shell-dos-command%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694493.png" width="96px" height="96px" title="Hadoop入门部署最佳实践" alt="3694493 Hadoop入门部署最佳实践" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Windows常用shell命令大全</font>
                    </a>
                </td>
        </tr>
        <br/>
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">来自无觅网络的相关文章：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="大象的崛起！Hadoop七年发展风雨录" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201109%2F%25E5%25A4%25A7%25E8%25B1%25A1%25E7%259A%2584%25E5%25B4%259B%25E8%25B5%25B7%25EF%25BC%2581hadoop%25E4%25B8%2583%25E5%25B9%25B4%25E5%258F%2591%25E5%25B1%2595%25E9%25A3%258E%25E9%259B%25A8%25E5%25BD%2595.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/09/13/30599816.jpg" width="96px" height="96px" title="Hadoop入门部署最佳实践" alt="30599816 Hadoop入门部署最佳实践" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">大象的崛起！Hadoop七年发展风雨录 (@netoearth)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="Installing and Configuring Hadoop" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201007%2Finstalling-and-configuring-hadoop.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/01/19/2190551.jpg" width="96px" height="96px" title="Hadoop入门部署最佳实践" alt="2190551 Hadoop入门部署最佳实践" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Installing and Configuring Hadoop (@netoearth)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="比Hadoop快11倍的分布式计算系统" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201102%2F%25E6%25AF%2594hadoop%25E5%25BF%25AB11%25E5%2580%258D%25E7%259A%2584%25E5%2588%2586%25E5%25B8%2583%25E5%25BC%258F%25E8%25AE%25A1%25E7%25AE%2597%25E7%25B3%25BB%25E7%25BB%259F.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/02/04/2554240.jpg" width="96px" height="96px" title="Hadoop入门部署最佳实践" alt="2554240 Hadoop入门部署最佳实践" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">比Hadoop快11倍的分布式计算系统 (@netoearth)</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="Hadoop namenode HA方案" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fblog.netoearth.com%2Fhtml%2F201009%2Fhadoop-namenode-ha%25E6%2596%25B9%25E6%25A1%2588.htm&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F08%2Fhadoop-step-into-action%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" title="Hadoop入门部署最佳实践" alt="wordpress default Hadoop入门部署最佳实践" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">Hadoop namenode HA方案 (@netoearth)</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><h3>相关文章</h3><ul><li>0</li></ul><h3>最近评论</h3><ul></ul>]]></content:encoded>
			<wfw:commentRss>http://www.vanjor.org/blog/2011/08/hadoop-step-into-action/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>拽着五月的尾巴</title>
		<link>http://www.vanjor.org/blog/2011/05/catch-may-tail/</link>
		<comments>http://www.vanjor.org/blog/2011/05/catch-may-tail/#comments</comments>
		<pubDate>Sun, 29 May 2011 12:39:49 +0000</pubDate>
		<dc:creator>vanjor</dc:creator>
				<category><![CDATA[指尖心情]]></category>
		<category><![CDATA[月番]]></category>
		<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://www.vanjor.org/blog/2011/05/catch-may-tail/</guid>
		<description><![CDATA[很快春天已经随着五月的到来而渐渐消逝，夏天已经随着慢热的空气不断的袭来，如今已经到了拽住五月的尾巴的时候了。

依然还记得四月份的几次吃饭，聊天之中才发现自己已经悄然成为一个现实的人，讨论未来几年实际而又无法逃避的问题，或许自己才是那个最为不安的人。

    

<span class="readmore"><a href="http://www.vanjor.org/blog/2011/05/catch-may-tail/" title="拽着五月的尾巴">详细阅读:  共936 字</a></span><table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="vanjor almost" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F05%2Fvanjor-almost%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fcatch-may-tail%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694700.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">vanjor almost</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="纪念下最近的几个第一次" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fcelebrate-something%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fcatch-may-tail%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/04/18/5835529.gif" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">纪念下最近的几个第一次</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="年后回归" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F03%2Fcome-back-after-2010%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fcatch-may-tail%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3704516.jpg" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">年后回归</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="忙" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2009%2F10%2Fbusy%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fcatch-may-tail%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">忙</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>]]></description>
			<content:encoded><![CDATA[<p>很快春天已经随着五月的到来而渐渐消逝，夏天已经随着慢热的空气不断的袭来，如今已经到了拽住五月的尾巴的时候了。</p>
<p>依然还记得四月份的几次吃饭，聊天之中才发现自己已经悄然成为一个现实的人，讨论未来几年实际而又无法逃避的问题，或许自己才是那个最为不安的人。</p>
<div>   <span id="more-1658"></span> </div>
<p>更加犹新的记得，在四五月交接的日子，忙碌殷时的学车以及准备着驾照考试，仿佛那是最后的一篇世外桃源，接下来面临的严酷的现实之前的一道避风港，专注的周围的人不所专注的，仿佛是生活在另一个世界，幸运的而又惊险的一次性通过桩考，内路与外路。当5月3号考完最后一门，在教室的等待的时候，却没有太多惊喜与冲动与领取那份任务性的结束宣告：驾照。突然发现，在学车的一个月里，已经习惯了周末奔向南五环，在那刚刚结束后的一两个周末里，显得是那么的无所适从与恐慌。再见吧508，再见吧，那些或阳光明媚微风徐徐或漫天灰蒙狂风凛冽的日子。</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/508.jpg" rel="shadowbox[post-1658];player=img;" title="508"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="508" border="0" alt="508 thumb 拽着五月的尾巴" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/508_thumb.jpg" width="244" height="184" /></a></p>
<p>当期盼在翘首期待的之中被迎来之时，时光过得漫长而又短暂，行走在大街上，一种纯粹而唯一的想法是，一天之后、一周之后，还能够这样，把一些他人习以为常的都不知不觉的如获至宝对待，但正如所期待的一样，事情总是那么对称，想得到一面必须承受得起另一面。</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/avenue.jpg" rel="shadowbox[post-1658];player=img;" title="avenue"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="avenue" border="0" alt="avenue thumb 拽着五月的尾巴" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/avenue_thumb.jpg" width="244" height="184" /></a></p>
<p>对待有些事情的态度会在时间的飞逝下偶然之下得到完全彻底的改观，对于台球也是如此，偶然的试手，变发现这是一个不需要流汗的运动，不需要担心如游泳那样需要考虑当前体质状态问题，但却可以让心在那绿色的桌布上一路驰骋上一会儿。</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/billiards.jpg" rel="shadowbox[post-1658];player=img;" title="billiards"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="billiards" border="0" alt="billiards thumb 拽着五月的尾巴" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/billiards_thumb.jpg" width="244" height="184" /></a></p>
<p>也渐渐发现同一件事物不同人的态度也迥然有异，比如电影，也欣然看到不同的分析，如同透过背后发现不同的思维。然后发现有时候甚至自己的思维都难以掌控，变化莫测，曾经看完《最爱》后一大堆感想，想用笔端不写出从电影中的每一个场景发现导演的安排，用意，人情的悲喜剧，人性背后的一种独特而又有代表性的品行，以及所在环境下走向末路的必然。然而因为时间不是为想象中的安排，耽搁下后只剩下一堆或更深或以浅淡的感想不能言语般得沉淀。同样如此，翻看同导演顾长卫所拍的《孔雀》，时间久了，就只记得一个个的鲜明的性格以及一个时代的缩影了。</p>
<p>如今已经是拽着五月的尾巴了，一切所害怕的困难，是因为躲到虚幻的避风港值中，是因为不愿走过，却想跨过的沟壑，如果知道是跨不过的，那就悉心努力的走过吧。</p>
<table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="vanjor almost" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2010%2F05%2Fvanjor-almost%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fcatch-may-tail%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3694700.jpg" width="96px" height="96px" title="拽着五月的尾巴" alt="3694700 拽着五月的尾巴" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">vanjor almost</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="纪念下最近的几个第一次" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fcelebrate-something%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fcatch-may-tail%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/04/18/5835529.gif" width="96px" height="96px" title="拽着五月的尾巴" alt="5835529 拽着五月的尾巴" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">纪念下最近的几个第一次</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="年后回归" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F03%2Fcome-back-after-2010%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fcatch-may-tail%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/03/17/3704516.jpg" width="96px" height="96px" title="拽着五月的尾巴" alt="3704516 拽着五月的尾巴" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">年后回归</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="忙" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2009%2F10%2Fbusy%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fcatch-may-tail%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" title="拽着五月的尾巴" alt="wordpress default 拽着五月的尾巴" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">忙</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><h3>相关文章</h3><ul><li><a href="http://www.vanjor.org/blog/2011/04/celebrate-something/" title="纪念下最近的几个第一次 2011.04.18">纪念下最近的几个第一次</a>(2)</li>
<li><a href="http://www.vanjor.org/blog/2011/03/come-back-after-2010/" title="年后回归 2011.03.17">年后回归</a>(4)</li>
<li><a href="http://www.vanjor.org/blog/2010/06/daily-life-using-googles/" title="Daily life using Google's 2010.06.6">Daily life using Google's</a>(2)</li>
<li><a href="http://www.vanjor.org/blog/2010/05/vanjor-almost/" title="vanjor almost 2010.05.18">vanjor almost</a>(1)</li>
<li><a href="http://www.vanjor.org/blog/2009/11/tomato-eggs-noodles/" title="西红柿鸡蛋面 2009.11.17">西红柿鸡蛋面</a>(0)</li>
<li><a href="http://www.vanjor.org/blog/2009/10/busy/" title="忙 2009.10.31">忙</a>(0)</li>
<li><a href="http://www.vanjor.org/blog/2009/10/this-days-in/" title="来帝都的这些日子 2009.10.31">来帝都的这些日子</a>(0)</li>
</ul><h3>最近评论</h3><ul><li><a class="commentor" href="" >vanjor</a> : <a class="comment_content" href="http://www.vanjor.org/blog/2011/05/catch-may-tail/#comment-265" title="View the entire comment by vanjor" >(ˇˍˇ） ~</a></li>
<li><a class="commentor" href="http://www.vanjor.org/olive" >olive</a> : <a class="comment_content" href="http://www.vanjor.org/blog/2011/05/catch-may-tail/#comment-264" title="View the entire comment by olive" >忙碌而又丰富的生活~明天会更好~</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.vanjor.org/blog/2011/05/catch-may-tail/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>排序算法大合集与思考</title>
		<link>http://www.vanjor.org/blog/2011/05/sorting-collections/</link>
		<comments>http://www.vanjor.org/blog/2011/05/sorting-collections/#comments</comments>
		<pubDate>Tue, 24 May 2011 09:34:56 +0000</pubDate>
		<dc:creator>vanjor</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[技术相关]]></category>
		<category><![CDATA[排序]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.vanjor.org/blog/2011/05/sorting-collections/</guid>
		<description><![CDATA[排序算法是数据结构课本中的经典问题，也是计算机科学的入门经典问题之一，同时排序中蕴含的思想也潜藏在其他很多其他算法问题中。这几天对排序算法进行细致的分析，研究、实现、与比较思考，做了一个较全面的综述。

      

一、概述

<span class="readmore"><a href="http://www.vanjor.org/blog/2011/05/sorting-collections/" title="排序算法大合集与思考">详细阅读:  共11103 字</a></span><table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="算法：已排序数组中找出现最多的数字" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fpuzzle-array-find-most%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fsorting-collections%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：已排序数组中找出现最多的数字</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：科克曼女生问题的一种解法" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fkirkman-puzzle%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fsorting-collections%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：科克曼女生问题的一种解法</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：求字符串指定最小全集子串" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Ffind-dic-substring%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fsorting-collections%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：求字符串指定最小全集子串</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：图论中Dijkstra最短路径搜寻算法" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fmap-dijkstra%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fsorting-collections%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/05/09/8068549.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：图论中Dijkstra最短路径搜寻算法</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>]]></description>
			<content:encoded><![CDATA[<p>排序算法是数据结构课本中的经典问题，也是计算机科学的入门经典问题之一，同时排序中蕴含的思想也潜藏在其他很多其他算法问题中。这几天对排序算法进行细致的分析，研究、实现、与比较思考，做了一个较全面的综述。</p>
<div>    <span id="more-1621"></span>  </div>
<h2>一、概述</h2>
<div class="vp">
<h3>定义</h3>
<div class="vp">
<p>参考<a href="http://zh.wikipedia.org/zh-cn/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95" target="_blank">wiki</a>百科：</p>
<p>在计算机科学与数学中，一个排序算法（Sorting algorithm）是一种能将一串数据依照特定排序方式的一种算法。最常用到的排序方式是数值顺序以及字典顺序。有效的排序算法在一些算法（例如搜索算法与合并算法）中是重要的，如此这些算法才能得到正确解答。排序算法也用在处理文字数据以及产生人类可读的输出结果。基本上，排序算法的输出必须遵守下列两个原则：</p>
<ul>
<li>输出结果为递增串行（递增是针对所需的排序顺序而言）</li>
<li>输出结果是原输入的一种排列、或是重组</li>
</ul></div>
<h3>分类</h3>
<div class="vp">
<p>主要有以下几大方面：</p>
<ul>
<li>计算复杂度：也就是时间复杂度，（最差、平均、和最好性能），依据列表（list）的大小（n）。一般而言，好的性能是O(n log n)，且坏的行为是O(n2)</li>
<li>存储器使用量：也就是空间复杂度</li>
<li>稳定度：稳定排序算法会依照相等的关键（换言之就是值）维持纪录的相对次序。也就是一个排序算法是稳定的，就是当有两个有相等关键的纪录R和S，且在原本的列表中R出现在S之前，在排序过的列表中R也将会是在S之前。</li>
<li>排序特性：插入、交换、选择、合并等等</li>
<li>排序范畴：内存排序(内排)，外存排序（外排）</li>
</ul>
<p>具体分为以下：</p>
<h4>稳定的</h4>
<ul>
<li>冒泡排序（bubble sort） — O(n2)</li>
<li>鸡尾酒排序 (Cocktail sort, 双向的冒泡排序) — O(n2)</li>
<li>插入排序 （insertion sort）— O(n2)</li>
<li>桶排序 （bucket sort）— O(n); 需要 O(k) 额外空间</li>
<li>计数排序 (counting sort) — O(n+k); 需要 O(n+k) 额外空间</li>
<li>归并排序 （merge sort）— O(n log n); 需要 O(n) 额外空间</li>
<li>原地合并排序 — O(n2)</li>
<li>二叉排序树排序 （Binary tree sort） — O(n log n)期望时间; O(n2)最坏时间; 需要 O(n) 额外空间</li>
<li>基数排序 （radix sort）— O(n·k); 需要 O(n) 额外空间</li>
</ul>
<h4>不稳定</h4>
<ul>
<li>选择排序 （selection sort）— O(n2)</li>
<li>希尔排序 （shell sort）— O(n log n) 如果使用最佳的现在版本</li>
<li>组合排序 — O(n log n)</li>
<li>堆排序 （heapsort）— O(n log n)</li>
<li>快速排序 （quicksort）— O(n log n) 期望时间, O(n2) 最坏情况；对于大的、乱数列表一般相信是最快的已知排序</li>
</ul></div>
<h3>八大基本排序</h3>
<div class="vp">
<ul>
<li><a href="http://zh.wikipedia.org/wiki/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F">冒泡排序</a> O(<i>n</i><sup><small>2</small></sup>) </li>
<li><a href="http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F">插入排序</a> O(<i>n</i><sup><small>2</small></sup>) </li>
<li><a href="http://zh.wikipedia.org/wiki/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F">选择排序</a> O(<i>n</i><sup><small>2</small></sup>) </li>
<li><a href="http://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F">归并排序</a> O(<i>n</i> log <i>n</i>) </li>
<li><a href="http://zh.wikipedia.org/wiki/%E5%A0%86%E6%8E%92%E5%BA%8F">堆排序</a> O(<i>n</i> log <i>n</i>) </li>
<li><a href="http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F">快速排序</a> O(<i>n</i> log <i>n</i>) </li>
<li><a href="http://zh.wikipedia.org/wiki/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F">希尔排序</a> O(<i>n</i><sup><small>1.25</small></sup>) </li>
<li><a href="http://zh.wikipedia.org/wiki/%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F">基数排序</a> O(<i>n</i>)</li>
</ul></div>
<h3>基本排序算法比较与总结</h3>
<div class="vp">
<p>参考严蔚敏的<a href="http://books.google.com/books?id=H3ktn0sp5LsC&amp;pg=PA289&amp;lpg=PA289#v=onepage&amp;q&amp;f=false" target="_blank">数据结构</a>中：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/c3fe421d5628.png" rel="shadowbox[post-1621];player=img;" title="排序算法"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="排序算法" border="0" alt="thumb 排序算法大合集与思考" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/thumb.png" width="484" height="478" /></a></p>
<p>关于排序算法的效率问题细致比较可以参考英文wiki：<a href="http://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_of_algorithms">http://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_of_algorithms</a></p>
</p></div>
<p>下一章节将给出这八大排序的Java算法实现</p>
</p></div>
<h2>二、八大排序算法实现</h2>
<div class="vp">
<h3>冒泡排序</h3>
<div class="vp">
<p>n 轮扫描，每次比较相邻两数，每轮冒出一个极值出来。</p>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

public class BubbleSort implements Sorter {

	@Override
	public String getName() {
		return &quot;BubbleSort&quot;;
	}

	@Override
	public void sort(int[] array) {
		int temp;
		for (int i = 0; i &lt; array.length - 1; i++) {
			// 每次将最小的冒到最前面
			for (int j = array.length - 1; j &gt; i; j--) {
				if (array[j - 1] &gt; array[j]) {
					temp = array[j - 1];
					array[j - 1] = array[j];
					array[j] = temp;
				}
			}
		}
	}
}
</pre>
</pre></div>
<h3>插入排序</h3>
<div class="vp">
<p>n 轮扫描，每次选择一个极值插入到已排序一侧中</p>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

public class InsertSort implements Sorter {

	@Override
	public String getName() {
		return &quot;InsertSort&quot;;
	}

	@Override
	public void sort(int[] array) {
		int temp;
		int j;
		// i之前的子串都是已经排序好了
		for (int i = 1; i &lt; array.length; i++) {
			j = i;
			temp = array[j];
			// 对当前位置j的数字在已排序好的子串选择合适的位置插入
			while (j &gt; 0 &amp;&amp; temp &lt; array[j - 1]) {
				// 顺移直接存放
				array[j] = array[j - 1];
				j--;
			}
			// 选择到位置，直接存放归队
			array[j] = temp;
		}
	}

}
</pre>
</pre>
<h4>折半插入排序</h4>
<p>相比简单插入排序，折半插入在已排序中寻找插入位置用折半查找：</p>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

public class HalfInsertSort implements Sorter {
	@Override
	public String getName() {
		return &quot;HalfInsertSort&quot;;
	}

	@Override
	public void sort(int[] array) {
		for (int i = 1; i &lt; array.length; i++) {
			// 二分查找寻找最佳插入位置
			int low = 0, high = i - 1;
			while (low &lt;= high) {
				int middle = (low + high) / 2;
				if (array[middle] &gt; array[i]) {
					high = middle - 1;
				} else {
					low = middle + 1;
				}
			}
			// 顺移并插入
			int cursor = i;
			int temp = array[i];
			while (cursor &gt; low) {
				array[cursor] = array[cursor - 1];
				cursor--;
			}
			array[cursor] = temp;
		}
	}
}
</pre>
</pre></div>
<h3>选择排序</h3>
<div class="vp">
<p>n 轮扫描，每次选出当前轮次的极值出来，并直接放入有序的一侧</p>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

public class SelectSort implements Sorter {

	@Override
	public String getName(){
		return &quot;SelectSort&quot;;
	}

	@Override
	public void sort(int[] array) {
		int cursor;
		int temp;
		for (int i = 0; i &lt; array.length - 1; i++) {
			//通过比较选出最小值的游标，最后才交换
			cursor = i;
			for (int j = i + 1; j &lt; array.length; j++) {
				if (array[j] &lt; array[cursor]) {
					cursor = j;
				}
			}
			if(cursor!=i){
				temp = array[i];
				array[i] = array[cursor];
				array[cursor] = temp;
			}
		}

	}

}
</pre>
</pre></div>
<h3>快速排序</h3>
<div class="vp">
<p>递归分治分割，每块，选取一个旗杆，将大数和小树分放两边，运用一low一high标记位做到就地分割</p>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

public class QuickSort implements Sorter {

	@Override
	public String getName() {
		return &quot;QuickSort&quot;;
	}

	@Override
	public void sort(int[] array) {
		if (array == null || array.length == 0) {
			return;
		}
		sort(array, 0, array.length - 1);
	}

	/**
	 * 递归式，对array中的start到end区域进行快排
	 *
	 * @param array
	 * @param start
	 * @param end
	 */
	private void sort(int[] array, int start, int end) {
		// 递归终止条件
		if (start &gt;= end) {
			return;
		}

		int low = start;
		int high = end;
		// 选择当前子数组第一个数为旗帜
		int flag = array[low];
		while (low &lt; high) {

			while (low &lt; high &amp;&amp; array[high] &gt;= flag) {
				high--;
			}
			array[low] = array[high];

			while (low &lt; high &amp;&amp; array[low] &lt;= flag) {
				low++;
			}
			array[high] = array[low];
		}
		// 此时low的位置为旗帜的最终正确位置
		array[low] = flag;

		// 递归对旗帜的两边进行排序，这是low=high
		sort(array, start, low - 1);
		sort(array, high + 1, end);
	}

}
</pre>
</pre></div>
<h3>希尔排序</h3>
<div class="vp">
<p>相比冒泡排序，相邻比较，希尔是选择一定间隔的进行比较，间隔逐渐缩短，最终做到有序，相比冒泡排序，减少了比较交换的次数。</p>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

public class ShellSort implements Sorter {

	@Override
	public String getName() {
		return &quot;ShellSort&quot;;
	}

	@Override
	public void sort(int[] array) {
		int temp;
		int inc = array.length / 2;
		while (inc &gt;= 2) {
			for (int cursor = 0; cursor &lt;= array.length - 1 - inc; cursor++) {
				if (array[cursor] &gt; array[cursor + inc]) {
					temp = array[cursor];
					array[cursor] = array[cursor + inc];
					array[cursor + inc] = temp;
				}

			}
			// 步长序列每次除2
			inc /= 2;
		}

		// 最后步长为1，知道检查无更改，即退出循环
		boolean tag = true;
		while (tag) {
			tag = false;
			for (int cursor = 0; cursor &lt; array.length - 1; cursor++) {
				if (array[cursor] &gt; array[cursor + 1]) {
					temp = array[cursor];
					array[cursor] = array[cursor + 1];
					array[cursor + 1] = temp;
					tag = true;
				}
			}
		}
	}
}
</pre>
</pre></div>
<h3>归并排序</h3>
<div class="vp">
<p>运用最基本得分治思想，将原始的数据不断的二分，排序，再归并</p>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

public class MergeSort implements Sorter {

	@Override
	public String getName(){
		return &quot;MergeSort&quot;;
	}

	@Override
	public void sort(int[] array) {
		int[] tempArray = new int[array.length];
		mergeSort(array, tempArray, 0, array.length - 1);
	}

	/**
	 * 不断分割，再合并，递归求解
	 */
	private void mergeSort(int[] array, int[] tempArray, int start, int end) {
		// 递归终止条件，最终粒度为1
		if (end &lt;= start) {
			return;
		}
		// 这里保证了start&lt;=middle,middle+1&lt;=end
		int middle = (start + end) / 2;
		// 从middle分两部分，每一部分排序后，再合并排序
		mergeSort(array, tempArray, start, middle);
		mergeSort(array, tempArray, middle + 1, end);
		// 合并
		merge(array, tempArray, start, middle, end);
	}

	/**
	 * 将两个有序数据合并，两数组的位置分别为start-&gt;middle,middle+1-&gt;end
	 */
	private void merge(int[] array, int[] tempArray, int start, int middle,
			int end) {
		int pos1, pos2, mergePos;
		//将两相邻子数组合并到临时数据中
		for (pos1 = start, pos2 = middle + 1, mergePos = start; pos1 &lt;= middle
				&amp;&amp; pos2 &lt;= end; mergePos++) {
			if (array[pos1] &gt; array[pos2]) {
				tempArray[mergePos] = array[pos2++];
			} else {
				tempArray[mergePos] = array[pos1++];
			}
		}
		//对剩余的部分直接复制
		while (pos1 &lt;= middle) {
			tempArray[mergePos++] = array[pos1++];
		}
		while (pos2 &lt;= end) {
			tempArray[mergePos++] = array[pos2++];
		}

		//将临时数据中按位置拷贝回
		int pos = start;
		while (pos &lt;= end) {
			array[pos] = tempArray[pos];
			pos++;
		}

	}
}
</pre>
</pre></div>
<h3>堆排序</h3>
<div class="vp">
<p>运用堆的特性，特殊的二叉树，顶点比两个孩子要么都大（大顶堆），要么都小（小顶堆），对于数组初始化构建后，也是一个完全二叉树，序号为p的两个孩子为2p与2p+1，先n/2轮次（从最底端非叶子节点开始）建堆，然后每次取堆顶，后调整堆，最终完成有序排序。</p>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

public class HeapSort implements Sorter {
	@Override
	public String getName() {
		return &quot;HeapSort&quot;;
	}

	public void sort(int[] array) {
		if (array == null || array.length &lt; 2) {
			return;
		}
		int len = array.length - 1;

		// 从最底层非叶子节点开始建堆
		for (int i = (len) / 2; i &gt;= 1; i--) {
			headAjust(array, i, len);
		}
		// 需要turnNum次取堆顶，获得全部排序
		int turnNum = len;
		// 当前轮次，堆顶，最大值
		int turnMax = array[1];

		// 因为array排序起点为1，所谓到1停止了
		while (turnNum &gt;= 1) {
			array[1] = array[turnNum];
			array[turnNum] = turnMax;
			turnNum--;
			// 重建堆
			headAjust(array, 1, turnNum);
			// 得到新堆堆顶
			turnMax = array[1];
		}
	}

	public void headAjust(int[] array, int start, int end) {
		int cursor;
		// 保存当前顶点start值
		int local = array[start];
		for (cursor = 2 * start; cursor &lt;= end; cursor *= 2) {
			// 取start的两个叶子节点中较大者，cursor为对应叶子节点序号
			if (cursor &lt; end &amp;&amp; array[cursor] &lt; array[cursor + 1]) {
				cursor++;
			}
			// 如果顶节点就是最大，则无需继续调节了
			if (local &gt;= array[cursor]) {
				break;
			}
			// 最大值上移到顶点
			array[start] = array[cursor];
			// 沿树向下继续建堆调整，其实也就是被替换下来的顶点找到位置
			start = cursor;
		}
		// 找到对应位置，归位
		array[start] = local;
	}
}
</pre>
</pre></div>
<h3>基数排序</h3>
<div class="vp">
<p>基数排序中的一个环节与桶排序思路很相同，就是利用数字分层，如个位，十位，百位，分别排序，每一层都可以被放在十个桶里，从0到9，进行轮次的取放，最终得到有序。</p>
<p>基数排序是典型的利用空间换时间的一种思路，有两种极端的方向：</p>
<ul>
<li>桶够多：如果带排数相差不是特别大，可以用一个足够的桶集，直接将每一个不同的数放到不同的桶里，最后桶的顺序就是数的顺序，在数的密度够均匀的情况下效率为O(n)</li>
<li>桶够少：如果按bit位来进行基数排序时，每个bit就两种情况0,1,也就是只需要两个桶，但是这样总共需要的轮次，假设最大值为M，则轮次为log(M)，时间复杂度为log(M)·O（n）</li>
</ul>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

import java.util.ArrayList;
import java.util.LinkedList;

public class RadixSort implements Sorter {

	@Override
	public String getName() {
		return &quot;RadixSort&quot;;
	}

	@Override
	public void sort(int[] array) {
		// 只是为了演示，基数所用桶，这里用高级链表API
		// 桶集A存放当前轮次开始前的状态
		ArrayList&lt;LinkedList&lt;Integer&gt;&gt; bucketA = new ArrayList&lt;LinkedList&lt;Integer&gt;&gt;();
		// 桶集B存放当前轮次排序后的状态
		ArrayList&lt;LinkedList&lt;Integer&gt;&gt; bucketB = new ArrayList&lt;LinkedList&lt;Integer&gt;&gt;();
		// 每轮次排序后颠倒后交换用
		ArrayList&lt;LinkedList&lt;Integer&gt;&gt; tempArray;
		// 基于数字排序，共10个桶
		final int bucketBase = 10;
		int temp = bucketBase;
		while ((--temp) &gt;= 0) {
			bucketA.add(new LinkedList&lt;Integer&gt;());
			bucketB.add(new LinkedList&lt;Integer&gt;());
		}
		// 找出当前最大的数，用以确定最多需要桶装填的轮次
		int maxNum = -1;
		for (int i = 0; i &lt; array.length; i++) {
			if (array[i] &gt; maxNum) {
				maxNum = array[i];
			}
		}
		// 计算轮次
		int turn = 0;
		while (maxNum &gt; 0) {
			turn++;
			maxNum /= bucketBase;
		}
		// 初始装填到A桶集中
		for (int i = 0; i &lt; array.length; i++) {
			bucketA.get(array[i] % 10).add(array[i]);
		}
		int locNum;
		int turnBaseDiv = 1;
		while ((turn--) &gt; 0) {
			// 当前轮次，对桶集中的10个桶按当前位进行重新状态
			for (int i = 0; i &lt; bucketBase; i++) {
				while (!bucketA.get(i).isEmpty()) {
					locNum = bucketA.get(i).remove();
					// 根据当前轮次比较位，找到对应的桶
					bucketB.get((locNum / turnBaseDiv) % 10).add(locNum);
				}
			}
			// 比较位前移
			turnBaseDiv *= 10;
			// 交换A，B次序
			tempArray = bucketB;
			bucketB = bucketA;
			bucketA = tempArray;
		}
		// 从桶中顺序取数
		for (int i = 0, j = 0; i &lt; 10; i++) {
			while (!bucketA.get(i).isEmpty()) {
				array[j++] = bucketA.get(i).remove();
			}
		}
	}
}
</pre>
</pre></div>
<h3>接口&amp;测试</h3>
<div class="vp">
<p>作为排序算法的接口，用作统一测试</p>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

public interface Sorter {
	public String getName();
	public void sort(int[] array);
}
</pre>
</pre>
<p>测试</p>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.sort;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

import org.junit.Assert;
import org.junit.Test;

public class SortTest {

	@Test
	public void testAll() {
		List&lt;Sorter&gt; list = new LinkedList&lt;Sorter&gt;();
		list.add(new BubbleSort());
		list.add(new HalfInsertSort());
		list.add(new HeapSort());
		list.add(new InsertSort());
		list.add(new MergeSort());
		list.add(new QuickSort());
		list.add(new RadixSort());
		list.add(new SelectSort());
		list.add(new ShellSort());

		int turns = 1000;
		for (int i = 0; i &lt; turns; i++) {
             for(Sorter sorter:list){
            	 if(sorter.getName().equals(&quot;HeapSort&quot;)){
            		 testSorterForHeapSort(sorter,i);
            	 }else{
            		 testSorter(sorter,i);
            	 }
             }
		}
	}

	public void testSorter(Sorter sorter, int num) {
		int[] source = generateArray(num);
		int[] result = Arrays.copyOf(source, source.length);
		Arrays.sort(result);
		int[] compute = Arrays.copyOf(source, source.length);
		sorter.sort(compute);
		Assert.assertTrue(sorter.getName() + &quot;:compute:&quot;
				+ Arrays.toString(compute) + &quot;:right:&quot;
				+ Arrays.toString(result), Arrays.equals(compute, result));
	}

	public void testSorterForHeapSort(Sorter sorter, int num) {
		int [] original =generateArray(num);
		int[] source = getArrayForHeapSort(original);
		Arrays.sort(original);
		int[] result = getArrayForHeapSort(original);
		int[] compute = Arrays.copyOf(source, source.length);
		sorter.sort(compute);
		Assert.assertTrue(sorter.getName() + &quot;:compute:&quot;
				+ Arrays.toString(compute) + &quot;:right:&quot;
				+ Arrays.toString(result), Arrays.equals(compute, result));
	}

	public static int[] getArrayForHeapSort(int[] src) {
		if (src == null || src.length == 0) {
			return src;
		} else {
			int[] ge = new int[src.length + 1];
			ge[0] = 0;
			for (int i = 0; i &lt; src.length; i++) {
				ge[i + 1] = src[i];
			}
			return ge;
		}
	}

	public static int[] generateArray(int lens) {
		Random rd = new Random(System.currentTimeMillis());
		int[] rs = new int[lens];
		for (int i = 0; i &lt; lens; i++) {
			rs[i] = rd.nextInt(1001);
		}
		return rs;
	}

}
</pre>
</pre></div>
</div>
<h2>排序延伸思考</h2>
<div class="vp">
<p>排序算法虽然问题很简单，就是排序，但是排序各种算法中蕴含了计算机领域中一些经典的方法：</p>
<ul>
<li><strong>递归分治思想：</strong>如合并排序，快排，都是将原问题分割都小问题，小问题的状态又有限，作为递归终态并返回。</li>
<li><strong>时间空间的转换：</strong>如基数排序，桶排序，讲细粒度的时间内比较转换为利用空间来排序，那些递归的同样，也是利用内存堆栈空间。</li>
<li><strong>问题的转化：</strong>在自然科学研究中，经常会有些直接解决当前问题比较棘手，可以将当前问题转化为另外的一个问题，然后就可以迎刃而解了，比如，计数排序，将排序转化为，比较大小计数的问题，基数排序，桶排序，利用空间本身就有大小关系，将时间上的比较问题简化为装箱操作了，然后从小箱到大箱来取数了。</li>
<li><strong>模型的抽象与利用：</strong>数据结构中许多经典的数据结构模型，都能被应用到排序中，或许思路也就是相同的，如锦标赛排序，红黑树，如堆排序，利用堆树的特性结构，也深刻表明的优秀的模型和结构以及对于问题的抽象概括是多么的重要。</li>
<li><strong>发现缺陷，优化，优化再优化：</strong>本来冒泡排序，选择排序，归并排序就够简单，能处理问题，但是细致发现冒泡排序每次都只能相邻比较，并只能是一头开始，那么就有优化版二路冒泡，折半查找，多路归并等等这些，也就说明算法的精神，能够细致发现当前的算法的优点与缺点，能够对缺陷部分进行改进。</li>
</ul>
<h3>排序还有哪些引伸问题呢？</h3>
<div class="vp">
<p>主要有以下几个方面：</p>
<ol>
<li>要排序的数组的大小，如果较大，来自硬盘，不能一次读到内存怎么办</li>
<li>要排序的数组经常变化，会有增加几个数，去掉几个数的情况，怎么办</li>
<li>对与一堆数N，只想找其中的前M个最大的数怎么办？</li>
</ol>
<h4>对于问题1：</h4>
<p>这也就是外排的问题，不同简单利用内排算法，而且提高外排效率为减小外存IO读取次数，结合上述的分析，外排，当然外存比较多，空间换时间，考虑归并排序，和桶排序，必要时可结合索引等等。</p>
<h4>对于问题2：</h4>
<p>去掉数好说，直接空挡合并就行，加数怎么办，那么用简单插入或者冒泡，得O(n)复杂度，这里可以用折半插入排序，堆排序来做，也就是log（n）的复杂度了</p>
<h4>对于问题3：</h4>
<p>一般来说，这里N&gt;&gt;M，通常来讲，选择排序复杂度 M·N，堆排序(N+M)logN，等等，那么这里对于这个问题，有一个更优方法：</p>
<p>构建一个M长度的堆（<font color="#242626"><strong>选出最大的数集，用小顶堆</strong></font>），每次从N中取出一数，与堆顶判断，若大于堆顶，则替换堆顶，并调整堆，若小，直接继续取数，最后N遍历完，堆M里的数也就为所要选择的数了。将复杂度降低到N·logM+MlogM了。</p>
<p>这个方案实际上为避免对N全集进行排列，而做太多的无用功，因为需求就在那里。</p>
</p></div>
<h3>Have Fun~！</h3>
<p>最后，如果觉得排序太枯燥，可以看看这些排序的可视化排序起来是怎样的一个感官吧~</p>
<p align="center"><iframe height="300" src="http://jsrun.it/norahiko/oxIy" frameborder="0" width="560"><br /></iframe></p>
<p>该视觉排序，参考酷壳网的一文《<a href="http://coolshell.cn/articles/3933.html" target="_blank">可视化的排序过程</a>》中所提到的一名日本程序员制做的一个<a href="http://jsdo.it/norahiko/oxIy/fullscreen">可视化的排序过程</a></p>
</div>
<table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="算法：已排序数组中找出现最多的数字" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fpuzzle-array-find-most%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fsorting-collections%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" title="排序算法大合集与思考" alt="wordpress default 排序算法大合集与思考" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：已排序数组中找出现最多的数字</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：科克曼女生问题的一种解法" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fkirkman-puzzle%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fsorting-collections%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" title="排序算法大合集与思考" alt="wordpress default 排序算法大合集与思考" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：科克曼女生问题的一种解法</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：求字符串指定最小全集子串" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Ffind-dic-substring%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fsorting-collections%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" title="排序算法大合集与思考" alt="wordpress default 排序算法大合集与思考" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：求字符串指定最小全集子串</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：图论中Dijkstra最短路径搜寻算法" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fmap-dijkstra%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fsorting-collections%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/05/09/8068549.png" width="96px" height="96px" title="排序算法大合集与思考" alt="8068549 排序算法大合集与思考" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：图论中Dijkstra最短路径搜寻算法</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><h3>相关文章</h3><ul><li><a href="http://www.vanjor.org/blog/2011/05/find-dic-substring/" title="算法：求字符串指定最小全集子串 2011.05.23">算法：求字符串指定最小全集子串</a>(0)</li>
<li><a href="http://www.vanjor.org/blog/2011/04/puzzle-array-find-most/" title="算法：已排序数组中找出现最多的数字 2011.04.24">算法：已排序数组中找出现最多的数字</a>(2)</li>
<li><a href="http://www.vanjor.org/blog/2011/04/kirkman-puzzle/" title="算法：科克曼女生问题的一种解法 2011.04.22">算法：科克曼女生问题的一种解法</a>(0)</li>
</ul><h3>最近评论</h3><ul><li><a class="commentor" href="" >vanjor</a> : <a class="comment_content" href="http://www.vanjor.org/blog/2011/05/sorting-collections/#comment-262" title="View the entire comment by vanjor" >补充一个：排序算法的声音效果：http://www.aqee.net/2010/09/22/the-...</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.vanjor.org/blog/2011/05/sorting-collections/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>算法：求字符串指定最小全集子串</title>
		<link>http://www.vanjor.org/blog/2011/05/find-dic-substring/</link>
		<comments>http://www.vanjor.org/blog/2011/05/find-dic-substring/#comments</comments>
		<pubDate>Mon, 23 May 2011 07:29:53 +0000</pubDate>
		<dc:creator>vanjor</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[技术相关]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.vanjor.org/blog/2011/05/find-dic-substring-2/</guid>
		<description><![CDATA[问题

给定一字符串str，以及一个char数组序列dic，要求找到str中包含有dic中所有不同的char的一个最小长度的子串（如果有多个，找出最左边的一个）



<span class="readmore"><a href="http://www.vanjor.org/blog/2011/05/find-dic-substring/" title="算法：求字符串指定最小全集子串">详细阅读:  共8286 字</a></span><table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="排序算法大合集与思考" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fsorting-collections%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Ffind-dic-substring%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/05/24/9439822.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">排序算法大合集与思考</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：已排序数组中找出现最多的数字" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fpuzzle-array-find-most%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Ffind-dic-substring%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：已排序数组中找出现最多的数字</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：科克曼女生问题的一种解法" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fkirkman-puzzle%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Ffind-dic-substring%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：科克曼女生问题的一种解法</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：图论中Dijkstra最短路径搜寻算法" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fmap-dijkstra%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Ffind-dic-substring%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/05/09/8068549.png" width="96px" height="96px" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：图论中Dijkstra最短路径搜寻算法</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table>]]></description>
			<content:encoded><![CDATA[<h3>问题</h3>
<blockquote><p>给定一字符串str，以及一个char数组序列dic，要求找到str中包含有dic中所有不同的char的一个最小长度的子串（如果有多个，找出最左边的一个）</p>
</blockquote>
<p>例如:str=&quot;ffaaeaaecfeaec&quot;, dic={&#8216;a&#8217;,'c&#8217;,'f&#8217;}，则最小子串为aecf，这里满足包含dic所有序列的子串有：&quot;ffaaeaaec&quot;，&quot;faaeaaec&quot;，&quot;aaeaaecf&quot;，&quot;aecf&quot;，&quot;cfea&quot;等，但是即是长度最短又是最左边的一个子串只有一个为“aecf”。</p>
<p>  <span id="more-1613"></span><br />
<h3>思路</h3>
<p>本题为字符串中的一道算法题目，也是IT公司的一道笔试题，难点在于既不是直接的字符串查找，又需要字典标记，找到所有可能的解，并且从中找出最优解，简单的分治思路，线性规划都不适合。</p>
<p>一种最直接上层的思路，就是顺序扫描串中的字符，检查当前覆盖的一段中的达标子串，并比较长度只保留当前最后解，以后每次得到新的符合要求的，只与之前最优解比较，如更优则进行替换。最后串扫描完，即返回了整串的最优解，核心在从局部最优解最终扩展到全局最优解。</p>
<p>那么具体实施的话，用一个当前最优子串 len(长度)，start（offset），end（offset），在扫描过程中也会有一个当前扫描的可能的解loc_len,loc_start,loc_end，在扫描过程中找到一解后并比较，之后需要进一步前进，这个时候如果在动态中找到当前子串的模式，不用回溯，直接原地前进，就是十分关键的，这样的话程序时间效率就是O（n）了，n为串长度。</p>
<h3>最优解答</h3>
<p>通过两个游标，一前一后从字符串开头进行扫描，不断找到局部最优解，比较得到当前最优解，通过计数器，可以得到每次的局部最优解，同时两个游标一前一后卡位，避免了回溯。这里字典可以用数组更高效，但用HashMap可以将更精髓的展现出来。</p>
<p>评估：</p>
<p>记字符串str长度为n，char序列长度为m</p>
<ul>
<li>时间复杂度：o(n)&#160; ，更精确为2n</li>
<li>空间复杂度：o(m)</li>
</ul>
<h2>Code</h2>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.str;

import java.util.HashMap;

public class BetterFindMost {

	public static String findSubString(char[] targetList, String targetStr) {

		// 异常情况直接返回
		if (targetList == null || targetStr == null || targetList.length == 0
				|| targetStr.length() == 0) {
			return null;
		}

		// 构造targetList字典表
		HashMap&lt;character   , integer&gt; mapDic = new HashMap&lt;character   , integer&gt;();

		for (char c : targetList) {
			mapDic.put(c, 0);
		}
		// 字典表也就是targetList的不同目标的累积长度的完成量
		int finished = 0;

		// 对应的起始位置
		int mostStart = 0;
		// 对应的终止位置
		int mostEnd = 0;

		// 正在进行的轮次子串起始位置
		int curStart = 0;
		// 正在进行的轮次子串终止位置
		int curEnd = 0;

		// 初始游标pos遍历targetStr
		for (int pos = 0; pos &amp;lt; targetStr.length(); pos++) {

			// 当前游标所指字符
			char posChar = targetStr.charAt(pos);

			if (mapDic.get(posChar) == null) {
				continue;
			} else if (mapDic.get(posChar) == 0) {
				//登记起点
				if (finished == 0) {
					curStart = pos;
				}
				//计数
				mapDic.put(posChar, 1);
				//任务完成量+1
				finished++;
			} else {
				//对应计数+1
				mapDic.put(posChar, mapDic.get(posChar) + 1);
			}

			//检查字串头部游标是否可以向前进，在不降低任务完成量下，缩短长度
			char startChar = targetStr.charAt(curStart);
			while (mapDic.get(startChar) == null || mapDic.get(startChar) &amp;gt; 1) {
				if (mapDic.get(startChar) != null) {
					mapDic.put(startChar, mapDic.get(startChar) - 1);
				}
				curStart++;
				startChar = targetStr.charAt(curStart);
			}

			//登记当前轮次解，比较得出当前最优解，同时头部迁移，已完成任务量-1，继续找下一个满足条件
			if (finished == mapDic.size()) {
				//登记结尾
				curEnd = pos + 1;
				System.out.println(targetStr.substring(curStart, curEnd));

				if (((mostEnd - mostStart) == 0)
						|| ((curEnd - curStart) &amp;lt; (mostEnd - mostStart))) {
					mostStart = curStart;
					mostEnd = curEnd;
				}
				mapDic.put(targetStr.charAt(curStart), 0);
				curStart++;
				finished--;
			}

		}
		// 如果能找到，则返回结果
		if ((mostEnd - mostStart) != 0) {
			return targetStr.substring(mostStart, mostEnd);
		}
		return null;
	}
}
</pre>
</pre>
<h2>Test</h2>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.str;

import junit.framework.Assert;

import org.junit.Test;

public class BetterFindMostTest {
	@Test
	public void testFindSubString0() {
		char[] array = new char[] {};
		String str = &quot;aaacdac&quot;;
		Assert.assertEquals(FindMost.findSubString(array, str) == null, true);
	}

	@Test
	public void testFindSubString1() {
		char[] array = new char[] { 'a' };
		String str = &quot;&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str) == null, true);
	}

	@Test
	public void testFindSubString2() {
		char[] array = new char[] { 'a' };
		String str = &quot;cccaaacc&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str),BetterFindMost.findSubString(array, str).equals(&quot;a&quot;),
				true);
	}

	@Test
	public void testFindSubString3() {
		char[] array = new char[] { 'f' };
		String str = &quot;cccaaacc&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str) == null, true);
	}

	@Test
	public void testFindSubString4() {
		char[] array = new char[] { 'a', 'c' };
		String str = &quot;cccaaacc&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str).equals(&quot;ca&quot;),
				true);
	}

	@Test
	public void testFindSubString5() {
		char[] array = new char[] { 'a', 'c' };
		String str = &quot;ffaecfecfaec&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str), BetterFindMost
				.findSubString(array, str).equals(&quot;aec&quot;), true);
	}

	@Test
	public void testFindSubString6() {
		char[] array = new char[] { 'a', 'c' ,'f'};
		String str = &quot;ffaaeaaecfeaec&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str), BetterFindMost
				.findSubString(array, str).equals(&quot;aecf&quot;), true);
	}

	@Test
	public void testFindSubString7() {
		char[] array = new char[] { 'a', 'c' ,'k'};
		String str = &quot;ffaeecfeacfaec&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str), BetterFindMost
				.findSubString(array, str)==null, true);
	}

	@Test
	public void testFindSubString8() {
		char[] array = new char[] { 'a', 'c' };
		String str = &quot;ffaeacfecfaec&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str), BetterFindMost
				.findSubString(array, str).equals(&quot;ac&quot;), true);
	}

	@Test
	public void testFindSubString9() {
		char[] array = new char[] { 'a', 'c' ,'f'};
		String str = &quot;ffaeaaecfaeaec&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str), BetterFindMost
				.findSubString(array, str).equals(&quot;cfa&quot;), true);
	}

	@Test
	public void testFindSubString10() {
		char[] array = new char[] { 'a', 'c' ,'f'};
		String str = &quot;caf&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str), BetterFindMost
				.findSubString(array, str).equals(&quot;caf&quot;), true);
	}

	@Test
	public void testFindSubString11() {
		char[] array = new char[] { 'a', 'b'};
		String str = &quot;ba&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str), BetterFindMost
				.findSubString(array, str).equals(&quot;ba&quot;), true);
	}

	@Test
	public void testFindSubString12() {
		char[] array = new char[] { 'a'};
		String str = &quot;a&quot;;
		Assert.assertEquals(BetterFindMost.findSubString(array, str), BetterFindMost
				.findSubString(array, str).equals(&quot;a&quot;), true);
	}
}
</pre>
</pre>
<h3>之前的一个解答</h3>
<p>下面为自己之前所写出的一个解答方法，这个答案虽然通过全部测试用例，但是内部多大十几个变量相互关联变化，是debug了3,4小时才得到完全正确的结果，思路蕴含了为在游标前进的时候为母串建模，子串在游标前进动态在母串模型中跳跃前进，前面的最优解实际上由本解答得到启发，更加灵活的运用计数器这个奇淫技巧，在这里仍然贴出来，见证算法的确很神奇，越深入越能简洁的优雅的解决问题。</p>
<p>Java语言实现，其中字典Map可以用数组实现，标记序列可以用int[]数据来实现，因为不为关键环节，此处采用HashMap，和ArrayList，简化处理：</p>
<p>评估：</p>
<p>记字符串str长度为n，char序列长度为m</p>
<ul>
<li>时间复杂度：o(n)</li>
<li>空间复杂度：o(n)+o(m)</li>
</ul>
<h4>Code</h4>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.str;

import java.util.ArrayList;
import java.util.HashMap;

public class FindMost {

	public static String findSubString(char[] targetList, String targetStr) {

		//异常情况直接返回
		if (targetList == null || targetStr == null || targetList.length == 0
				|| targetStr.length() == 0) {
			return null;
		}

		//构造targetList字典表
		HashMap&amp;lt;Character, Integer&amp;gt; mapDic = new HashMap&amp;lt;Character, Integer&amp;gt;();
		//构造匹配字典表对应的targetStr的位置序列
		ArrayList&amp;lt;Integer&amp;gt; breakPoint = new ArrayList&amp;lt;Integer&amp;gt;();
		//初始化字典表，对应初始标记为false
		for (char c : targetList) {
			mapDic.put(c, 0);
		}
		//字典表也就是targetList的不同目标的累积长度，
		int matchCount = mapDic.size();

		//当前最优解的子串长度
		int mostLen = 0;
		//对应的起始位置
		int mostStart = 0;
		//对应的终止位置
		int mostEnd = 0;

		//正在进行的轮次子串长度
		int curLen = 0;
		//正在进行的轮次子串起始位置
		int curStart = 0;
		//正在进行的轮次子串终止位置
		int curEnd = 0;

		//正在进行的轮次对应首词在targetStr中的位置，并保存在breakPoint.get(turn)中
		int turn = 0;

		//初始游标pos遍历targetStr
		for (int pos = 0; pos &amp;lt; targetStr.length(); pos++) {
			//当前游标所指字符
			char posChar = targetStr.charAt(pos);

			//如果上个字符到本次字符发生变化，而且上个字符是字典中的字符，
			//那么将上个字符在整个字符串targetStr种的偏移添加到breakPoint序列中，
			//实际上breakPoint序列存放关键节点
			if (pos != 0 &amp;amp;&amp;amp; posChar != targetStr.charAt(pos - 1)
					&amp;amp;&amp;amp; mapDic.get(targetStr.charAt(pos - 1)) != null) {
				breakPoint.add(pos - 1);// 有效转折点
			}

			//如果当前字符不在字典中
			if (mapDic.get(posChar) == null) {
				//如果当前轮次为吞进任何有效字符，则游标直接前进，下一次处理
				//若处于已吞进有效字符状态，当前字串长度需要加1，进入下一次处理
				if (matchCount != mapDic.size()) {
					curLen++;
				}
				continue;
			} else {
				//如果当前轮次序列不包含该字符
				if (mapDic.get(posChar)==0) {
					//如果当前轮次字串为吞进任何有效字符，则初始化对应的start位置
					if (matchCount == mapDic.size()) {
						curStart = pos;
					}
					//置字典对应为true，表明现在当前字串中包含当前的posChar
					mapDic.put(posChar, 1);
					//当前任务量减1
					matchCount--;
					//当前子字符串长度+1
					curLen++;
				} else {
					if (matchCount == mapDic.size() - 1) {
						//如果子串只完成一个独自字典字符，并且当前的这个依然是那个独立字符，则
						//直接调整子串头部移到当前位置
						curStart = pos;
						curLen = 1;
					} else {
						//如果子串末尾的字符与开始的字符是同一字典字符，则调整字串的开始字符
						//移到下一个字串中独立字符来
						if (targetStr.charAt(curStart) == posChar
								&amp;amp;&amp;amp; pos != curStart) {
							//当前字串关键节点+1，breakPoint.get(turn)即为当前子串第二个独立字典字符
							//的最优位置，并更新长度，减掉头部所见的长度
							turn++;
							curStart = breakPoint.get(turn);
							curLen = curLen - (breakPoint.get(turn) - curStart);

						}else if(posChar!=targetStr.charAt(pos - 1)){
							//如果为转折关键点，并在词典中，同时子串中已存在，对其字典计数+1
							mapDic.put(posChar, mapDic.get(posChar)+1);
						}
						//当前字符被吃进，总长度+1
						curLen++;
					}
				}
			}
			//当前轮次后，如果总任务量刚好完成
			if (matchCount == 0) {
				//标记当前轮次字串的终止位置
				curEnd = pos;
				//比较当前子串与历史最佳字串，如果当前子串更短，则直接覆盖历史最佳字串信息
				if (curLen &amp;lt; mostLen || mostLen == 0) {
					mostLen = curLen;
					mostStart = curStart;
					mostEnd = curEnd;
				}
				//最优解直接退出循环，如果当前轮次后，字串的长度恰好为原始序列，字典表长度，
				//再也不能找到比这更短的，也就是当前就是最优解，直接停止继续查找
				if (mostLen == mapDic.size()) {
					break;
				}

				//开始顺移当前子串，舍弃头结点字符，尝试查下一个优解
				//置要舍弃的头结点字符字典表为为完成访问状态
				mapDic.put(targetStr.charAt(curStart), 0);
				if (mapDic.size() == 2) {
					//如果字典表任务本身长度为2，直接当前字串以当前pos位置开始
					curLen = 1;
					curStart = pos;
				} else {
					//如果大于2的话，在序列中查找对于第二独立字符在targetStr中的位置，并顺移动
					turn++;
					curLen = curLen - (breakPoint.get(turn) - curStart);
					curStart = breakPoint.get(turn);

					//当蛇头有冗余，缩到关键节点处打住
					while(mapDic.get(targetStr.charAt(curStart))&amp;gt;1){
						mapDic.put(targetStr.charAt(curStart), mapDic.get(targetStr.charAt(curStart))-1);
						turn++;
						curLen = curLen - (breakPoint.get(turn) - curStart);
						curStart = breakPoint.get(turn);
					}
				}
				//舍弃子串头部已满足那个任务，遗留任务+1
				matchCount++;
			}
		}
		//如果能找到，则返回结果
		if (mostLen != 0) {
			return targetStr.substring(mostStart, mostEnd + 1);
		}
		return null;
	}
}
</pre>
</pre>
<table class="wumii-related-items" cellspacing="0" cellpadding="3" border="0"  style="clear: both;">
    
    <tr>
        <td colspan="4"><b><font size="-1"  style="display: block !important; padding: 20px 0 5px !important;">猜您也喜欢：</font></b></td>
    </tr>
    
        <tr>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important;">
                    <a target="_blank" title="排序算法大合集与思考" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fsorting-collections%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Ffind-dic-substring%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/05/24/9439822.png" width="96px" height="96px" title="算法：求字符串指定最小全集子串" alt="9439822 算法：求字符串指定最小全集子串" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">排序算法大合集与思考</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：已排序数组中找出现最多的数字" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fpuzzle-array-find-most%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Ffind-dic-substring%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" title="算法：求字符串指定最小全集子串" alt="wordpress default 算法：求字符串指定最小全集子串" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：已排序数组中找出现最多的数字</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：科克曼女生问题的一种解法" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F04%2Fkirkman-puzzle%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Ffind-dic-substring%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/images/blogWidget/wordpress_default.gif" width="96px" height="96px" title="算法：求字符串指定最小全集子串" alt="wordpress default 算法：求字符串指定最小全集子串" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：科克曼女生问题的一种解法</font>
                    </a>
                </td>
                <td width="102" valign="top" style="padding: 5px !important; margin: 0 !important; border-left: 1px solid #DDDDDD !important;">
                    <a target="_blank" title="算法：图论中Dijkstra最短路径搜寻算法" style="text-decoration: none !important; cursor: pointer !important;" href="http://app.wumii.com/ext/redirect?url=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Fmap-dijkstra%2F&from=http%3A%2F%2Fwww.vanjor.org%2Fblog%2F2011%2F05%2Ffind-dic-substring%2F">
                        <img style="margin: 0 !important; padding: 2px !important; border: 1px solid #DDDDDD !important; width: 96px !important; height: 96px !important;" src="http://static.wumii.com/site_images/2011/05/09/8068549.png" width="96px" height="96px" title="算法：求字符串指定最小全集子串" alt="8068549 算法：求字符串指定最小全集子串" /><br />
                        <font size="-1" color="#333333" style="display: block !important; line-height: 15px !important; width: 102px !important; font: 12px/15px arial !important; height: 45px !important; margin: 3px 0 0 0 !important; padding: 0 !important; overflow: hidden !important;">算法：图论中Dijkstra最短路径搜寻算法</font>
                    </a>
                </td>
        </tr>
    
    <tr>
        <td colspan="4" align="right">
            <a style="text-decoration: none !important;" href="http://www.wumii.com/widget/relatedItems" target="_blank" title="无觅相关文章插件">
                <font size="-1" color="#bbbbbb" style="display: block !important; font-family: arial !important; padding: 5px 0 !important; font-size: 12px !important; color: #bbb !important;">无觅</font>
            </a>
        </td>
    </tr>
</table><h3>相关文章</h3><ul><li><a href="http://www.vanjor.org/blog/2011/05/sorting-collections/" title="排序算法大合集与思考 2011.05.24">排序算法大合集与思考</a>(1)</li>
<li><a href="http://www.vanjor.org/blog/2011/04/puzzle-array-find-most/" title="算法：已排序数组中找出现最多的数字 2011.04.24">算法：已排序数组中找出现最多的数字</a>(2)</li>
<li><a href="http://www.vanjor.org/blog/2011/04/kirkman-puzzle/" title="算法：科克曼女生问题的一种解法 2011.04.22">算法：科克曼女生问题的一种解法</a>(0)</li>
</ul><h3>最近评论</h3><ul></ul>]]></content:encoded>
			<wfw:commentRss>http://www.vanjor.org/blog/2011/05/find-dic-substring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>推荐系统之协同过滤概述</title>
		<link>http://www.vanjor.org/blog/2011/05/rs-collaborative-filtering/</link>
		<comments>http://www.vanjor.org/blog/2011/05/rs-collaborative-filtering/#comments</comments>
		<pubDate>Tue, 10 May 2011 07:30:19 +0000</pubDate>
		<dc:creator>vanjor</dc:creator>
				<category><![CDATA[技术相关]]></category>
		<category><![CDATA[数据挖掘]]></category>
		<category><![CDATA[协同过滤]]></category>
		<category><![CDATA[推荐系统]]></category>
		<category><![CDATA[相似度计算]]></category>

		<guid isPermaLink="false">http://www.vanjor.org/blog/2011/05/%e6%8e%a8%e8%8d%90%e7%b3%bb%e7%bb%9f%e4%b9%8b%e5%8d%8f%e5%90%8c%e8%bf%87%e6%bb%a4%e6%a6%82%e8%bf%b0/</guid>
		<description><![CDATA[协同过滤（Collaborative Filtering）是现今推荐系统中应用最为成熟的一个推荐算法系类，它利用兴趣相投、拥有共同经验之群体的喜好来推荐使用者感兴趣的资讯，个人透过合作的机制给予资讯相当程度的回应（如评分）并记录下来以达到过滤的目的进而帮助别人筛选资讯（参考wiki，文字有点生硬，不过却很好的描述了协同过滤的一个互动性：用户参与用户获益）。

边整理边写了整整一天o(╯□╰)o

    

<span class="readmore"><a href="http://www.vanjor.org/blog/2011/05/rs-collaborative-filtering/" title="推荐系统之协同过滤概述">详细阅读:  共10698 字</a></span>]]></description>
			<content:encoded><![CDATA[<p>协同过滤（Collaborative Filtering）是现今推荐系统中应<a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/3438a27ea15c.jpg" rel="shadowbox[post-1542];player=img;" title="协同过滤"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="协同过滤" border="0" alt="thumb 推荐系统之协同过滤概述" align="right" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/thumb.jpg" width="244" height="169" /></a>用最为成熟的一个推荐算法系类，它利用兴趣相投、拥有共同经验之群体的喜好来推荐使用者感兴趣的资讯，个人透过合作的机制给予资讯相当程度的回应（如评分）并记录下来以达到过滤的目的进而帮助别人筛选资讯（参考wiki，文字有点生硬，不过却很好的描述了协同过滤的一个互动性：用户参与用户获益）。</p>
<p>边整理边写了整整一天o(╯□╰)o</p>
<div>   <span id="more-1542"></span> </div>
<h1>一、背景</h1>
<div class="vp">
<h2>1.1 基本思想</h2>
<div class="vp">
<p>简单来说：</p>
<ul>
<li>和你兴趣合得来的朋友喜欢的，你也很有可能喜欢；</li>
<li>喜欢一件东西 <strong>A</strong>，而另一件东西 <strong>B </strong>与这件十分相似，就很有可能喜欢<strong> B</strong>；</li>
<li>大家都比较满意的，人人都追着抢的，我也就很有可能喜欢。</li>
</ul>
<p>三者均反映在协同过滤的评级（rating）或者<a href="http://zh.wikipedia.org/w/index.php?title=%E7%BE%A4%E9%AB%94%E9%81%8E%E6%BF%BE&amp;action=edit&amp;redlink=1">群体过滤</a>（social filtering）这种行为特性上。</p>
</p></div>
<h2>1.2 相关研究组织</h2>
<div class="vp">
<p>协同过滤上比较经典著名的组织商业有：</p>
<ul>
<li>Tapestry（1992）：电子邮件分类过滤，解决Xerox公司在Palo Alto的研究中心资讯过载问题。</li>
<li><a href="http://www.grouplens.org/" target="_blank">GroupLens</a>（1994）：推荐系统，在线社区，移动及普适技术，数字图书馆，和地理信息系统，见大名鼎鼎的<a href="http://www.movielens.org/" target="_blank">MovieLens</a>电影评分推荐。</li>
<li><a title="Netflix" href="http://www.netflix.com/" rel="Netflix" target="_blank">Netflix</a>：研究影视视频在线推荐 。</li>
<li><a href="http://zh.wikipedia.org/wiki/Amazon.com">Amazon</a>：亚马孙网络书城，为亚马逊每年贡献二三十个百分点的创收。</li>
</ul></div>
<h2>1.3 优缺点</h2>
<div class="vp">
<p><strong>优点</strong>：主要从使用者角度来看：</p>
<ul>
<li>能够过滤机器难以自动内容分析的资讯，如艺术品，音乐等。也就是基于用户标识等，可以自动归类；</li>
<li>共用其他人的经验，避免了内容分析的不完全或不精确，并且能够基于一些复杂的，难以表述的概念（如资讯品质、个人品味）进行过滤，直接后天间接性继承前辈经验； </li>
<li>有推荐新资讯的能力。可以发现内容上完全不相似的资讯，使用者对推荐资讯的内容事先是预料不到的。可以发现使用者潜在的但自己尚未发现的兴趣偏好。（基于相似用户推荐很好的能做到） </li>
<li>推荐个性化、自动化程度高。能够有效的利用其他相似使用者的回馈资讯。加快个性化学习的速度。</li>
</ul>
<p><strong>缺点</strong>：主要从设计与实现的角度</p>
<ul>
<li>新使用者问题(New User Problem)： 系统开始时推荐品质较差 ；</li>
<li>新项目问题(New Item Problem) ：品质取决于历史资料集 ；</li>
<li>稀疏性问题（Sparsity）：系统历史数据过少，难以进行精确的模式查找匹配推荐 ；</li>
<li>系统延伸性问题（Scalability）：新加User或者Item时，系统需要增加计算负荷量大。</li>
</ul></div>
<h2>1.4 对于当前推荐系统的问题的一些尝试解决</h2>
<div class="vp">
<p>本小节参考<a href="http://www.computer.org/portal/web/csdl/doi/10.1109/TKDE.2005.99" target="_blank">《Toward the next generation of recommender systems: A survey of the state-of-the-art and possible extensions</a>》的2.2节翻译。</p>
<h3>新用户问题</h3>
<div class="vp">
<p>为了使推荐系统更加准确，系统必须从用户的评分中学习用户的偏好，有许多方法尝试这方面研究，它们大多数使用混合推荐模型，包含了基于内容以及协同过滤推荐方法。另外的一种方法是挖掘一些条目提供给新用户来进行评级，以便快速学习用户的偏好。这些挖掘条目的技术是基于项目的流行度，项目的熵，用户个性化，以及以上技术的糅合。</p>
</p></div>
<h3>新项目问题</h3>
<div class="vp">
<p>新的项目会经常添加到推荐系统中，协同过滤基本上是通过用户的偏好进行推荐，这样，直到新的项目被足够数量的用户进行评级，推荐系统才有可能推荐它，这个问题同样是通过混合推荐方法来解决。</p>
</p></div>
<h3>数据稀疏性</h3>
<div class="vp">
<p>在许多推荐系统中，已经获得到的评级数据相比整个待预测的项只是很小的一部分，那么从一个很小的样例数据集中高效的预测评分是很重要的。同样推荐系统的成功在于拥有足够数量的用户，列于，在电影推荐系统中，有很多电影只被小部分用户评级，而且这些电影会很少被推荐，即使那小部分用户给予很高评级。同样，对于那些有着不同品味的小众群体，找不到相同特定同口味的用户，也导致较差的推荐结果了。</p>
<p>一个克服数据稀疏性问题的方法，是通过使用用户资料信息来计算用户相似度。也就是，两个用户会被认为相似不只单在相同的电影评级类似，而且也有可能属于同一个人口统计区块（demographic），比如，用户的性别，年龄，居住地，教育情况，工作信息。这种基于传统协同过滤的扩展方法称为demographic filtering。详见M. Pazzani, 《A Framework for Collaborative, Content-Based, and Demographic Filtering, Artificial Intelligence Rev》</p>
<p>另外的一个尝试在于挖掘被推荐出的用户之间的相似性，在客户的历史交易和反馈数据中，通过关联检索框架，以及相关传播扩散算法来发现客户间的可传递性关联。</p>
<p>另外的一个途径解决思路是，是通过一种降维技术（ dimensionality reduction ），<a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/svd.html" target="_blank">奇异值分解</a>（SVD:Singular Value Decomposition ）,来降低稀疏矩阵的维度。SVD是目前一个已知的矩阵分解技术，来为原始矩阵求的最好的低维近似。详见B. Sarwar, 的《Application of Dimensionality Reduction in Recommender Systems—A Case Study》</p>
</p></div>
</p></div>
</p></div>
<h1>二、分类概述</h1>
<div class="vp">
<h2>2.1 推荐系统概况</h2>
<div class="vp">
<p>协同过滤作为推荐系统中的一个主流方法途径，在推荐系统中所处地位是怎么样的呢，下面主要对推荐系统的方法类别进行介绍，从两种不同的角度上，推荐系统中方法技术分类主要有以下两种分类：</p>
<h3>从研究对象方法上的一种分类</h3>
<div class="vp">
<p>首先参考Adomavicius, G的论文<a href="http://www.computer.org/portal/web/csdl/doi/10.1109/TKDE.2005.99" target="_blank">《Toward the next generation of recommender systems: A survey of the state-of-the-art and possible extensions</a>》</p>
<p>推荐系统中的总体方法有:</p>
<ul>
<li><strong>基于内容的推荐</strong>（Content-based recommendations）：系统会基于用户上次喜欢的一个项目推荐相似的项目；</li>
<li><strong>协同过滤推荐</strong>（Collaborative recommendations）：基于寻找相同评为与偏好的人群进行推荐；</li>
<li><strong>混合推荐</strong>（Hybrid approaches）：融合基于内容以及协同过滤推荐方法。</li>
</ul>
<p>并且论文中总结的现状技术分类概述如下图：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/78346b73624c.jpg" rel="shadowbox[post-1542];player=img;" title="推荐系统方法分类概述"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="推荐系统方法分类概述" border="0" alt="thumb2 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/thumb2.jpg" width="440" height="484" /></a></p>
</p></div>
<h3>从应用算法架构上分类</h3>
<div class="vp">
<p>参考<a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/index.html">Carleton College, Northfield, MN.</a>官方网站上：</p>
<ul>
<li><strong>启发式推荐算法</strong>（<a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/memorybased.html">Memory-based algorithms</a>）：是系统过滤思想中的一种算法，每次推荐都需要调用这整个评级数据库的内容，即对于一个用户，计算与其他所有其他用户的相似度，对于用户没有遇到的新项目，将会利用相似度权重及其他用户的评分加权预测当前用户对于这个新项目的潜在评分。但这种每次计算量过大</li>
<li><strong>基于模型推荐算法</strong>（<a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/modelbased.html">Model-based algorithms</a>）：从评级数据集中建立一个模型，也就是从数据库中抽取一个模型数据，然后每次推荐都是基于模型数据进行计算并推荐，这样不用每次都调用整个数据库，提高了速度与系统伸缩性。大致包括：</li>
<ul>
<li><a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/itembased.html">Item-based collaborative filtering</a></li>
<li><a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/pd.html">Personality Diagnosis</a></li>
<li><a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/svd.html">SVD</a></li>
</ul>
<li><strong>关联规则算法</strong>（<a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/association.html">Association Rules</a>）：关联规则尝试发现不同项目之间的因果关系，一个关键规则本质上是一种（<em>A1</em>, <em>A2</em>, <em>A3</em>, &#8230; =&gt;<em>B1</em>, <em>B2</em>, <em>B3</em>,&#8230;） 的形式，尝试展示一个序列决定另外的一个序列。主要由两部分组成：一个是关联决策，一个是对应的置信度。</li>
<ul>
<li>关联决策：即如果<em>A</em> =&gt; <em>B</em>, <em>C</em>, 那么如果Item A出现在某人的历史记录里面，那么可以推断B和C也很可能出现在那里。</li>
<li>置信度：表明对应的关联决策有多么可靠，范围为[0, 1]的一个区间，如果置为1，那么说明上述决策总能成立，如果为0，表明这个决策从来不会正确。</li>
</ul>
</ul></div>
</p></div>
<h2>2.2 协同过滤基本分类</h2>
<div class="vp">
<p>协同过滤实际上与推荐系统中的其他方法是交织叠加的，没有一个明确的界限，推荐系统的方法尝试都有结合协同过滤的思想因素去实现，参考wiki百科中<a title="协同过滤" href="http://zh.wikipedia.org/zh-cn/%E5%8D%94%E5%90%8C%E9%81%8E%E6%BF%BE" rel="协同过滤" target="_blank">协同过滤</a>大体可以分为三类：</p>
<ul>
<li><strong>基于<font color="#000000">用户</font>协同过滤（User &#8211; based）：</strong>基于计算相似用户用以推荐</li>
<li><strong>基于<font color="#000000">项目</font>协同过滤（Item &#8211; based）：</strong>基于计算相似项目用以推荐</li>
<li><strong>基于<font color="#000000">模型</font>协同过滤（Model- based）：</strong>基于原始数据中抽取出模型，基于模型计算并用以推荐</li>
</ul></div>
</p></div>
<h1>三、协同过滤三大分类</h1>
<div class="vp">
<h2>3.1 基于用户协同过滤(User-based)</h2>
<div class="vp">
<p>用<a href="http://zh.wikipedia.org/w/index.php?title=%E7%9B%B8%E4%BC%BC%E7%B5%B1%E8%A8%88&amp;action=edit&amp;redlink=1">相似统计</a>的方法得到具有相似爱好或者兴趣的相邻使用者，最早是在1994年由来自美国Minnesota大学Paul Resnick等人发表的《<a title="GroupLens: An Open Architecture for Collaborative Filtering of Netnews" href="http://portal.acm.org/citation.cfm?id=192905" rel="GroupLens: An Open Architecture for Collaborative Filtering of Netnews" target="_blank">GroupLens: An Open Architecture for Collaborative Filtering of Netnews</a>》一文中提出的。</p>
<h3>方法基本步骤</h3>
<div class="vp">
<h4>1. 收集使用者资讯</h4>
<p>收集可以代表使用者兴趣的资讯。概括主要分为两类：</p>
<ul>
<li>主动评分（显式评分）：基于用户的直接打分数据，如评分，喜爱等级，like/dislike</li>
<li>被动评分（隐式评分）：是根据使用者的行为模式由系统代替使用者完成评价，不需要使用者直接打分或输入评价资料，如电子商务中的购买记录，视频网站用户观看记录、收藏记录，甚至是评论文本观点意见挖掘等进行广泛深度的数据挖掘。</li>
</ul>
<h4>2. 最近邻搜索(Nearest neighbor search, NNS)</h4>
<p>以使用者为基础（User-based）的协同过滤的出发点是与使用者兴趣爱好相同的另一组使用者，就是计算两个使用者的相似度。</p>
<p>例如：寻找n个和A有相似兴趣使用者，把他们对M的评分作为A对M的评分预测。一般会根据资料的不同选择不同的算法。</p>
<p>目前较多使用的<a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/itembased.html" target="_blank">相似度算法</a>有：</p>
<ul>
<li>皮尔森相关系数：Person Correlation Coefficient</li>
<li>余弦相似度：Cosine-based Similarity</li>
<li>矫正余弦相似度：Adjusted Cosine Similarity</li>
</ul>
<h4>3. 产生推荐结果</h4>
<p>有了最近邻集合，就可以对目标使用者的兴趣进行预测，产生推荐结果。</p>
<p>依据推荐目的不同形式的推荐，较常见的推荐结果有Top-N 推荐和关联推荐。</p>
<ul>
<li>Top-N 推荐：是针对个体使用者产生，对每个人产生不一样的结果，例如：透过对A使用者的最近邻使用者进行统计，选择出现频率高且在A使用者的评分项目中不存在的，作为推荐结果。</li>
<li>关联推荐：对最近邻使用者的记录进行<a href="http://zh.wikipedia.org/w/index.php?title=%E9%97%9C%E8%81%AF%E8%A6%8F%E5%89%87&amp;action=edit&amp;redlink=1">关联规则</a>(<a href="http://zh.wikipedia.org/w/index.php?title=Association_rules&amp;action=edit&amp;redlink=1">association rules</a>)挖掘。</li>
</ul></div>
<h3>优缺点</h3>
<div class="vp">
<ul>
<li><strong>优点：</strong>在数据集完善，内容丰富下，准确率较高，而且能够避开项目内容上的挖掘进行准确推荐，对够对项目关联性，用户偏好进行隐式透明的挖掘。</li>
<li><strong>缺点：</strong>随着使用者数量的增多，计算的时间就会变长，新用户问题，以及数据稀疏性问题是导致效率与伸缩性上均不足</li>
</ul></div>
</p></div>
<h2>3.2 基于项目协同过滤（Item-based）</h2>
<div class="vp">
<p>鉴于基于用户的协同推荐算法随着使用者数量的增多，计算的时间就会变长，最早是在2001年由Sarwar提出了基于项目的协同过滤推荐算法《<a href="http://zh.wikipedia.org/w/index.php?title=Item-based_Collaborative_Filtering_Algorithms&amp;action=edit&amp;redlink=1">Item-based Collaborative Filtering Algorithms</a>》中所提出的。</p>
<p>基于项目协同过滤在于透过计算项目之间的相似性来代替使用者之间的相似性。</p>
<p>所建立的一个基本的假设：”能够引起使用者兴趣的项目，必定与其之前评分高的项目相似”，通俗的来说：基本上喜欢《长尾理论》的人，都会去看《世界是平的》，不知道你怎么想，反正豆瓣推荐系统就是这么认为的。</p>
<h3>方法步骤：</h3>
<div class="vp">
<h4>1. 收集使用者资讯</h4>
<p>同以使用者为基础（User-based）的协同过滤。</p>
<h4>2. 针对项目的最近邻搜索</h4>
<p>先计算己评价项目和待预测项目的相似度，并以相似度作为权重，加权各已评价项目的分数，得到待预测项目的预测值。</p>
<p>例如：要对项目 A 和项目 B 进行相似性计算，要先找出同时对 A 和 B 打过分的组合，对这些组合进行相似度计算，常用的算法同基于使用者（User-based）的协同过滤。</p>
<h4>3. 产生推荐结果</h4>
<p>在用户使用评价一个商品感兴趣后，会自动搜寻改商品相似度最大的前N项条目。</p>
</p></div>
<h3>优缺点：</h3>
<div class="vp">
<p><strong>优点</strong>：以项目为基础的协同过滤不用考虑使用者间的差别，所以精度比较差。但是却不需要使用者的历史资料，或是进行使用者识别。对于项目来讲，它们之间的相似性要稳定很多，因此可以离线完成工作量最大的相似性计算步骤，从而降低了线上计算量，提高推荐效率，尤其是在使用者多于项目的情形下尤为显著。</p>
<p><strong>缺点</strong>：但其仍有许多问题需要解决，最典型的有稀疏问题(Sparsity)和冷启动问题(Cold-start)，开始时效果较差。此外还有新使用者问题和算法健壮性等问题。</p>
</p></div>
</p></div>
<h2>3.3 基于模型的协同过滤（Model- based）</h2>
<div class="vp">
<p>以使用者为基础（User-based）的协同过滤和以项目为基础（Item-based）的协同过滤统称为以记忆为基础（Memory based）的协同过滤技术，他们共有的缺点是资料稀疏，难以处理大数据量下的即时结果，因此发展出以模型为基础的协同过滤技术。</p>
<p>以模型为基础的协同过滤(Model-based Collaborative Filtering)是先用历史资料得到一个模型，再用此模型进行预测。以模型为基础的协同过滤广泛使用的技术包括<a href="http://zh.wikipedia.org/w/index.php?title=Latent_Semantic_Indexing&amp;action=edit&amp;redlink=1">Latent Semantic Indexing</a>、<a href="http://zh.wikipedia.org/w/index.php?title=Bayesian_Networks&amp;action=edit&amp;redlink=1">Bayesian Networks</a>…等，根据对一个样本的分析得到模型。</p>
</p></div>
</p></div>
<h1>四、相似度计算算法</h1>
<div class="vp">
<h2>4.1 概述</h2>
<div class="vp">
<p>相似度计算算法可以用于计算用户或者项目相似度。</p>
<p>以项目相似度计算（Item Similarity Computation）为列，通性在于都是从评分矩阵中，为两个项目i，j挑选出共同的评分用户，然对这个共同用户的评分向量，进行计算相似度<i>s</i><sub><i>i</i>,<i>j</i></sub>，</p>
<p>由<a href="http://www10.org/cdrom/papers/519/node11.html" target="_blank">参考1</a>，<a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/itembased.html" target="_blank">参考2</a>如下图：行代表用户，列代表项目</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/itembased1.png" rel="shadowbox[post-1542];player=img;" title="itembased"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="itembased" border="0" alt="itembased thumb1 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/itembased_thumb1.png" width="484" height="266" /></a></p>
<p>(注意到是从i，j向量中抽出共有的评论，组成的一对向量，进行相似度计算)，</p>
<ul>
<ul>
<li><strong>皮尔森相关系数</strong>：Person Correlation Coefficient</li>
<li><strong>余弦相似度</strong>：Cosine-based Similarity</li>
<li><strong>矫正余弦相似度</strong>：Adjusted Cosine Similarity</li>
</ul>
</ul></div>
<h2>4.2 皮尔森相关系数</h2>
<div class="vp">
<p>皮尔森相关系数也是一种基于相关系数的相似度计算方法，一般为了使计算结果精确，需要找出共同评分的用户。</p>
<p>记用户集U为既评论了 i 又评论了 j 的用户集，那么对应的皮尔森相关系数计算公式为：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/itembased-pearson.png" rel="shadowbox[post-1542];player=img;" title="itembased-pearson"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="itembased-pearson" border="0" alt="itembased pearson thumb 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/itembased-pearson_thumb.png" width="404" height="72" /></a></p>
<p>（其中<strong><i>R</i><i><sub><i>u</i>,<i>i</i></sub><i></i></i><i></i></strong> 为用户u 对项目 i 的评分，对应带横杠的为这个用户集U对项目i的评分评分）</p>
</p></div>
<h2>4.3 余弦相似度</h2>
<div class="vp">
<p>两个项目 i ，j 视作为两个m维用户空间向量，相似度计算通过计算两个向量的余弦夹角，那么，对于m*n的评分矩阵，i ，j 的相似度<i>sim</i>( <i>i </i>, <i>j </i>) 计算公式：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/itembased-cosine.png" rel="shadowbox[post-1542];player=img;" title="itembased-cosine"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="itembased-cosine" border="0" alt="itembased cosine thumb 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/itembased-cosine_thumb.png" width="304" height="72" /></a></p>
<p> （其中 &quot; · &quot;记做两个向量的内积）</p></div>
<h2>4.4 矫正余弦相似度</h2>
<div class="vp">
<p>余弦相似度计算并没有考虑到不同的用户的评分尺度差异性，也就是说有的用户评分更宽容普遍打分较高，有的用户评分更严格，普遍打分较低。矫正余弦相似度正式为了克服这一缺点，通过求出每位用户的平均打分，调整评分向量为评分偏差向量，再进行求解余弦相似度。</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/itembased-adjusted-cosine.png" rel="shadowbox[post-1542];player=img;" title="itembased-adjusted-cosine"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="itembased-adjusted-cosine" border="0" alt="itembased adjusted cosine thumb 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/itembased-adjusted-cosine_thumb.png" width="424" height="74" /></a></p>
<p> （其中带横杠的为第u个用户的平均评分）</p></div>
<h2>4.5 基于项目相似度与基于用户相似度的差异</h2>
<div class="vp">
<p>上述三个相似度公式是基于项目相似度场景下的，而实际上，基于用户相似度与基于项目相似度计算的一个基本的区别是，基于用户相似度是基于评分矩阵中的行向量相似度求解，基于项目相似度计算式基于评分矩阵中列向量相似度求解，然后三个公式分别都可以适用，如下图：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image1.png" rel="shadowbox[post-1542];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb1 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb1.png" width="304" height="290" /></a></p>
<p>（其中，为0的表示未评分）</p>
<ul>
<li>基于项目相似度计算式计算如Item3，Item4两列向量相似度；</li>
<li>基于用户相似度计算式计算如User3，User4量行向量相似度。</li>
</ul>
<p>最终的计算公式方法均相同。具体可具体参考<a href="http://www.computer.org/portal/web/csdl/doi/10.1109/TKDE.2005.99" target="_blank">《Toward the next generation of recommender systems: A survey of the state-of-the-art and possible extensions</a>》2.2节</p>
</p></div>
<h2>4.6 相似度计算不足与改进</h2>
<div class="vp">
<p>基于评分矩阵相似度计算所面临的一个性能问题，数据稀疏下，精度很差，因为相似度计算是基于寻找拥有共同用户评分的项目或者共同项目评分的用户，在数据稀疏下，两个向量中空值过多，导致计算共同评分维度过低，甚至就没有共同评分。</p>
<p>对于数据稀疏性这种情况下，一个尝试的途径是进行对评分矩阵进行填充。</p>
<p>填充规则有很多，一种通用的方法是，填充均分，具体如下两种：</p>
<ul>
<li>基于用户均分：填充对应用户的平均打分</li>
<li>基于项目均分：基于对应项目的平均打分</li>
</ul>
<p>&#160;&#160; <a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image2.png" rel="shadowbox[post-1542];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb2 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb2.png" width="244" height="241" /></a><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image3.png" rel="shadowbox[post-1542];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb3 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb3.png" width="244" height="238" /></a></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; （基于用户均分填充）&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; （基于项目均分填充）</p>
</p></div>
</p></div>
<h1>五、协同过滤敏捷实践</h1>
<div class="vp">
<h2>5.1 概述</h2>
<div class="vp">
<p>首先参考<a href="http://zh.wikipedia.org/wiki/Slope_one" target="_blank">Slope one</a>的wiki百科的一段话（此章节按照<a href="http://zh.wikipedia.org/wiki/Slope_one" target="_blank">Slope one</a>的wiki百科重新整理）：</p>
<p>当可以对一些项目评分的时候，比如人们可以对一些东西给出1到5星的评价的时候，协同过滤意图基于一个个体过去对某些项目的评分和（庞大的）由其他用户的评价构成的数据库，来预测该用户对未评价项目的评分。</p>
<p>In this context, item-based 协同过滤系统[根据其它项目的评分来预测某项目的分值，一般方法为 <a href="http://zh.wikipedia.org/wiki/%E7%B7%9A%E6%80%A7%E5%9B%9E%E6%AD%B8">线性回归</a> (f(x) = ax + b). 于是，当有1000个项目时，需要列多达1,000,000个线性回归方程， 以及多达2,000,000个回归量。除非我们只选择某些用户共同评价过的项目对，否则协同过滤会遇到<a href="http://zh.wikipedia.org/wiki/%E8%BF%87%E9%80%82">过适</a> 问题。</p>
<p>另外一种更好的方法是使用更简单一些的式子，比如 f(x) = x + b：实验证明当使用一半的回归量的时候，该式子（称为Slope One）的表现有时优于<a href="http://zh.wikipedia.org/wiki/Slope_one#cite_note-lemire2005-1">[2]</a> 线性回归方程。该简化方法也不需要那么多存储空间和延迟。</p>
<p>基于<a href="http://baike.baidu.com/view/41373.htm" target="_blank">奥卡姆剃刀原则</a>：“切勿浪费较多东西，去做‘用较少的东西，同样可以做好的事情’。”</p>
<p>基于项目相似度协同过滤的一种简化的思想Slope One算法也就反映出了更加实用之处。</p>
<p>附带一句，关于推荐系统等算法，敏捷开发实现，可以尝试看下《<a title="集体智慧编程" href="http://book.douban.com/subject/3288908/" rel="集体智慧编程" target="_blank">集体智慧编程》</a>（<em>Programming Collective Intelligence</em>），Python实现。</p>
</p></div>
<h2>5.2 Slope One算法</h2>
<div class="vp">
<p>为了大大减少<a href="http://zh.wikipedia.org/wiki/%E8%BF%87%E9%80%82">过适</a>的发生，提升算法简化实现， Slope One 系列易实现的Item-based<a href="http://zh.wikipedia.org/wiki/%E5%8D%94%E5%90%8C%E9%81%8E%E6%BF%BE">协同过滤</a>算法被提了出来。本质上，该方法运用更简单形式的回归表达式(f(x) = x + b) 和单一的自由参数，而不是一个项目评分和另一个项目评分间的线性回归 (f(x) = ax + b)。 该自由参数只不过就是两个项目评分间的平均差值。甚至在某些实例当中，它比线性回归的方法更准确<a href="http://zh.wikipedia.org/wiki/Slope_one#cite_note-lemire2005-1">[2]</a>，而且该算法只需要一半（甚至更少）的存储量。</p>
<h3>基本原理</h3>
<div class="vp">
<p>如下图评分矩阵：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/Simplicity_diagram.png" rel="shadowbox[post-1542];player=img;" title="Simplicity_diagram"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Simplicity_diagram" border="0" alt="Simplicity diagram thumb 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/Simplicity_diagram_thumb.png" width="244" height="117" /></a></p>
<p>基于UserA对Item1与Item2的评分，以及UserB对Item1的打分，Slope One算法思想对于UserB对于Item2的预测评分为 2 +（1.5-1）=2.5.</p>
<p>从这里可以看出，Slope One的思想是，每次只着眼两点，因为两点确定一条直线嘛，而且对于这两点Item 1与Item2，User A都经过，User B经过其中1点，Slope One思想假设User B与User A这条直线表现同一斜率：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/slope.jpg" rel="shadowbox[post-1542];player=img;" title="slope"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="slope" border="0" alt="slope thumb 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/slope_thumb.jpg" width="244" height="142" /></a></p>
</p></div>
<h3>应用场景</h3>
<div class="vp">
<p>如下图评分矩阵</p>
<p>&#160;</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image4.png" rel="shadowbox[post-1542];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb4 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb4.png" width="244" height="160" /></a></p>
<p>要预测Lucy对项目1的评分：</p>
<ul>
<li>项目1与项目2间的均差值（5-3)+(3-4)/2 =0.5，（John线与Mark线）</li>
<li>项目1与项目3间的均差值（5-2）/1 =3（John线）</li>
</ul>
<p>那么Lucy对于项目1的评分预测可以基于项目1与项目2，以及项目1与项目3的两个均差值，3项线来预测，项线几道对应均差值的权重上。也就有</p>
<blockquote><p>rate（lucy，项目1）=（（0.5+2）*2+（3+5）*1）/（2+1）=4.33</p>
</blockquote>
<p>想要实现 Slope One，只需要计算并存储“n”对评分间的平均差值和评价数目即可。</p>
</p></div>
<h3>算法复杂度</h3>
<div class="vp">
<p>设有“n”个项目，“m”个用户，“N”个评分。计算每对评分之间的差值需要n(n-1)/2 单位的存储空间，最多需要 m*n*n步.</p>
<p>假设用户已经评价了最多 y 个项目, 那么计算不超过n*n+m*y*y个项目间计算差值是可能的。</p>
<p>如果一个用户已经评价过“x”个项目，预测单一的项目评分需要“x“步，而对其所有未评分项目做出评分预测需要最多 (n-x)x 步. 当一个用户已经评价过“x”个项目时，当该用户新增一个评价时，更新数据库需要 x步。</p>
<p>可以通过分割数据（参照<a href="http://zh.wikipedia.org/wiki/%E5%88%86%E5%89%B2">分割</a>和稀疏存储（没有共同评价项目的用户可以被忽略）来降低存储要求。</p>
</p></div>
<h3>还不想亲自实现？找开源吧</h3>
<div class="vp">
<p>开源的Slope one的程序包</p>
<p><strong>Python：            <br /></strong><a href="http://www.serpentine.com/blog/2006/12/12/collaborative-filtering-made-easy/">http://www.serpentine.com/blog/2006/12/12/collaborative-filtering-made-easy/</a>           <br /><strong>Java：            <br /></strong><a href="http://taste.sourceforge.net/">http://taste.sourceforge.net/</a>           <br /><a href="http://www.daniel-lemire.com/fr/documents/publications/SlopeOne.java">http://www.daniel-lemire.com/fr/documents/publications/SlopeOne.java</a>           <br /><a href="http://www.nongnu.org/cofi/">http://www.nongnu.org/cofi/</a>           <br /><strong>PHP：            <br /></strong><a href="http://sourceforge.net/projects/vogoo">http://sourceforge.net/projects/vogoo</a>           <br /><a href="http://www.drupal.org/project/cre">http://www.drupal.org/project/cre</a>           <br /><a href="http://www.daniel-lemire.com/fr/documents/publications/webpaper.txt">http://www.daniel-lemire.com/fr/documents/publications/webpaper.txt</a> Slope one算法作者写的，简单明了。</p>
</p></div>
</p></div>
<h2>5.3 Amazon的<a href="http://doi.ieeecomputersociety.org/10.1109/MIC.2003.1167344">item-to-item</a>专利算法</h2>
<div class="vp">
<p>在更加普遍的场景中，人们并不总是能给出评分，当用户只提供二元数据（购买与否）的时候，就无法应用Slope One 和其它基于评分的算法。但是却有一个更简单更简单的方法：Amazon的 <a href="http://doi.ieeecomputersociety.org/10.1109/MIC.2003.1167344">item-to-item</a> 专利算法</p>
<p>item-to-item算法是二元 item-based协同过滤应用的例子之一，该算法中用二元向量表示用户-项目购买关系的矩阵，并计算二元向量间的cosine相关系数。</p>
<p>如以下应用场景：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image5.png" rel="shadowbox[post-1542];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb5 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb5.png" width="244" height="169" /></a></p>
<ul>
<li>在本例当中，项目1和项目2间的cosine相关系数为：<a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/1.png" rel="shadowbox[post-1542];player=img;" title="1"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="1" border="0" alt="1 thumb 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/1_thumb.png" width="201" height="48" /></a></li>
</ul>
<ul>
<li>项目1和项目3间的cosine相关系数为：<a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/2.png" rel="shadowbox[post-1542];player=img;" title="2"><img style="border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="2" border="0" alt="2 thumb 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/2_thumb.png" width="221" height="49" /></a></li>
</ul>
<ul>
<li>而项目2和项目3的cosine相关系数为：<a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/3.png" rel="shadowbox[post-1542];player=img;" title="3"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="3" border="0" alt="3 thumb 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/3_thumb.png" width="204" height="48" /></a></li>
</ul>
<p>于是，浏览项目1的顾客会被推荐买项目3,而浏览项目2的顾客会被推荐买项目3,浏览了项目3的会被推荐买1（并由1推荐2）。该模型只使用了每对项目间的一个参数（cosine相关系数）来产生推荐。因此，如果有n个项目，则需要计算和存储 n（n-1）/2次cosine相关系数。</p>
</p></div>
</p></div>
<h1>六、算法评价指标</h1>
<div class="vp">
<p>推荐系统，协同过滤领域，在科学研究上的一些评价指标主要有MAE，AUC，MAP，P@N，P·R·F曲线。而实际应用中还要考虑到系统伸缩性，算法复杂度，等等，那些就不说了，P·R·F指标参考我之前的一篇文章：《<a title="信息检索基本评价指标-P·R·F" href="http://www.vanjor.org/blog/2010/11/recall-precision/" rel="信息检索基本评价指标-P·R·F" target="_blank">信息检索基本评价指标-P·R·F</a>》</p>
<p>以下指标详细界定参考论文《Mining mood-specific movie similarity with matrix factorization for context-aware recommendation》及《New Approaches to Mood-based Hybrid Collaborative Filtering》</p>
<h2>6.1 平均绝对误差 MAE（Mean Absolute Error）</h2>
<div class="vp">
<p>通过计算预测的用户评分与实际的用户评分之间误差来度量。主要结合交叉验证来实现，公式如下：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image6.png" rel="shadowbox[post-1542];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb6 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb6.png" width="364" height="72" /></a></p>
<p>（其中，g（authentic）为真实评分，g（prediction）为预测评分，G<sup>test</sup>，为整个待预测用户评分集）</p>
</p></div>
<h2>6.2平均准确率MAP（Mean Aaverage Precision）</h2>
<div class="vp">
<p>MAP是信息检索中解决P·R·F指标的不足，而提出的，其规范的定义是，设P(R)为系统在召回率为R时的准确率。</p>
<p>单个主题的平均准确率是每篇相关文档检索出后的准确率的平均值。主集合的平均准确率(MAP)是每个主题的平均准确率的平均值。 MAP 是反映系统在全部相关文档上性能的单值指标。系统检索出来的相关文档越靠前(rank 越高)，MAP就可能越高。</p>
<p>一个简单的比方就是（<a href="http://blog.sina.com.cn/s/blog_662234020100pozd.html" target="_blank">参考</a>）：</p>
<blockquote><p>设有两个主题，主题1有4个相关网页，主题2有5个相关网页。某系统对于主题1检索出4个相关网页，其rank分别为1, 2, 4, 7；对于主题2检索出3个相关网页，其rank分别为1,3,5。</p>
<p>对于主题1，平均准确率为(1/1+2/2+3/4+4/7)/4=0.83。</p>
<p>对于主题 2，平均准确率为(1/1+2/3+3/5+0+0)/5=0.45。</p>
<p>则MAP= (0.83+0.45)/2=0.64。</p>
</blockquote>
<p>应用与协同过滤中的衡量时，也即是测量系统返回推荐项目对应真实用户喜爱偏好的排名的平均准确率。公式如下：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image7.png" rel="shadowbox[post-1542];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb7 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb7.png" width="244" height="74" /></a></p>
<p>其中：U为测试用户集，|U|表示用户集的数目，| R<sub>i</sub> |<sub></sub>表示用户 u<sub>i</sub> 相关的项目（如电影）数据， r<sub>i,j </sub>表示系统为用户u<sub>i</sub> 推荐的第 j 个相关项目对于用户 u<sub>i</sub> 实际的偏好排名。</p>
</p></div>
<h2>6.3 P@n测度</h2>
<div class="vp">
<p>测量对于给定用户ui，前n推荐项目中相关项所占比率。如下公式</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image8.png" rel="shadowbox[post-1542];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb8 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb8.png" width="364" height="55" /></a></p>
</p></div>
<h2>6.4 AUC（Area Under Curve）</h2>
<div class="vp">
<p>对于用户u，推荐性能AUC 衡量指标计算公式如下：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image9.png" rel="shadowbox[post-1542];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb9 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb9.png" width="364" height="55" /></a></p>
<p>其中h（x）是一个指标函数，即若参数值x&gt;0或者逻辑真，着函数值为1，否则为0，Pair(u)是一组用户u待计算的配对集值：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image10.png" rel="shadowbox[post-1542];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb10 推荐系统之协同过滤概述" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb10.png" width="364" height="38" /></a></p>
<p>其中Tr（u）是训练集中用户u已经有的项目集，Ts（u）为测试集中用户实际预期应该被推荐的项目，实际上，这里面的 n 也就是测试集不应该被推荐的项目。AUC取值[0,1]，最好的就是1了。</p>
<p>其实以上可以看出，AUC是相对其他准确率测度最不直接的一个，理由是AUC涉及到所有配对，包含相关的项目以及不相关的项目（那些即不出现在训练集，也不出现在测试集中），尽管如此，因为通常数据集中不相关的项目比相关项目多得多，表明了AUC可以对于项目排序的变化没有那么敏感。</p>
</p></div>
</p></div>
<p><strong>一些参考：</strong></p>
<ul>
<li><a title="http://zh.wikipedia.org/zh-cn/%E5%8D%94%E5%90%8C%E9%81%8E%E6%BF%BE" href="http://zh.wikipedia.org/zh-cn/%E5%8D%94%E5%90%8C%E9%81%8E%E6%BF%BE">http://zh.wikipedia.org/zh-cn/%E5%8D%94%E5%90%8C%E9%81%8E%E6%BF%BE</a></li>
<li><a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/">http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/</a></li>
<li><a href="http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/svd.html">http://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/svd.html</a></li>
<li><a href="http://wenku.baidu.com/view/e12b10ea81c758f5f61f67fb.html">http://wenku.baidu.com/view/e12b10ea81c758f5f61f67fb.html</a></li>
<li><a href="http://zh.wikipedia.org/wiki/Slope_one">http://zh.wikipedia.org/wiki/Slope_one</a></li>
<li><a href="http://www.kuqin.com/algorithm/20080903/16387.html">http://www.kuqin.com/algorithm/20080903/16387.html</a></li>
<li><a href="http://www.cnblogs.com/kuber/archive/2008/06/10/1216846.html">http://www.cnblogs.com/kuber/archive/2008/06/10/1216846.html</a></li>
<li>更多参照文章中的链接</li>
</ul>
<h3>相关文章</h3><ul><li><a href="http://www.vanjor.org/blog/2011/03/java-report-map/" title="Java统计报表与绘图 2011.03.20">Java统计报表与绘图</a>(0)</li>
</ul><h3>最近评论</h3><ul><li><a class="commentor" href="" >wiizane</a> : <a class="comment_content" href="http://www.vanjor.org/blog/2011/05/rs-collaborative-filtering/#comment-193" title="View the entire comment by wiizane" >总结的不错。</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.vanjor.org/blog/2011/05/rs-collaborative-filtering/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>算法：图论中Dijkstra最短路径搜寻算法</title>
		<link>http://www.vanjor.org/blog/2011/05/map-dijkstra/</link>
		<comments>http://www.vanjor.org/blog/2011/05/map-dijkstra/#comments</comments>
		<pubDate>Mon, 09 May 2011 08:23:58 +0000</pubDate>
		<dc:creator>vanjor</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[技术相关]]></category>
		<category><![CDATA[图论]]></category>

		<guid isPermaLink="false">http://www.vanjor.org/blog/2011/05/map-dijkstra/</guid>
		<description><![CDATA[依然记得去年在微软面试的时候，要求写出一个图论中最短路径算法，自己却倍感“欣慰”的写出Prim算法..然后还很疑惑的被告知不正确。算法中必须界定每一步无二性的规则，来不得半点模糊，否则看起来及时很容易理解，实现起来却困重重难。

  

最短路径问题

<span class="readmore"><a href="http://www.vanjor.org/blog/2011/05/map-dijkstra/" title="算法：图论中Dijkstra最短路径搜寻算法">详细阅读:  共4537 字</a></span>]]></description>
			<content:encoded><![CDATA[<p>依然记得去年在微软面试的时候，要求写出一个图论中最短路径算法，自己却倍感“欣慰”的写出Prim算法..然后还很疑惑的被告知不正确。算法中必须界定每一步无二性的规则，来不得半点模糊，否则看起来及时很容易理解，实现起来却困重重难。</p>
<p>  <span id="more-1531"></span><br />
<h1>最短路径问题</h1>
<div class="vp">
<p>最短路径问题是图论研究中的一个经典算法问题， 旨在寻找图（由结点和路径组成的）中两结点之间的最短路径。 算法具体的形式包括：</p>
<ol>
<li>确定起点的最短路径问题：即已知起始结点，求最短路径的问题。</li>
<li>确定终点的最短路径问题：与确定起点的问题相反，该问题是已知终结结点，求最短路径的问题。在无向图中该问题与确定起点的问题完全等同，在有向图中该问题等同于把所有路径方向反转的确定起点的问题。</li>
<li>确定起点终点的最短路径问题：即已知起点和终点，求两结点之间的最短路径。</li>
<li>全局最短路径问题：求图中所有的最短路径。</li>
</ol>
<p>最短路径算法，目前常用的算法有：Dijkstra算法、A*算法、Bellman-Ford算法、Floyd-Warshall算法、Johnson算法。</p>
</p></div>
<h1>Dijkstra算法</h1>
<div class="vp">
<h2>概述</h2>
<div class="vp">
<p><a href="http://www.nocow.cn/index.php/Dijkstra%E7%AE%97%E6%B3%95" target="_blank">Dijkstra </a>算法是一种求单源最短路的算法，即从一个点开始到所有其他点的最短路。 </p>
<p>其基本原理是：每次新扩展一个距离最短的点，更新与其相邻的点的距离。当所有边权都为正时，由于不会存在一个距离更短的没扩展过的点，所以这个点的距离永远不会再被改变，因而保证了算法的正确性。不过根据这个原理，用Dijkstra求最短路的图不能有负权边，因为扩展到负权边的时候会产生更短的距离，有可能就破坏了已经更新的点距离不会改变的性质。</p>
<p>使用条件：</p>
<ul>
<li>有向图与无向图均适用</li>
<li>图中不能存在负权边</li>
</ul></div>
<h2>算法描述</h2>
<div class="vp">
<p>在以下说明中，s为源，w[u,v]为点u和v之间的边的长度，结果保存在dist[]</p>
<ol>
<p>在以下说明中，s为源，w[u,v]为点u和v之间的边的长度，结果保存在dist[]</p>
<ol>
<li>初始化：源的距离dist[s]设为0，其他的点距离设为无穷大，同时把所有的点的状态设为没有扩展过。 </li>
<li>循环n-1次： </li>
<ul>
<li>在没有扩展过的点中取一距离最小的点u，并将其状态设为已扩展。 </li>
<li>对于每个与u相邻的点v，执行<a href="http://www.nocow.cn/index.php/Relax">Relax</a>(u,v)，也就是说，如果dist[u]+w[u,v]&lt;dist[v]，那么把dist[v]更新成更短的距离dist[u]+w[u,v]。此时到点v的最短路径上，前一个节点即为u。</li>
</ul>
<li>结束。此时对于任意的u，dist[u]就是s到u的距离。</li>
</ol>
</ol></div>
<h2>实例</h2>
<div class="vp">
<p>参考严蔚敏C语言版数据结构中的<a href="http://books.google.com.hk/books?id=6xWGGb4z2LgC&amp;pg=PA187&amp;lpg=PA187&amp;dq=%E5%B8%A6%E6%9D%83%E6%9C%89%E5%90%91%E5%9B%BEG6&amp;source=bl&amp;ots=rc1CMkTtZx&amp;sig=3XP2cpW7Jxx2PiBcSz5N41StlEE&amp;hl=zh-CN&amp;ei=FZDGTb7NNo-cvgOgxcWjAQ&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4&amp;ved=0CDAQ6AEwAw#v=onepage&amp;q=%E5%B8%A6%E6%9D%83%E6%9C%89%E5%90%91%E5%9B%BEG6&amp;f=false" target="_blank">图实例</a>：</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image.png" rel="shadowbox[post-1531];player=img;" title="image"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image thumb 算法：图论中Dijkstra最短路径搜寻算法" src="http://www.vanjor.org/blog/wp-content/uploads/2011/05/image_thumb.png" width="199" height="171" /></a></p>
<p>求解过程如下：</p>
<table border="1" cellspacing="1" cellpadding="2" width="540">
<tbody>
<tr>
<td colspan="7"><strong>从v<sub>0</sub>到各点源路径距离求解过程</strong></td>
</tr>
<tr>
<td valign="top" width="81">起点</td>
<td valign="top" width="79">终点</td>
<td valign="top" width="77">step=1</td>
<td valign="top" width="75">step=2</td>
<td valign="top" width="74">step=3</td>
<td valign="top" width="72">step=4</td>
<td valign="top" width="72">step=5</td>
</tr>
<tr>
<td valign="top" width="87">v<sub>0</sub></td>
<td valign="top" width="84">v<sub>0</sub></td>
<td valign="top" width="81">0</td>
<td valign="top" width="78">-</td>
<td valign="top" width="77">-</td>
<td valign="top" width="74">-</td>
<td valign="top" width="74">-</td>
</tr>
<tr>
<td valign="top" width="89">v<sub>0</sub></td>
<td valign="top" width="86">v<sub>1</sub></td>
<td valign="top" width="82">-1</td>
<td valign="top" width="79">-1</td>
<td valign="top" width="78">-1</td>
<td valign="top" width="75">-1</td>
<td valign="top" width="75">-1</td>
</tr>
<tr>
<td valign="top" width="90">v<sub>0</sub></td>
<td valign="top" width="86">v<sub>2</sub></td>
<td valign="top" width="82">10              <br />v<sub>0,</sub>v<sub>2</sub></td>
<td valign="top" width="79">&#160;</td>
<td valign="top" width="78">&#160;</td>
<td valign="top" width="75">&#160;</td>
<td valign="top" width="75">&#160;</td>
</tr>
<tr>
<td valign="top" width="90">v<sub>0</sub></td>
<td valign="top" width="86">v<sub>3</sub></td>
<td valign="top" width="82">-1</td>
<td valign="top" width="79">50              <br />v<sub>0,</sub>v<sub>4</sub><sub>,</sub>v<sub>3</sub></td>
<td valign="top" width="78">&#160;</td>
<td valign="top" width="75">&#160;</td>
<td valign="top" width="75">&#160;</td>
</tr>
<tr>
<td valign="top" width="90">v<sub>0</sub></td>
<td valign="top" width="86">v<sub>4</sub></td>
<td valign="top" width="82">30              <br />v<sub>0，</sub>v<sub>4</sub></td>
<td valign="top" width="79">&#160;</td>
<td valign="top" width="78">&#160;</td>
<td valign="top" width="75">&#160;</td>
<td valign="top" width="75">&#160;</td>
</tr>
<tr>
<td valign="top" width="90">v<sub>0</sub></td>
<td valign="top" width="86">v<sub>5</sub></td>
<td valign="top" width="82">100              <br />v<sub>0，</sub>v<sub>4</sub></td>
<td valign="top" width="79">100              <br />v<sub>0，</sub>v<sub>4</sub></td>
<td valign="top" width="78">90              <br />v<sub>0</sub>,v<sub>4</sub>,v<sub>5</sub><sub> </sub></td>
<td valign="top" width="75">90              <br />v<sub>0</sub>,v<sub>4</sub>,v<sub>3</sub>,v<sub>5</sub><sub> </sub></td>
<td valign="top" width="75">&#160;</td>
</tr>
<tr>
<td valign="top" width="90">当前轮次</td>
<td valign="top" width="86">选取点</td>
<td valign="top" width="82">v<sub>2</sub></td>
<td valign="top" width="79">v<sub>4</sub></td>
<td valign="top" width="78">v<sub>4</sub></td>
<td valign="top" width="75">v<sub>4</sub></td>
<td valign="top" width="75">&#160;</td>
</tr>
<tr>
<td valign="top" width="90">已确定点</td>
<td valign="top" width="86">集合</td>
<td valign="top" width="82">{v<sub>0，</sub>v<sub>2</sub>}</td>
<td valign="top" width="79">{v<sub>0</sub>,v<sub>2</sub>,v<sub>4</sub><sub> </sub>}</td>
<td valign="top" width="78">{v<sub>0</sub>,v<sub>2</sub>,v<sub>4</sub>,v<sub>3 </sub>}</td>
<td valign="top" width="75">{v<sub>o</sub>,v<sub>2</sub>,v<sub>4</sub>,v<sub>3</sub>,v<sub>5</sub><sub> </sub>}</td>
<td valign="top" width="75">&#160;</td>
</tr>
</tbody>
</table></div>
<h2>Java算法实现</h2>
</p></div>
<pre>
<pre class="brush: java; title: ; notranslate">
package org.vanjor.map;

import java.util.ArrayList;
import java.util.LinkedList;

/**
 * Dijkstra最短路径搜寻算法Java实现
 * @author Vanjor
 */
public class DijkstraMap {

	/**
	 * 实现Dijkstra最短路径搜寻算法
	 * @param map
	 *        输入，为图矩阵，可以有向或无向图，距离为-1表示无穷远，一非负值表示一个实际距离
	 *        map[i][i]自身距离初始化为0，
	 *        起始节点从0开始
	 * @param start
	 *        出发节点
	 * @param end
	 *        目标节点
	 * @return
	 *        LinkedList&lt;Integer&gt; ，第一位表示总里程，-1表示无穷远，随后表示从start到end的路径节点
	 */
	public static LinkedList&lt;Integer&gt; getShortest(int[][] map, int start,
			int end) {

		int len = map.length;

		// 对应pathMileage[i]为当前start到i的最短距离
		int[] pathMileage = new int[len];
		boolean[] isDefined = new boolean[len];
		ArrayList&lt;ArrayList&lt;Integer&gt;&gt; pathWay = new ArrayList&lt;ArrayList&lt;Integer&gt;&gt;();

		// 初始化里程计数与是否确定为最短里程的标记量
		for (int cursor = 0; cursor &lt; len; cursor++) {
			pathMileage[cursor] = map[start][cursor];
			pathWay.add(new ArrayList&lt;Integer&gt;());
			if (pathMileage[cursor] &gt;= 0) {
				pathWay.get(cursor).add(start);
				pathWay.get(cursor).add(cursor);
			}
			isDefined[cursor] = false;
		}

		// 初始化对应 start-&gt;start的里程距离为0，并且确定为start-&gt;start最短里程
		pathMileage[start] = 0;
		isDefined[start] = true;

		// 将len长度的点，分类两组，一组是确定好了start到该点最短距离的点集，
		// 对应isDefined标记为true， 另一组为尚未确定，对应isDefined标记为true
		// 其中addUpCount为对以确定好最短距离点集的计数

		int addUpCount = 1;

		// 当节点全部确定最短距离后，即退出循环检查
		while (addUpCount &lt; len) {
			// 每一轮次，待确定最短距离集中的最小值
			int turnMinMileage = -1;
			// 对应最小值的pathMileage行值
			int turnMinPoint = -1;

			for (int cusor = 0; cusor &lt; len; cusor++) {
				// 如果对应的节点cusor已经确定最短距离则不参与排序搜寻
				if (isDefined[cusor]) {
					continue;
				}
				// 在当前未确定最短距离的节点集中找出最短距离turnMinMileage
				// 以及对应节点isDefined
				if (turnMinMileage == -1 &amp;&amp; pathMileage[cusor] &gt;=0) {
					// 对遇到第一个不是无穷远的距离点，将对应的值覆盖初始化点
					turnMinMileage = pathMileage[cusor];
					turnMinPoint = cusor;
				} else if (turnMinMileage &gt;= 0 &amp;&amp; pathMileage[cusor] &gt;=0
						&amp;&amp; pathMileage[cusor] &lt; turnMinMileage) {
					// 找到更小的点，进行覆盖
					turnMinMileage = pathMileage[cusor];
					turnMinPoint = cusor;
				}
			}

			// 如果当前轮次，再也找不到距离非无穷远的未确定远点，
			// 则证明剩下的点为非连通点，也可同样退出while循环检查
			if (turnMinMileage == -1) {
				break;
			}

			// 为当前所找到的最短距离点标记为已确定
			isDefined[turnMinPoint] = true;
			// 已确定点+1计数
			addUpCount++;

			// 遍历查看，对于新加点turnKeyPoint，
			// 有没有可能改进原始的start到各点的最短距离
			for (int cursor = 0; cursor &lt; len; cursor++) {
				// 已确定的就不在考虑中
				if (isDefined[cursor]) {
					continue;
				}
				// 当pathMileage以登记的start-&gt;turnKeyPoint以及
				// turnKeyPoint—&gt;cursor的距离都非无限远，则可以考虑比较
				if (pathMileage[turnMinPoint] != -1
						&amp;&amp; map[turnMinPoint][cursor] != -1) {
					// 待考虑的新加节点turnKeyPoint组成的路径start-&gt;..-&gt;turnKeyPoint-&gt;cursor；
					int newLen = pathMileage[turnMinPoint]
							+ map[turnMinPoint][cursor];
					// 作比较，若小则覆盖,或者原来距离为无穷远也覆盖
					if (newLen &lt; pathMileage[cursor]
							|| pathMileage[cursor] == -1) {
						pathMileage[cursor] = newLen;
						copyPathWay(pathWay.get(turnMinPoint), pathWay
								.get(cursor), cursor);
					}
				}
			}
		}
		LinkedList&lt;Integer&gt; rs = new LinkedList&lt;Integer&gt;();
		rs.addAll(pathWay.get(end));
		rs.add(0, pathMileage[end]);
		return rs;
	}

	private static void copyPathWay(ArrayList&lt;Integer&gt; source,
			ArrayList&lt;Integer&gt; destiny, int addPoint) {
		while (!destiny.isEmpty()) {
			destiny.remove(0);
		}
		destiny.addAll(source);
		destiny.add(addPoint);
	}

	//初始化图
	public static int[][] generateMap() {
		int[][] map = new int[6][6];
		map[0][5] = 100;
		map[0][4] = 30;
		map[0][2] = 10;
		map[1][2] = 5;
		map[2][3] = 50;
		map[3][5] = 10;
		map[4][5] = 60;
		map[4][3] = 20;
		int len = map.length;
		for (int i = 0; i &lt; len; i++) {
			for (int j = 0; j &lt; len; j++) {
				if (i == j) {
					map[i][j] = 0;
				} else if (map[i][j] == 0) {
					map[i][j] = -1;
				}
			}
		}
		return map;
	}

	public static void main(String[] args) {
		System.out.println(getShortest(generateMap(), 0, 5));
	}
}
</pre>
</pre>
<p>参考：</p>
<ul>
<li><a href="http://www.nocow.cn/index.php/Dijkstra%E7%AE%97%E6%B3%95">http://www.nocow.cn/index.php/Dijkstra%E7%AE%97%E6%B3%95</a></li>
<li><a href="http://baike.baidu.com/view/7839.htm">http://baike.baidu.com/view/7839.htm</a></li>
<li><a href="http://2728green-rock.blog.163.com/blog/static/43636790200901211848284/">http://2728green-rock.blog.163.com/blog/static/43636790200901211848284/</a></li>
<li><a href="http://books.google.com.hk/books?id=6xWGGb4z2LgC&amp;printsec=frontcover&amp;hl=zh-CN">http://books.google.com.hk/books?id=6xWGGb4z2LgC&amp;printsec=frontcover&amp;hl=zh-CN</a></li>
</ul>
<h3>相关文章</h3><ul><li>0</li></ul><h3>最近评论</h3><ul></ul>]]></content:encoded>
			<wfw:commentRss>http://www.vanjor.org/blog/2011/05/map-dijkstra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>你心中的成功与意义是什么?</title>
		<link>http://www.vanjor.org/blog/2011/04/what-is-success-and/</link>
		<comments>http://www.vanjor.org/blog/2011/04/what-is-success-and/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 16:06:30 +0000</pubDate>
		<dc:creator>vanjor</dc:creator>
				<category><![CDATA[光影]]></category>
		<category><![CDATA[指尖心情]]></category>
		<category><![CDATA[意义]]></category>
		<category><![CDATA[成功]]></category>

		<guid isPermaLink="false">http://www.vanjor.org/blog/2011/04/what-is-success-and/</guid>
		<description><![CDATA[这个话题，是有感于最近的两条线索而引发的一些思考：

    



<span class="readmore"><a href="http://www.vanjor.org/blog/2011/04/what-is-success-and/" title="你心中的成功与意义是什么?">详细阅读:  共2017 字</a></span>]]></description>
			<content:encoded><![CDATA[<p>这个话题，是有感于最近的两条线索而引发的一些思考：</p>
<div>   <span id="more-1519"></span> </div>
<ul>
<li><strong>其一：</strong>知乎上某人写面试豆瓣产品经理的经历，被N顿逼问成功还是失败，过程很欢乐，详情：<a title="http://www.douban.com/note/146145117/" href="http://www.douban.com/note/146145117/">http://www.douban.com/note/146145117/</a>，下面给出一个片段：</li>
</ul>
<blockquote><p>大眼哥哥：那么一个成功的产品的标准又是什么？</p>
<p>我道：理想的情况是，既让用户满意，得到了用户的美誉，又完成了领导的战略，达到了比如说赚钱这种目标，这就是一个很不错的产品。</p>
<p>大眼哥哥：不错是什么，如果必须界定成功或失败呢？</p>
<p>我道：那么就说是一个成功的产品吧。</p>
<p>大眼哥哥：哦，这样就是成功的，那按照你这么说，腾讯的QQ秀之类的，都是成功的产品咯？</p>
<p>我道：嗯，虽然是运营为主的一个产品，但是也不算失败吧。</p>
<p>大眼哥哥：什么叫不算失败，是成功还是失败，我需要知道你的标准！</p>
<p>我内心独白：汗&#8230;&#8230;</p>
<p>我道：非要这么界定的话，那就算是成功的产品吧。</p>
<p>大眼哥哥：那么按照你的标准，随便来一个人，只要他做得产品是符合领导需求的，用户也很喜欢，那就是成功的产品经理咯？那么是不是说一个SP的彩信做得很赚钱，也是一个成功的产品经理？</p>
<p>我道：这种情况，要看一个前提，看是否运营层面占主流，比如类似新浪微博这样的产品，可能产品上并没有多大的创新，但是运营的好，所以产品水平一般，但是也很受欢迎。</p>
<p>(此时，我似乎看到了大眼哥哥眼中金光一闪，犹如老鹰看到了脱兔的眼神！）</p>
<p>大眼哥哥：所以，你觉得新浪微博是一个成功还是失败的产品？</p>
</blockquote>
<ul>
<li><strong>其二：</strong>校内上一同学的状态：很早就听过一个说法，大部分人的苦恼来自“他既想活得成功，又想活得有意义”。我还是不知道自己究竟想要哪种人生。</li>
</ul>
<p>倘若有一天，有人问我，我活到现在自我感觉活的成功么，有意义么？我自己都怕不知怎么去回答，似乎我们天天挂在嘴头或心头，某某做的比较成功，最近做的很没意义，究竟什么是算为成功，什么才是有意义呢？我们心里的那件标杆又是什么呢？</p>
<p><a href="http://www.vanjor.org/blog/wp-content/uploads/2011/04/key-success.jpg" rel="shadowbox[post-1519];player=img;" title="key-success"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="key-success" border="0" alt="key success thumb 你心中的成功与意义是什么?" src="http://www.vanjor.org/blog/wp-content/uploads/2011/04/key-success_thumb.jpg" width="244" height="206" /></a></p>
<p>从权威百科参考：</p>
<ul>
<li><strong><a href="http://baike.baidu.com/view/19192.htm" target="_blank">成功</a></strong>，即获得预期的结果，异或逐步实现有价值的理想。</li>
<li><strong><a href="http://baike.baidu.com/view/143020.htm" target="_blank">意义</a></strong>，一个人或事给人的主客观判断，又做作用，价值。</li>
</ul>
<h3>对于其一：</h3>
<p><strong></strong>参照百科释义，成功的标准其实是很简单，也就是做一件事情，并且达到预期的目的。很明显，其实这个最原始的成功并无任何褒贬之意（比如特工成功的完成了该次刺杀行动），而且只有执行人才能最好的判定成功与否，因为执行人才是在执行前设定目标的。如果让旁人评测的话，那么旁人只能是选取一些相对坐标，评估当事人的目标，依照所选取的参照系评估当事人的完成的情况，这样判定起来也就简单了，也就不会总是让是否有意义什么的混杂在其中。</p>
<p>如果下次要是对方问我一个成功的产品的标准又是什么？我会首先回答，成功的标准就是达到产品实现设定的预期的结果。哈哈。</p>
<h3>对于其二：</h3>
<p>实质上也是要找到成功与意义的本质与衡量标准，从文中推断，这个成功是活在他人眼中的成功，这个意义是活在自己心中有意义，其实更多的时候这两者处在完全不同的参照系中，而又大家基本具有普世的自然观与价值观，两者又并不矛盾。</p>
<p>从权威百科参考：实际上成功就是追求一个有意义的结果。也就是实际上成功与意义内涵是一致性的内核都是在于价值的判断，成功与意义均是表象，透过现象看本质，实质上是表里如一的，价值的统一体，最原始的成功与意义定义与判定都应当是从自身角度（价值观）去判定权衡。</p>
<p>但是大众在做成功与意义的判断时，往往没有严格遵守完全从自身角度（排他性的）观察判定的标准，大众的认识角度成功是外显的（外部显露，他人的看法），意思是内省的（自我认识与价值判定），而每个人的价值观世界观并非一致，决定了自我的价值观与他们的价值观的矛盾差异性，也就让大众所认识的成功与自我认定的意义看起来是时常矛盾的。</p>
<p>因而在一件件事情前，当自我的价值观与他人或大众价值观不一致的情况下，个人必须做出抉择，是妥协与他人还是坚持自己。这也就是为什么小时候教育就开始培养大家树立正确的价值观与社会观，因为那些如果价值观社会观完全与普世的偏差太大或对立下，那个自我的坚持必然导致一种与社会的格格不入，更严重得则是走向一种自我毁灭。</p>
<p>而实际上最后问题等同于是选择活在自己心中还是活在他人眼里，假定普世的世界观和价值观是完美的，并且大众都达到这一水平，那么这个矛盾实际上就是个人的价值观并没有达到普世的价值观一个高度与完美上，而事实上，当前并没有一个普世的世界观与价值观，每个人所参考的外显成功定义都是选取一个子集合作为坐标参照系与自身的内显意义做比较而得出的矛盾，因而综上所述，最后问题的答案也在于此：你是想活在自己的心中，还是活在“我”的心中。</p>
<p>最后附一个白岩松的语句，一家之言，仁者见仁智者见智：</p>
<blockquote><p>我们支援朝鲜石油、粮食，却发现那是个无底洞；支援外蒙建设，他们却把中国工人关进监狱；支持非洲建厂，他们却责怪中国设备落后。这些受援国对中国并无好感，中国的牺牲和奉献得不到友谊，难道中国人是天下最大傻瓜？中国与世界脱节最大是普世价值，与他国没有共同的价值观，所以得不到朋友。</p>
</blockquote>
<h3>相关文章</h3><ul><li>0</li></ul><h3>最近评论</h3><ul><li><a class="commentor" href="" >vanjor</a> : <a class="comment_content" href="http://www.vanjor.org/blog/2011/04/what-is-success-and/#comment-187" title="View the entire comment by vanjor" >额，暴露了~想着想着觉得还是单独写出来，恩，要是能出去读书就更好了，北京人口大约是武汉人口的2倍，志...</a></li>
<li><a class="commentor" href="http://blog.hjenglish.com/lyad0501/" >lilyy</a> : <a class="comment_content" href="http://www.vanjor.org/blog/2011/04/what-is-success-and/#comment-186" title="View the entire comment by lilyy" >呵呵，看来大家都对这个问题比较困惑~~要是我不能出去念书，我也想来北京，在这里应该能找到更多志同道合...</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.vanjor.org/blog/2011/04/what-is-success-and/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>算法：已排序数组中找出现最多的数字</title>
		<link>http://www.vanjor.org/blog/2011/04/puzzle-array-find-most/</link>
		<comments>http://www.vanjor.org/blog/2011/04/puzzle-array-find-most/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 15:09:54 +0000</pubDate>
		<dc:creator>vanjor</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[技术相关]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.vanjor.org/blog/2011/04/puzzle-array-find-most/</guid>
		<description><![CDATA[最近心情始终不太好，每天看情况都亲自解决一个算法问题吧，权当练手。

题目如下：

给定一个数组，内容是已经排序好的整数，并且确定有一个数的出现次数大于数组长度的一半，试着最快找出那个数。

<span class="readmore"><a href="http://www.vanjor.org/blog/2011/04/puzzle-array-find-most/" title="算法：已排序数组中找出现最多的数字">详细阅读:  共1442 字</a></span>]]></description>
			<content:encoded><![CDATA[<p>最近心情始终不太好，每天看情况都亲自解决一个算法问题吧，权当练手。</p>
<p>题目如下：</p>
<blockquote><p>给定一个数组，内容是已经排序好的整数，并且确定有一个数的出现次数大于数组长度的一半，试着最快找出那个数。</p>
<p>如{ 1, 1, 4, 6, 6, 6, 6, 6, 6, 7 } 对应所找的数为6</p>
</blockquote>
<div><span id="more-1516"></span></div>
<p>方案一：对于数字序列问题，很多都是最后归结与查找，排序的核心问题，此题最明显的一个想法是遍历数组，并且对与每个不同的数字进行计数，用Set或者hash的array来统计，此处不列出该方法解答。</p>
<p>方案二：注意到是已经排序好的数组，那么每个相同的数也都是连续的，包括待求数，顺序遍历数组，设立一个标记量A记录当前出现次数最多的数，初始置零，一个标记量B记录出现该数的出现次数统计值，初始置零，游标从第一个数开始，不断统计，若出现新的记录，则放到标记量A，B中，最后返回的A，即为所求之数即为数组中出现次数最多那个数：</p>
<p>算法如下：</p>
<pre>
<pre class="brush: java; title: ; notranslate">
	public static int getMostPoint1(int[] array) {
		//当前序列标记值，与次数值
		int mostNumber = 0, mostNumberCount = 0;
		//游标临时数，与次数统计值
		int cusorNumber = array[0], cusorNumberCount = 0;
		for (int index = 0; index &lt; array.length; index++) {
			if (cusorNumber == array[index]) {
				cusorNumberCount++;
			} else {
				if (cusorNumberCount &gt; mostNumberCount) {
					mostNumber = cusorNumber;
					mostNumberCount = cusorNumberCount;
				}
                                //重置游标临时值
				cusorNumber = array[index];
				cusorNumberCount = 1;
			}
		}
		return mostNumber;
	}
</pre>
</pre>
<p>方案三：注意到题目中，所出现次数大于长度的一半，那么，实际上方案二中，若游标数统计值没有到长度的一般，就可立刻抛弃，不需要标记量记录，也就是找到就返回，没有找到继续找。基于方案二的算法可以更简洁化：</p>
<p>算法如下：</p>
<pre>
<pre class="brush: java; title: ; notranslate">
	public static int getMostPoint2(int[] array) {
		int cusorNumber = array[0], cusorNumberCount = 0;
		//若次数大于长度一半，立刻退出循环，并返回该数
		for (int index = 0; index &lt; array.length
				&amp;&amp; cusorNumberCount &lt;= array.length / 2; index++) {
			if (cusorNumber == array[index]) {
				cusorNumberCount++;
			} else {
				cusorNumber = array[index];
				cusorNumberCount = 1;
			}
		}
		return cusorNumber;
	}
</pre>
</pre>
<p>方案四：注意到某个数次数大于数组长度的一半，那么假设长度100的Array[100]，判断A[0]是否为所求数，实际上看A[0]==A[50]成立与否就行，那么A[1]呢..那么A[99]呢？那么仔细想想，其实这道题目的答案很happy的只用一行计算语句:</p>
<p>算法如下：</p>
<pre>
<pre class="brush: java; title: ; notranslate">
	public static int getMostPoint3(int[] array) {
		return array[array.length / 2];
	}
</pre>
</pre>
<p style="margin:0;padding:0;height:1px;overflow:hidden;">
    <script type="text/javascript"><!--
        var wumiiSitePrefix = "http://www.vanjor.org/blog";
        var wumiiEnableCustomPos = false;
        var wumiiParams = "&#038;num=4&#038;mode=3&#038;displayInFeed=1&#038;version=1.0.5.5&#038;pf=WordPress2.9.2";
    //--></script><script type="text/javascript" src="http://widget.wumii.com/ext/relatedItemsWidget.htm"></script><a href="http://www.wumii.com/widget/relatedItems.htm" style="border:0;"><img src="http://static.wumii.com/images/pixel.png" alt="pixel 算法：已排序数组中找出现最多的数字" style="border:0;padding:0;margin:0;" title="算法：已排序数组中找出现最多的数字" /></a></p>
<h3>相关文章</h3><ul><li><a href="http://www.vanjor.org/blog/2011/05/sorting-collections/" title="排序算法大合集与思考 2011.05.24">排序算法大合集与思考</a>(1)</li>
<li><a href="http://www.vanjor.org/blog/2011/05/find-dic-substring/" title="算法：求字符串指定最小全集子串 2011.05.23">算法：求字符串指定最小全集子串</a>(0)</li>
<li><a href="http://www.vanjor.org/blog/2011/04/kirkman-puzzle/" title="算法：科克曼女生问题的一种解法 2011.04.22">算法：科克曼女生问题的一种解法</a>(0)</li>
</ul><h3>最近评论</h3><ul><li><a class="commentor" href="" >tian</a> : <a class="comment_content" href="http://www.vanjor.org/blog/2011/04/puzzle-array-find-most/#comment-267" title="View the entire comment by tian" >o ,是不确定有这个过半的数的时候</a></li>
<li><a class="commentor" href="" >tian</a> : <a class="comment_content" href="http://www.vanjor.org/blog/2011/04/puzzle-array-find-most/#comment-266" title="View the entire comment by tian" >这个题似乎有O(logn)的解法</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.vanjor.org/blog/2011/04/puzzle-array-find-most/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

