<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[php的PriorityQueue（优先级队列的实现） ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Mon, 16 Nov 2009 05:04:54 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	今天项目，由于性能问题，需要修改排序算法。<br/><br/>根据项目实际情况，数据采用了分页结构,每页30条数据，对于第一页的数据，我只需要排出top30，第二页排出top60，所以不需要进行全部排序。<br/><br/>这样会导致一个问题，越靠后面的页数，性能越差，但在实际应用中，这里是要进行的是排序（排行），排行榜后面的数据也无意义，所以限制的最大排序量为top4000,足够了。<br/><br/> <br/><br/>本人脑子很笨，没学过数据结构，自今没能理解堆排序的原理，同事讲了一下午也没听明白。<br/><br/>还好看CLUCENE的时候，知道lucene里实现了一个，索性照葫芦画瓢，将C++的实现修改为了PHP的实现，中途因一个变量名的原因，调试了一下午，在这里贴出来一下。<br/><br/><br/><div class="code">class PriorityQueue <br/>&#123;<br/> private $heap;<br/> private $_size;<br/> private $maxSize;<br/> <br/> public function debug()<br/> &#123;<br/>&nbsp;&nbsp;print_r($this-&gt;heap);<br/> &#125;<br/> private function upHeap()<br/> &#123;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;$i=$this-&gt;_size;<br/>&nbsp;&nbsp;$node=$this-&gt;heap&#91;$i&#93;;<br/>&nbsp;&nbsp;$j=intval($i&gt;&gt;1);<br/>&nbsp;&nbsp;while($j&gt;0&amp;&amp;$this-&gt;lessThan($node,$this-&gt;heap&#91;$j&#93;))<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; $this-&gt;heap&#91;$i&#93;=$this-&gt;heap&#91;$j&#93;;<br/>&nbsp;&nbsp; $i=$j;<br/>&nbsp;&nbsp; $j=intval($j&gt;&gt;1);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;$this-&gt;heap&#91;$i&#93;=$node;<br/>&nbsp;&nbsp;<br/> &#125;<br/> <br/> private function downHeap()<br/> &#123;<br/>&nbsp;&nbsp;$i=1;<br/>&nbsp;&nbsp;$node=$this-&gt;heap&#91;$i&#93;;<br/>&nbsp;&nbsp;$j=intval($i&lt;&lt;1);<br/>&nbsp;&nbsp;$k=$j+1;<br/>&nbsp;&nbsp;if($k&lt;=$this-&gt;_size&amp;&amp;$this-&gt;lessThan($this-&gt;heap&#91;$k&#93;,$this-&gt;heap&#91;$j&#93;))<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; $j=$k;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;while($j&lt;=$this-&gt;_size&amp;&amp;$this-&gt;lessThan($this-&gt;heap&#91;$j&#93;,$node))<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; $this-&gt;heap&#91;$i&#93;=$this-&gt;heap&#91;$j&#93;;<br/>&nbsp;&nbsp; $i=$j;<br/>&nbsp;&nbsp; $j=intval($i&lt;&lt;1);<br/>&nbsp;&nbsp; $k=$j+1;<br/>&nbsp;&nbsp; if($k&lt;=$this-&gt;_size&amp;&amp;$this-&gt;lessThan($this-&gt;heap&#91;$k&#93;,$this-&gt;heap&#91;$j&#93;))<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$j=$k;<br/>&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;$this-&gt;heap&#91;$i&#93;=$node;<br/> &#125;<br/> <br/> <br/> function __construct()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;$this-&gt;_size=0;<br/>&nbsp;&nbsp;$this-&gt;heap=null;<br/>&nbsp;&nbsp;$this-&gt;maxSize=0; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;function __destruct()<br/> &#123;<br/>&nbsp;&nbsp;$this-&gt;clear();<br/>&nbsp;&nbsp;unset($this-&gt;heap);<br/> &#125;<br/> <br/> function put($element)<br/> &#123;<br/>&nbsp;&nbsp;if($this-&gt;_size&gt;=$this-&gt;maxSize)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; return false;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;++$this-&gt;_size;<br/>&nbsp;&nbsp;$this-&gt;heap&#91;$this-&gt;_size&#93;=$element;<br/>&nbsp;&nbsp;$this-&gt;upHeap();<br/>&nbsp;&nbsp;return true;<br/> &#125;<br/> <br/> function insert($element)<br/> &#123;<br/>&nbsp;&nbsp;if($this-&gt;_size&lt;$this-&gt;maxSize)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; return $this-&gt;put($element);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;else if($this-&gt;_size&gt;0)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; $top=$this-&gt;top();<br/>&nbsp;&nbsp; if(!$this-&gt;lessThan($element,$top))<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;heap&#91;1&#93;=$element;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;adjustTop();<br/>&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;return false;<br/> &#125;<br/> <br/> <br/> function top()<br/> &#123;<br/>&nbsp;&nbsp;if($this-&gt;_size&gt;0)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; return $this-&gt;heap&#91;1&#93;;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;return null;<br/> &#125;<br/> <br/> function pop()<br/> &#123;<br/>&nbsp;&nbsp;if($this-&gt;_size&gt;0)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp; $result=$this-&gt;heap&#91;1&#93;;<br/>&nbsp;&nbsp; $this-&gt;heap&#91;1&#93;=$this-&gt;heap&#91;$this-&gt;_size&#93;;<br/>&nbsp;&nbsp; $this-&gt;heap&#91;$this-&gt;_size&#93;=0;<br/>&nbsp;&nbsp; --$this-&gt;_size;<br/>&nbsp;&nbsp; $this-&gt;downHeap();<br/>&nbsp;&nbsp; return $result;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;return null;<br/> &#125;<br/> <br/> <br/> function adjustTop()<br/> &#123;<br/>&nbsp;&nbsp;$this-&gt;downHeap();<br/> &#125;<br/> <br/> <br/> function size()<br/> &#123;<br/>&nbsp;&nbsp;return $this-&gt;_size;<br/> &#125;<br/> <br/> function clear()<br/> &#123;<br/>&nbsp;&nbsp;$this-&gt;_size=0;<br/> &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public function initialize($maxSize)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;_size=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp; $heapSize=$maxSize+1;<br/>&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;heap=array();<br/>&nbsp;&nbsp;&nbsp;&nbsp; for($i=0;$i&lt;$heapSize;$i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;heap&#91;&#93;=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;maxSize=$maxSize;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/> <br/> <br/> //根据需要在子类中重写<br/> public function lessThan($cmp1,$cmp2)<br/> &#123;<br/>&nbsp;&nbsp;return $cmp1&lt;$cmp2;<br/> &#125;<br/>&nbsp;&nbsp; <br/>&#125;</div><br/> <br/><br/> <br/><br/>//使用方法如下，lessThan是比较函数，根据需要在子类中重写：<br/><br/><br/><div class="code">$arrayRand=array();<br/>for($i=10;$i&gt;=0;$i--)<br/>&#123;<br/> $arrayRand&#91;&#93;=rand(0, 10);;<br/>&#125;<br/><br/>print_r($arrayRand);<br/><br/>$query=new PriorityQueue();<br/>$query-&gt;initialize(5);<br/>foreach($arrayRand as $eachValue)<br/>&#123;<br/> $query-&gt;insert($eachValue);<br/>&#125;<br/>while(true)<br/>&#123;<br/> $element=$query-&gt;pop();<br/> if($element===null)<br/> &#123;<br/>&nbsp;&nbsp;break;<br/> &#125;<br/> echo &quot;###&#123;$element&#125;&#92;n&quot;;<br/>&#125;</div>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] php的PriorityQueue（优先级队列的实现） ]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>