﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-庄周梦蝶，孰蝶是我，我是孰蝶？一梦至今，蝶我已难分-随笔分类-数据结构与算法</title><link>http://www.blogjava.net/killme2008/category/20137.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 01 Jun 2008 10:23:15 GMT</lastBuildDate><pubDate>Sun, 01 Jun 2008 10:23:15 GMT</pubDate><ttl>60</ttl><item><title>sicp4.1.1-4.1.2节部分习题尝试解答</title><link>http://www.blogjava.net/killme2008/archive/2008/06/01/205155.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sun, 01 Jun 2008 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/06/01/205155.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/205155.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/06/01/205155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/205155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/205155.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 当将用scheme写的scheme求值器跑起来的时候，你不觉的兴奋是不可能的，真的太酷了，太magic了。<br />
习题4.2，如果将application？判断放在define?判断之前，那么求值(define x 3)将把define当作一般的procedure应用于参数x和3，可是define是特殊的语法形式，而非一般过程，导致出错。<br />
习题4.4，我的解答，eval增加两个判断：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;((and</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;exp)<br />
&nbsp;&nbsp;&nbsp;(eval</span><span style="color: #000000;">-</span><span style="color: #000000;">and&nbsp;(and</span><span style="color: #000000;">-</span><span style="color: #000000;">exps&nbsp;exp)&nbsp;env))<br />
&nbsp;((or</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;exp)<br />
&nbsp;&nbsp;&nbsp;(eval</span><span style="color: #000000;">-</span><span style="color: #000000;">or&nbsp;(or</span><span style="color: #000000;">-</span><span style="color: #000000;">exps&nbsp;exp)&nbsp;env))</span></div>
实现谓词和各自的过程：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(and</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;exp)&nbsp;<br />
&nbsp;&nbsp;(tagged</span><span style="color: #000000;">-</span><span style="color: #000000;">list</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;exp&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">and))</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">(define&nbsp;(and</span><span style="color: #000000;">-</span><span style="color: #000000;">exps&nbsp;exp)<br />
&nbsp;&nbsp;(cdr&nbsp;exp))<br />
(define&nbsp;(eval</span><span style="color: #000000;">-</span><span style="color: #000000;">and&nbsp;exps&nbsp;env)<br />
&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #0000ff;">null</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;exps)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">true)</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((result&nbsp;(eval&nbsp;(car&nbsp;exps)&nbsp;env)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(not&nbsp;result)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(eval</span><span style="color: #000000;">-</span><span style="color: #000000;">and&nbsp;(cdr&nbsp;exps)&nbsp;env))))))<br />
(define&nbsp;(or</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;exp)<br />
&nbsp;&nbsp;(tagged</span><span style="color: #000000;">-</span><span style="color: #000000;">list</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;exp&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">or))</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">(define&nbsp;(or</span><span style="color: #000000;">-</span><span style="color: #000000;">exps&nbsp;exp)&nbsp;(cdr&nbsp;exp))<br />
(define&nbsp;(eval</span><span style="color: #000000;">-</span><span style="color: #000000;">or&nbsp;exps&nbsp;env)<br />
&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #0000ff;">null</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;exps)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">false)</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((result&nbsp;(eval&nbsp;(car&nbsp;exps)&nbsp;env)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;result<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(eval</span><span style="color: #000000;">-</span><span style="color: #000000;">or&nbsp;(cdr&nbsp;exps)&nbsp;env))))))</span></div>
<br />
如果用宏实现就简单了：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define</span><span style="color: #000000;">-</span><span style="color: #000000;">syntax&nbsp;and<br />
&nbsp; (syntax</span><span style="color: #000000;">-</span><span style="color: #000000;">rules&nbsp;()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((_)&nbsp;#t)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((_&nbsp;e)&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((_&nbsp;e1&nbsp;e2&nbsp;e3&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;e1&nbsp;(and&nbsp;e2&nbsp;e3&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)&nbsp;#f))))<br />
(define</span><span style="color: #000000;">-</span><span style="color: #000000;">syntax&nbsp;or<br />
&nbsp;&nbsp; (syntax</span><span style="color: #000000;">-</span><span style="color: #000000;">rules&nbsp;()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((_)&nbsp;#f)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((_&nbsp;e)&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((_&nbsp;e1&nbsp;e2&nbsp;e3&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (let&nbsp;((t&nbsp;e1))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;t&nbsp;t&nbsp;(or&nbsp;e2&nbsp;e3&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />))))))</span></div>
<br />
习题4.5，cond的扩展形式，也不难，在else子句之外增加个判断，是否带有=&gt;符号，修改expand-clauses过程：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define (cond-extended-clauses? clause)<br />
&nbsp; (and (&gt; (length clause) 2) (eq? (cadr clause) '=&gt;)))<br />
(define (extended-cond-test clause)<br />
&nbsp; (car clause))<br />
(define (extended-cond-recipient clause)<br />
&nbsp; (caddr clause)<br />
(define&nbsp;(expand</span><span style="color: #000000;">-</span><span style="color: #000000;">clauses&nbsp;clauses)<br />
&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;clauses)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">false</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((first&nbsp;(car&nbsp;clauses))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(rest&nbsp;(cdr&nbsp;clauses)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((cond</span><span style="color: #000000;">-</span><span style="color: #0000ff;">else</span><span style="color: #000000;">-</span><span style="color: #000000;">clauses</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;first)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;rest)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sequence</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">exp&nbsp;(cond</span><span style="color: #000000;">-</span><span style="color: #000000;">actions&nbsp;first))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(error&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">else&nbsp;clause&nbsp;is&nbsp;not&nbsp;LAST</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;clauses)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((cond</span><span style="color: #000000;">-</span><span style="color: #000000;">extended</span><span style="color: #000000;">-</span><span style="color: #000000;">clauses</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;first)&nbsp; ;判断是否扩展形式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #0000ff;">if</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(extended</span><span style="color: #000000;">-</span><span style="color: #000000;">cond</span><span style="color: #000000;">-</span><span style="color: #000000;">test&nbsp;first)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(extended</span><span style="color: #000000;">-</span><span style="color: #000000;">cond</span><span style="color: #000000;">-</span><span style="color: #000000;">recipient&nbsp;first)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(extended</span><span style="color: #000000;">-</span><span style="color: #000000;">cond</span><span style="color: #000000;">-</span><span style="color: #000000;">test&nbsp;first))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(expand</span><span style="color: #000000;">-</span><span style="color: #000000;">clauses&nbsp;rest)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(cond</span><span style="color: #000000;">-</span><span style="color: #000000;">predicate&nbsp;first)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sequence</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">exp&nbsp;(cond</span><span style="color: #000000;">-</span><span style="color: #000000;">actions&nbsp;first))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(expand</span><span style="color: #000000;">-</span><span style="color: #000000;">clauses&nbsp;rest)))))))</span></div>
<br />
习题4.6，let如果用宏定义，类似这样：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define</span><span style="color: #000000;">-</span><span style="color: #000000;">syntax&nbsp;let<br />
&nbsp;&nbsp;(syntax</span><span style="color: #000000;">-</span><span style="color: #000000;">rules&nbsp;()<br />
&nbsp;&nbsp;&nbsp;&nbsp;((_&nbsp;((x&nbsp;v)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)&nbsp;e1&nbsp;e2&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #0000ff;">lambda</span><span style="color: #000000;">&nbsp;(x&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)&nbsp;e1&nbsp;e2&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)&nbsp;v&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />))))</span></div>
求值器扩展，实现let-&gt;combination过程：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(let?&nbsp;exp)<br />
&nbsp;&nbsp;(tagged</span><span style="color: #000000;">-</span><span style="color: #000000;">list?&nbsp;exp&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">let))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">(define&nbsp;(let</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">combination&nbsp;exp)<br />
&nbsp;&nbsp;(let&nbsp;((vars&nbsp;(map&nbsp;car&nbsp;(cadr&nbsp;exp)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(vals&nbsp;(map&nbsp;cadr&nbsp;(cadr&nbsp;exp)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(body&nbsp;(caddr&nbsp;exp)))<br />
&nbsp;&nbsp;(cons&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #0000ff;">lambda</span><span style="color: #000000;">&nbsp;vars&nbsp;(list&nbsp;body))&nbsp;vals)))</span></div>
我们做的仅仅是syntax transform，将let转成对应的lambda形式。<br />
<br />
习题4.7，这里的关键在于let*-&gt;netsted-lets要递归调用，从let*的宏定义可以看出：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define</span><span style="color: #000000;">-</span><span style="color: #000000;">syntax&nbsp;let</span><span style="color: #000000;">*</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(syntax</span><span style="color: #000000;">-</span><span style="color: #000000;">rules()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((_&nbsp;((var1&nbsp;val1))&nbsp;e1&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((var1&nbsp;val1))&nbsp;e1&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((_&nbsp;((var1&nbsp;val1)&nbsp;(var2&nbsp;val2)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)&nbsp;e1&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((var1&nbsp;val1))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;((var2&nbsp;val2)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)))))</span></div>
那么，let*-&gt;nested-lets可以定义为：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">(define&nbsp;(let</span><span style="color: #000000;">*</span><span style="color: #000000;">?&nbsp;exp)<br />
&nbsp;&nbsp;(tagged</span><span style="color: #000000;">-</span><span style="color: #000000;">list?&nbsp;exp&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">let*))</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">(define&nbsp;(let</span><span style="color: #000000;">*-&gt;</span><span style="color: #000000;">nested</span><span style="color: #000000;">-</span><span style="color: #000000;">lets&nbsp;exp)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((pairs&nbsp;(cadr&nbsp;exp))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(body&nbsp;(caddr&nbsp;exp)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(null?&nbsp;(cdr&nbsp;pairs))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">let&nbsp;pairs&nbsp;body)</span><span style="color: #800000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">let&nbsp;(list&nbsp;(car&nbsp;pairs))&nbsp;(let*-&gt;nested-lets&nbsp;(list&nbsp;</span><span style="color: #800000;">'</span><span style="color: #000000;">let</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;(cdr&nbsp;pairs)&nbsp;body))))))</span></div>
测试一下：<br />
(let* ((x 1) (y (+ x 3))) (+ x y)) =》5<br />
<br />
习题4.1.4，原生的map过程接受的procedure，是以scheme内在数据结构表示的procedure，而在我们的求值器中，procedure的内在数据结构取决于我们，与原生的结构不同，导致原生的map无法接受自制求值器的procedure，如果map也以求值器中的结构定义，那么就没有这个问题。因此，本质上的困难就在于两个求值器对procedure的数据结构表示的不同。<br />
（待补充）<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/205155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-06-01 15:51 <a href="http://www.blogjava.net/killme2008/archive/2008/06/01/205155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Rope来高效处理长字符串</title><link>http://www.blogjava.net/killme2008/archive/2008/05/05/198532.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 05 May 2008 10:41:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/05/05/198532.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/198532.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/05/05/198532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/198532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/198532.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 前段时间看了这篇文章《<a href="http://www.ibm.com/developerworks/cn/java/j-ropes/index.html">Ropes：理论与实践</a>》。这两天为了提高工作中某个系统对外接口的效率，才认真学习了一番。本质上Ropes是将字符串表示为一棵二叉树，特别适用于长字符串的处理，貌似c++ STL库中也有这么个实现。具体实现和原理还是看这篇<a href="http://www.cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol25/issue12/spe986.pdf">paper</a>。《<a href="http://www.ibm.com/developerworks/cn/java/j-ropes/index.html">Ropes：理论与实践</a>》一文中给出的测试数据相当惊人，Ropes比之String和StringBuffer在append,insert,delete等操作上的效率都有一个数量级以上的差距。跑下作者给出的测试程序，其实在测试的字符串不是很长的情况下，这个差距并没有那么大，这也从侧面说明了Rope的应用范围：即只有在大量修改大型字符串的应用程序中才能看到明显的性能提升。那么是否可以用Rope替代StringBuffer做append生成字符串（比如我要的生成xml)。作者也说啦：<br />
&nbsp; &#8220;由于 <code>Rope</code> 的附加性能通常比 <code>StringBuffer</code> 好，这时使用 rope
是否有意义呢？答案还是否。不论何时将输入的数据组合在一起形成格式化输出时，最漂亮最有效的方法是使用模板引擎（例如 StringTemplate
或 FreeMarker）。这种方法不仅能干净地将表示标记与代码分开，而且模板只进行一次编译（通常编译为 JVM
字节码），以后可以重用，从而使它们拥有极佳的性能特征。&#8221;<br />
<br />
&nbsp;&nbsp;&nbsp; 我用Rope for java替代了StringBuffer做XML生成，效率提升在5%-30%左右，xml字符串不是很长，这个提升显然有限，也带来了不必要的复杂度。因此最后还是用Velocity模板引擎来生成XML，测试的结果效率并没有多少改善，但是显然更容易维护和开发了。回到Rope的话题，我用Ruby实现了个版本，Rubyforge上有一个Rope的实现，但是看了源码，与paper所述算法有点差异，因此照着Rope for java也实现了一个<a href="http://code.google.com/p/rope4r/">Rope4r</a>。测试的结果证明在长字符串的累积操作上，Rope4r的append比之String的+=性能可以快上3倍左右，而如果采用String的&lt;&lt;操作，不是immutable的，当然是最快了；比较郁闷的是slice和insert操作都比String的慢上几倍，因为Ruby的String、Array的内建对象都是直接用c写成并做了优化的，我猜测原因在这。<br />
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/198532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-05-05 18:41 <a href="http://www.blogjava.net/killme2008/archive/2008/05/05/198532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>善用表驱动法</title><link>http://www.blogjava.net/killme2008/archive/2008/04/17/193852.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 17 Apr 2008 11:50:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/04/17/193852.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/193852.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/04/17/193852.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/193852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/193852.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 最近碰到个需求，计算游戏得分的规则，类似这样：<br />
<table class="MsoNormalTable" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; background: #dfdfdf none repeat scroll 0%; width: 85.2pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal"><span style="font-family: 宋体; color: red;">游戏人数</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #dfdfdf none repeat scroll 0%; width: 85.2pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal"><span style="font-family: 宋体; color: red;">第一名获得赌注</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #dfdfdf none repeat scroll 0%; width: 85.2pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal"><span style="font-family: 宋体; color: red;">第二名获得赌注</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #dfdfdf none repeat scroll 0%; width: 85.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal"><span style="font-family: 宋体; color: red;">第三名获得赌注</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #dfdfdf none repeat scroll 0%; width: 85.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal"><span style="font-family: 宋体; color: red;">第四名获得赌注</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal"><strong><span style="font-family: 宋体; color: red;">二人</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></strong></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">100%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">0%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #b4b4b4 none repeat scroll 0%; width: 85.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="font-family: 宋体; color: red;">—</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #b4b4b4 none repeat scroll 0%; width: 85.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="font-family: 宋体; color: red;">—</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal"><strong><span style="font-family: 宋体; color: red;">二人</span></strong><span style="font-size: 9pt; font-family: 宋体; color: red;">（出现</span><span style="font-size: 9pt; color: red;" lang="EN-US">2</span><span style="font-size: 9pt; font-family: 宋体; color: red;">个第</span><span style="font-size: 9pt; color: red;" lang="EN-US">1</span><span style="font-size: 9pt; font-family: 宋体; color: red;">名时）</span><strong><span style="color: red;" lang="EN-US"><o:p></o:p></span></strong></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">50%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">50%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #b4b4b4 none repeat scroll 0%; width: 85.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #b4b4b4 none repeat scroll 0%; width: 85.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal"><strong><span style="font-family: 宋体; color: red;">三人</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></strong></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">70%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">30%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">0%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #b4b4b4 none repeat scroll 0%; width: 85.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="font-family: 宋体; color: red;">—</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal"><strong><span style="font-family: 宋体; color: red;">三人</span></strong><span style="font-family: 宋体; color: red;">（</span><span style="font-size: 9pt; font-family: 宋体; color: red;">出现</span><span style="font-size: 9pt; color: red;" lang="EN-US">3</span><span style="font-size: 9pt; font-family: 宋体; color: red;">个第</span><span style="font-size: 9pt; color: red;" lang="EN-US">1</span><span style="font-size: 9pt; font-family: 宋体; color: red;">名时</span><span style="font-family: 宋体; color: red;">）</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">33.3333%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">33.3333%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.25pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">33.3333%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #b4b4b4 none repeat scroll 0%; width: 85.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal"><strong><span style="font-family: 宋体; color: red;">三人</span></strong><span style="font-size: 9pt; color: red;" lang="EN-US">(</span><span style="font-size: 9pt; font-family: 宋体; color: red;">出现</span><span style="font-size: 9pt; color: red;" lang="EN-US">2</span><span style="font-size: 9pt; font-family: 宋体; color: red;">个第</span><span style="font-size: 9pt; color: red;" lang="EN-US">1</span><span style="font-size: 9pt; font-family: 宋体; color: red;">名时</span><span style="font-size: 9pt; color: red;" lang="EN-US">)</span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">50%</span><span style="font-family: 宋体; color: red;">&#215;</span><span style="color: red;" lang="EN-US">2<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 85.2pt;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US">0%<o:p></o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #b4b4b4 none repeat scroll 0%; width: 85.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
            </td>
            <td style="padding: 0cm 5.4pt; background: #b4b4b4 none repeat scroll 0%; width: 85.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top" width="114">
            <p class="MsoNormal" style="text-align: center;" align="center"><span style="color: red;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
......<br />
......<br />
&nbsp;&nbsp;&nbsp; 这些奖励规则没有什么规律，随着人数增多，就越发复杂了，并且业务人员可能随时改变这些规则。<br />
&nbsp;&nbsp;&nbsp; 显然，奖励规则可以采用策略模式，定义策略接口，根据游戏人数定义不同的规则，本质上就是利用动态的多态调用。可以想见，还是少不了复杂的case...when语句，以及繁多的代码。恰好最近读《unix编程艺术》和《代码大全2》，两者都提到一个结论：人类阅读复杂数据结构远比复杂的控制流程容易，或者说数据驱动开发是非常有价值的。《代码大全2》声称这个是表驱动法。因此，这个奖励系数的计算，能否转化成一个查表过程呢？注意到，在游戏中，名次是根据个人的积分在所有玩家中的排位来决定，大概会有这么个排序的玩家积分数组[100,50,3]，这个数组表示3个玩家，第一名100分，第二名50分，第三名才3分。依据规则，第一名的奖励系数就是0.7，第二名就是0.3。我想到类似这样的数组其实都有个形式表示它们的内置结构，比如[100,50,3]数组的&#8220;结构&#8221;是"111"，代表3个位置都有一个人。将"111"作为关键码去查表不就OK了？<br />
&nbsp;&nbsp;&nbsp; 将每个排好序的积分数组解码为这样的关键码，然后去查预先写好的奖励系数表，这个奖励系数表大概类似：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;@@award_rate_hash</span><span style="color: #000000;">=</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">11</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">1</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">20</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.5</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.5</span><span style="color: #000000;">}<br />
&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">3</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">111</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.7</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.3</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">3</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">300</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.33</span><span style="color: #000000;">},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">201</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.5</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">3</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">120</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">1</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0}<br />
&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">4</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">1111</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.65</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.30</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">3</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.05</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">4</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">4000</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.25</span><span style="color: #000000;">},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">3001</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.33</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">4</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">1300</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">1</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">2020</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.5</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">3</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">1201</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.7</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.15</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">4</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">1120</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.7</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.3</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">3</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #800000;">"</span><span style="color: #800000;">2011</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.35</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">3</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.3</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">4</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}</span></div>
&nbsp;&nbsp;&nbsp; 一个三级hash表，首先根据玩家人数查到特定的系数表，比如要查3个玩家、积分数组是[100,50,3]的奖励系数表就是<span style="color: #000000;">&nbsp; @@award_rate_hash</span><span style="color: #000000;">[:"3"]，然后积分数组</span>[100,50,3]<span style="color: #000000;">解码为:"111"，继续查，如此规则的奖励系数表就是</span><span style="color: #000000;">@@award_rate_hash</span><span style="color: #000000;">[:"3"][</span><span style="color: #000000;">:"111"]——也就是</span><span style="color: #000000;"> </span><span style="color: #000000;">{:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.7</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.3</span><span style="color: #000000;">,:</span><span style="color: #800000;">"</span><span style="color: #800000;">3</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0}，那么查积分是100的玩家系数就是</span><span style="color: #000000;">@@award_rate_hash</span><span style="color: #000000;">[:"3"][</span><span style="color: #000000;">:"111"][</span>([100,50,3].index(100)+1<span style="color: #000000;">).to_s.to_sym]，也就是</span><span style="color: #000000;">:</span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">0.7</span><span style="color: #000000;">。</span>[100,50,3].index(100)+1<span style="color: #000000;">就是积分100的玩家在数组中的名次(即1)，也就是:"1"指向的结果0.7</span>。其他玩家的查表过程与此类似，不细说了。<br />
&nbsp;&nbsp;&nbsp; 这样，我们所有的奖励规则就是维护这么一张hash表，这个表看起来复杂，其实完全可以自动生成，让业务人员来提供样例数据，解码样例数据并生成这个表是很简单的事情。积分数组的&#8220;解码&#8221;，我给一个Ruby版本：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">解码数组为字符串关键码</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> decode_array(array)<br />
&nbsp;&nbsp;&nbsp;&nbsp;len</span><span style="color: #000000;">=</span><span style="color: #000000;">array.size<br />
&nbsp;&nbsp;&nbsp;&nbsp;trace_list</span><span style="color: #000000;">=</span><span style="color: #000000;">[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: #000000;">=</span><span style="color: #000000;">[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;len.times&nbsp;do&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">time</span><span style="color: #000000;">|</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[time]</span><span style="color: #000000;">=</span><span style="color: #000000;">0&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace_list[time]</span><span style="color: #000000;">=</span><span style="color: #000000;">false<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;array.each_with_index&nbsp;do&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">item,index</span><span style="color: #000000;">|</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[index]</span><span style="color: #000000;">=</span><span style="color: #000000;">count_times(array,trace_list,index,len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result.join(</span><span style="color: #800000;">''</span><span style="color: #000000;">).to_sym<br />
&nbsp;&nbsp;end<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> count_times(array,trace_list,index,len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;item</span><span style="color: #000000;">=</span><span style="color: #000000;">array[index]<br />
&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: #000000;">=</span><span style="color: #000000;">0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(index..len).each&nbsp;do&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">i</span><span style="color: #000000;">|</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;array[i]</span><span style="color: #000000;">==</span><span style="color: #000000;">item&nbsp;</span><span style="color: #0000ff;">and</span><span style="color: #000000;">&nbsp;!trace_list[i]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: #000000;">+=</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace_list[i]</span><span style="color: #000000;">=</span><span style="color: #000000;">true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;end<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result<br />
&nbsp;&nbsp;end</span></div>
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/193852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-04-17 19:50 <a href="http://www.blogjava.net/killme2008/archive/2008/04/17/193852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于binary search</title><link>http://www.blogjava.net/killme2008/archive/2008/04/02/190285.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 02 Apr 2008 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/04/02/190285.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/190285.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/04/02/190285.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/190285.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/190285.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 编程珠玑Column 4关于binary search的部分相当精彩，<font face="Courier New">1946年就有人发表binary search，但直到1962第一个正确运行的算法才写出来。尽管算法描述看起来简单明了，但是要写的正确却是有许多地方要仔细考虑。作者着重强调的是对程序正确性的分析方法，仔细分析方法的</font><font face="Courier New">pre-condition, invariant,和post-condition。</font>g9老大翻译过Joshua Bloch在google blog上的文章《<a href="http://blog.csdn.net/g9yuayon/archive/2006/06/04/772382.aspx">号外，号外，几乎所有的binary search和mergsort都有错</a>》，原文在<a href="http://feeds.feedburner.com/~r/blogspot/gJZg/~3/144582870/extra-extra-read-all-about-it-nearly.html">这里</a>。今天看了下原文，有更新，对于求中值索引的c/c++方法原文仍然是有错的，本来是这样：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;mid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((unsigned)&nbsp;(low&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;high))&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">。</span></div>
<br />
但是在c99标准中，对于两个signed数值之和，如果溢出结果是未定义的(undefined)，也就是说与编译器实现相关。上面的代码应该修改为：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">mid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)low&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)high))&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span></div>
<br />
我查了下jdk6的java.util.Arrays的源码，joshua bloch说的这个问题已经解决，现在的binary search如下：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Like&nbsp;public&nbsp;version,&nbsp;but&nbsp;without&nbsp;range&nbsp;checks.</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;binarySearch0(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;a,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fromIndex,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;toIndex,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;low&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fromIndex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;high&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;toIndex&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(low&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;high)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;mid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(low&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;high)&nbsp;</span><span style="color: #000000;">&gt;&gt;&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;midVal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a[mid];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(midVal&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;key)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;low&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mid&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(midVal&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;key)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;high&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mid&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;mid;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;key&nbsp;found</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">(low&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;key&nbsp;not&nbsp;found.</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
&nbsp;&nbsp;&nbsp; 如原文所讨论的，采用了&gt;&gt;&gt;操作符替代除以2<img src ="http://www.blogjava.net/killme2008/aggbug/190285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-04-02 10:08 <a href="http://www.blogjava.net/killme2008/archive/2008/04/02/190285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>位图排序</title><link>http://www.blogjava.net/killme2008/archive/2008/01/07/173362.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 07 Jan 2008 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2008/01/07/173362.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/173362.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2008/01/07/173362.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/173362.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/173362.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 《编程珠玑》第一章第一题就相当的精彩，做个笔记。题目如下：<br />
输入:&nbsp;&nbsp; 一个包含n个正整数的文件，每个正整数小于n,n等于10的7次方（一千万）。并且文件内的正整数没有重复和关联数据。<br />
<br />
输出:&nbsp; 输入整数的升序排列<br />
&nbsp;<br />
约束： 限制在1M左右内存，充足的磁盘空间<br />
<br />
&nbsp;&nbsp;&nbsp; 假设整数占32位，1M内存可以存储大概250000个整数，第一个方法就是采用基于磁盘的合并排序算法，第二个办法就是将0-9999999切割成40个区间，分40次扫描（10000000/250000)，每次读入250000个在一个区间的整数，并在内存中使用快速排序。书中提出的第三个解决办法是采用bitmap（或者称为bit vector）来表示所有数据集合（注意到条件，数据没有重复），这样就可以一次性将数据读入内存，减少了扫描次数。算法的伪代码如下：<br />
阶段1：初始化一个空集合<br />
&nbsp;&nbsp;&nbsp;&nbsp; for i=[0,n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bit[i]=0;<br />
阶段2：读入数据i，并设置bit[i]=1<br />
&nbsp;&nbsp;&nbsp; for each i in the input file<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bit[i]=1;<br />
阶段3：输出排序的结果<br />
&nbsp;&nbsp; for i=[0,n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if bit[i]==1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write i on the output file<br />
<br />
这个算法的时间复杂度在O(n)，用c语言写的版本可以在10秒内完成任务！c语言的源码在该书主页上有，这里给一个java的测试版，加上我的理解注释：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;Created&nbsp;by&nbsp;IntelliJ&nbsp;IDEA.<br />
&nbsp;*&nbsp;User: zhuangxd<br />
&nbsp;*&nbsp;Date:&nbsp;2008-1-7<br />
&nbsp;*&nbsp;Time:&nbsp;14:30:44<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BitSortTest&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;BITSPERWORD&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">32</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">整数位数</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;SHIFT&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;MASK&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x1F</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">5位遮蔽 0B11111</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;N&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10000000</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用int数组来模拟位数组，总计(1&nbsp;+&nbsp;N&nbsp;/&nbsp;BITSPERWORD)*BITSPERWORD位，足以容纳N</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;N&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;BITSPERWORD)];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitsort(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]{</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">10000</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">9999</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4567</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">78902</span><span style="color: #000000;">});<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;bitsort(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;array)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;N;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clr(i);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">位数组所有位清0</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;array.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set(array[i]);&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">阶段2</span><br />
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;N;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(test(i))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">置a[i&gt;&gt;SHIFT]的第(i&nbsp;&amp;&nbsp;MASK)位为1，</span><span style="color: #008000;">也就是位数组的第i位为1</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;set(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;SHIFT]&nbsp;</span><span style="color: #000000;">|=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;MASK));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">置a[i&gt;&gt;SHIFT]的第(i&nbsp;&amp;&nbsp;MASK)位为0,也就是位数组的第i位为0</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;clr(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;SHIFT]&nbsp;</span><span style="color: #000000;">&amp;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;MASK));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">测试位数组的第i位是否为1</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;test(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(a[i&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;SHIFT]&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;MASK)))&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;MASK));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/173362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2008-01-07 15:30 <a href="http://www.blogjava.net/killme2008/archive/2008/01/07/173362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单LRU算法实现缓存-update2</title><link>http://www.blogjava.net/killme2008/archive/2007/09/29/149645.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sat, 29 Sep 2007 09:49:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/09/29/149645.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/149645.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/09/29/149645.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/149645.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/149645.html</trackback:ping><description><![CDATA[update1:第二个实现，读操作不必要采用独占锁，缓存显然是读多于写，读的时候一开始用独占锁是考虑到要递增计数和更新时间戳要加锁，不过这两个变量都是采用原子变量，因此也不必采用独占锁，修改为读写锁。<br />
update2:一个错误，老是写错关键字啊，<span style="color: #000000;">LRUCache的</span><span style="color: #000000;">maxCapacity应该声明为volatile，而不是transient。</span><br />
&nbsp;&nbsp;  <br />
&nbsp;&nbsp; 最简单的LRU算法实现，就是利用jdk的LinkedHashMap，覆写其中的removeEldestEntry(Map.Entry)方法即可，如下所示：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.ArrayList;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Collection;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.LinkedHashMap;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.concurrent.locks.Lock;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.concurrent.locks.ReentrantLock;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Map;<br />
<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;类说明：利用LinkedHashMap实现简单的缓存，&nbsp;必须实现removeEldestEntry方法，具体参见JDK文档<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;dennis<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;&lt;K&gt;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;&lt;V&gt;<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LRULinkedHashMap</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;V</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;LinkedHashMap</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;V</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;maxCapacity;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;DEFAULT_LOAD_FACTOR&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0.75f</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;Lock&nbsp;lock&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ReentrantLock();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;LRULinkedHashMap(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;maxCapacity)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(maxCapacity,&nbsp;DEFAULT_LOAD_FACTOR,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.maxCapacity&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;maxCapacity;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;removeEldestEntry(java.util.Map.Entry</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;V</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;eldest)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;size()&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;maxCapacity;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;containsKey(Object&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.containsKey(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;V&nbsp;get(Object&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;V&nbsp;put(K&nbsp;key,&nbsp;V&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.put(key,&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;size()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;clear()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Collection</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;V</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;getAll()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;V</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">(</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.entrySet());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
&nbsp;&nbsp;&nbsp; 如果你去看LinkedHashMap的源码可知，LRU算法是通过双向链表来实现，当某个位置被命中，通过调整链表的指向将该位置调整到头位置，新加入的内容直接放在链表头，如此一来，最近被命中的内容就向链表头移动，需要替换时，链表最后的位置就是最近最少使用的位置。<br />
&nbsp;&nbsp;&nbsp; LRU算法还可以通过计数来实现，缓存存储的位置附带一个计数器，当命中时将计数器加1，替换时就查找计数最小的位置并替换，结合访问时间戳来实现。这种算法比较适合缓存数据量较小的场景，显然，遍历查找计数最小位置的时间复杂度为O(n)。我实现了一个，结合了访问时间戳，当最小计数大于MINI_ACESS时(这个参数的调整对命中率有较大影响），就移除最久没有被访问的项：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;net.rubyeye.codelib.util.concurrency.cache;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.ArrayList;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Collection;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.HashMap;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Iterator;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Map;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Set;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.concurrent.atomic.AtomicInteger;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.concurrent.atomic.AtomicLong;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.concurrent.locks.Lock;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.concurrent.locks.ReadWriteLock;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.concurrent.locks.ReentrantLock;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.concurrent.locks.ReentrantReadWriteLock;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;dennis&nbsp;类说明：当缓存数目不多时，才用缓存计数的传统LRU算法<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;&lt;K&gt;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;&lt;V&gt;<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LRUCache</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;V</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;DEFAULT_CAPACITY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;ValueEntry</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;map;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;ReadWriteLock&nbsp;lock&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ReentrantReadWriteLock();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;Lock&nbsp;readLock&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;lock.readLock();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;Lock&nbsp;writeLock&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;lock.writeLock();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;"> </span><span style="color: #0000ff;">volatile</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;maxCapacity;&nbsp; //保持可见性<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;MINI_ACCESS&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;LRUCache()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">(DEFAULT_CAPACITY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;LRUCache(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;capacity)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(capacity&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(</span><span style="color: #000000;">"</span><span style="color: #000000;">缓存容量不得小于0</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.maxCapacity&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;capacity;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.map&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashMap</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;ValueEntry</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(maxCapacity);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;ContainsKey(K&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.map.containsKey(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;V&nbsp;put(K&nbsp;key,&nbsp;V&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeLock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((map.size()&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;maxCapacity&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">map.containsKey(key))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;System.out.println("开始");</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;ValueEntry</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;entries&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.map.entrySet();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeRencentlyLeastAccess(entries);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueEntry&nbsp;new_value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ValueEntry(value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueEntry&nbsp;old_value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;map.put(key,&nbsp;new_value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(old_value&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_value.count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;old_value.count;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;old_value.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeLock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;移除最近最少访问<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;removeRencentlyLeastAccess(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;ValueEntry</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;entries)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;最小使用次数</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;least&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;访问时间最早</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;earliest&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;K&nbsp;toBeRemovedByCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;K&nbsp;toBeRemovedByTime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;ValueEntry</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;it&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;entries.iterator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(it.hasNext())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map.Entry</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;ValueEntry</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;valueEntry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;least&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;valueEntry.getValue().count.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toBeRemovedByCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;valueEntry.getKey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;earliest&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;valueEntry.getValue().lastAccess.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toBeRemovedByTime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;valueEntry.getKey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(it.hasNext())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map.Entry</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;ValueEntry</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;valueEntry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(valueEntry.getValue().count.get()&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;least)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;least&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;valueEntry.getValue().count.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toBeRemovedByCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;valueEntry.getKey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(valueEntry.getValue().lastAccess.get()&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;earliest)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;earliest&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;valueEntry.getValue().count.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toBeRemovedByTime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;valueEntry.getKey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;System.out.println("remove:"&nbsp;+&nbsp;toBeRemoved);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果最少使用次数大于MINI_ACCESS，那么移除访问时间最早的项(也就是最久没有被访问的项）</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(least&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;MINI_ACCESS)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.remove(toBeRemovedByTime);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.remove(toBeRemovedByCount);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;V&nbsp;get(K&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueEntry&nbsp;valueEntry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;map.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(valueEntry&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;更新访问时间戳</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valueEntry.updateLastAccess();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;更新访问次数</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valueEntry.count.incrementAndGet();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;valueEntry.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;clear()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeLock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeLock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;size()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;map.size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;getCount(K&nbsp;key)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueEntry&nbsp;valueEntry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;map.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(valueEntry&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;valueEntry.count.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Collection</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;V</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;getAll()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLock.lock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;keys&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;map.keySet();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;V</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;tmp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashMap</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;V</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(K&nbsp;key&nbsp;:&nbsp;keys)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.put(key,&nbsp;map.get(key).value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Map.Entry</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">K,&nbsp;V</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">(tmp.entrySet());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readLock.unlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ValueEntry&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;V&nbsp;value;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;AtomicLong&nbsp;count;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;AtomicLong&nbsp;lastAccess;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ValueEntry(V&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;AtomicLong(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastAccess&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;AtomicLong(System.nanoTime());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;updateLastAccess()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.lastAccess.set(System.nanoTime());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--></div>
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/149645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-09-29 17:49 <a href="http://www.blogjava.net/killme2008/archive/2007/09/29/149645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模仿st_table写的StTable类</title><link>http://www.blogjava.net/killme2008/archive/2007/09/18/146234.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 18 Sep 2007 11:28:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/09/18/146234.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/146234.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/09/18/146234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/146234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/146234.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; update1:添加了remove,removeAll()方法以及getSize()方法&nbsp;&nbsp;&nbsp; update2:添加了keySet()方法用于迭代 &nbsp;  &nbsp;&nbsp;&nbsp;update3:经过测试，StTable类在存储Integer类型key时,put的速度比HashMap快了接近3倍，而...&nbsp;&nbsp;<a href='http://www.blogjava.net/killme2008/archive/2007/09/18/146234.html'>阅读全文</a><img src ="http://www.blogjava.net/killme2008/aggbug/146234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-09-18 19:28 <a href="http://www.blogjava.net/killme2008/archive/2007/09/18/146234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>scheme实现huffman编码的完整代码</title><link>http://www.blogjava.net/killme2008/archive/2007/07/23/131788.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 23 Jul 2007 00:56:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/07/23/131788.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/131788.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/07/23/131788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/131788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/131788.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 来自sicp的完整代码，包括书中给出的代码以及习题，实现了huffman树的生成、解码、编码过程，总共67行代码，同样的代码有空用java、ruby改写下，看看会有什么不同。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">leaf&nbsp;symbol&nbsp;weight)<br>&nbsp;&nbsp;(list&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">leaf&nbsp;symbol&nbsp;weight))</span><span style="color: #800000;"><br></span><span style="color: #000000;">(define&nbsp;(leaf?&nbsp;object)<br>&nbsp;&nbsp;(eq?&nbsp;(car&nbsp;object)&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">leaf))</span><span style="color: #800000;"><br></span><span style="color: #000000;">(define&nbsp;(symbol</span><span style="color: #000000;">-</span><span style="color: #000000;">leaf&nbsp;x)&nbsp;(cadr&nbsp;x))<br>(define&nbsp;(weight</span><span style="color: #000000;">-</span><span style="color: #000000;">leaf&nbsp;x)&nbsp;(caddr&nbsp;x))<br>;合并最低权重的两个节点<br>(define&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">code</span><span style="color: #000000;">-</span><span style="color: #000000;">tree&nbsp;left&nbsp;right)<br>&nbsp;&nbsp;(list&nbsp;left&nbsp;right&nbsp;(append&nbsp;(symbols&nbsp;left)&nbsp;(symbols&nbsp;right))&nbsp;(</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(weight&nbsp;left)&nbsp;(weight&nbsp;right))))<br>(define&nbsp;(left</span><span style="color: #000000;">-</span><span style="color: #000000;">branch&nbsp;tree)&nbsp;(car&nbsp;tree))<br>(define&nbsp;(right</span><span style="color: #000000;">-</span><span style="color: #000000;">branch&nbsp;tree)&nbsp;(cadr&nbsp;tree))<br>(define&nbsp;(symbols&nbsp;tree)<br>&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(leaf?&nbsp;tree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;(symbol</span><span style="color: #000000;">-</span><span style="color: #000000;">leaf&nbsp;tree))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(caddr&nbsp;tree)))<br>(define&nbsp;(weight&nbsp;tree)<br>&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(leaf?&nbsp;tree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(weight</span><span style="color: #000000;">-</span><span style="color: #000000;">leaf&nbsp;tree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cadddr&nbsp;tree)))<br>;解码<br>(define&nbsp;(decode&nbsp;bits&nbsp;tree)<br>&nbsp;&nbsp;(define&nbsp;(decode</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;bits&nbsp;current</span><span style="color: #000000;">-</span><span style="color: #000000;">branch)<br>&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(null?&nbsp;bits)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">()</span><span style="color: #800000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((next</span><span style="color: #000000;">-</span><span style="color: #000000;">branch<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(choose</span><span style="color: #000000;">-</span><span style="color: #000000;">branch&nbsp;(car&nbsp;bits)&nbsp;current</span><span style="color: #000000;">-</span><span style="color: #000000;">branch)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(leaf?&nbsp;next</span><span style="color: #000000;">-</span><span style="color: #000000;">branch)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(symbol</span><span style="color: #000000;">-</span><span style="color: #000000;">leaf&nbsp;next</span><span style="color: #000000;">-</span><span style="color: #000000;">branch)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(decode</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(cdr&nbsp;bits)&nbsp;tree))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(decode</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(cdr&nbsp;bits)&nbsp;next</span><span style="color: #000000;">-</span><span style="color: #000000;">branch)))))<br>&nbsp;&nbsp;(decode</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;bits&nbsp;tree))<br>(define&nbsp;(choose</span><span style="color: #000000;">-</span><span style="color: #000000;">branch&nbsp;bit&nbsp;branch)<br>&nbsp;&nbsp;(cond&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bit&nbsp;0)&nbsp;(left</span><span style="color: #000000;">-</span><span style="color: #000000;">branch&nbsp;branch))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bit&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;(right</span><span style="color: #000000;">-</span><span style="color: #000000;">branch&nbsp;branch))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;(display&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">bad&nbsp;bit&nbsp;--CHOOSE-BRANCH</span><span style="color: #800000;">"</span><span style="color: #000000;">))))<br>(define&nbsp;(adjoin</span><span style="color: #000000;">-</span><span style="color: #000000;">set&nbsp;x&nbsp;set)<br>&nbsp;&nbsp;(cond&nbsp;((null?&nbsp;set)&nbsp;(list&nbsp;x))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;(weight&nbsp;x)&nbsp;(weight&nbsp;(car&nbsp;set)))&nbsp;(cons&nbsp;x&nbsp;set))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;(car&nbsp;set)&nbsp;(adjoin</span><span style="color: #000000;">-</span><span style="color: #000000;">set&nbsp;x&nbsp;(cdr&nbsp;set))))))<br>(define&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">leaf</span><span style="color: #000000;">-</span><span style="color: #000000;">set&nbsp;pairs)<br>&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(null?&nbsp;pairs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">()</span><span style="color: #800000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;((pair&nbsp;(car&nbsp;pairs)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(adjoin</span><span style="color: #000000;">-</span><span style="color: #000000;">set&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">leaf&nbsp;(car&nbsp;pair)&nbsp;(cadr&nbsp;pair))&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">leaf</span><span style="color: #000000;">-</span><span style="color: #000000;">set&nbsp;(cdr&nbsp;pairs))))))<br><br>;编码<br>(define&nbsp;(encode&nbsp;message&nbsp;tree)<br>&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(null?&nbsp;message)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">()</span><span style="color: #800000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(append&nbsp;(encode</span><span style="color: #000000;">-</span><span style="color: #000000;">symbol&nbsp;(car&nbsp;message)&nbsp;tree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(encode&nbsp;(cdr&nbsp;message)&nbsp;tree))))<br>(define&nbsp;(encode</span><span style="color: #000000;">-</span><span style="color: #000000;">symbol&nbsp;symbol&nbsp;tree)<br>&nbsp;&nbsp;(define&nbsp;(iter&nbsp;branch)<br>&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(leaf?&nbsp;branch)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">()</span><span style="color: #800000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(memq&nbsp;symbol&nbsp;(symbols&nbsp;(left</span><span style="color: #000000;">-</span><span style="color: #000000;">branch&nbsp;branch)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;0&nbsp;(iter&nbsp;(left</span><span style="color: #000000;">-</span><span style="color: #000000;">branch&nbsp;branch)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cons&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;(iter&nbsp;(right</span><span style="color: #000000;">-</span><span style="color: #000000;">branch&nbsp;branch))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;))<br>&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(memq&nbsp;symbol&nbsp;(symbols&nbsp;tree))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iter&nbsp;tree)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(display&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">bad&nbsp;symbol&nbsp;--&nbsp;UNKNOWN&nbsp;SYMBOL</span><span style="color: #800000;">"</span><span style="color: #000000;">)))<br>;生成hufman树<br>(define&nbsp;(generate</span><span style="color: #000000;">-</span><span style="color: #000000;">huffman</span><span style="color: #000000;">-</span><span style="color: #000000;">tree&nbsp;pairs)<br>&nbsp;&nbsp;(successive</span><span style="color: #000000;">-</span><span style="color: #000000;">merge&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">leaf</span><span style="color: #000000;">-</span><span style="color: #000000;">set&nbsp;pairs)))<br><br>(define&nbsp;(successive</span><span style="color: #000000;">-</span><span style="color: #000000;">merge&nbsp;leaf</span><span style="color: #000000;">-</span><span style="color: #000000;">set)<br>&nbsp;&nbsp;(</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(null?&nbsp;(cdr&nbsp;leaf</span><span style="color: #000000;">-</span><span style="color: #000000;">set))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(car&nbsp;leaf</span><span style="color: #000000;">-</span><span style="color: #000000;">set)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(successive</span><span style="color: #000000;">-</span><span style="color: #000000;">merge&nbsp;(adjoin</span><span style="color: #000000;">-</span><span style="color: #000000;">set&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">code</span><span style="color: #000000;">-</span><span style="color: #000000;">tree&nbsp;(car&nbsp;leaf</span><span style="color: #000000;">-</span><span style="color: #000000;">set)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cadr&nbsp;leaf</span><span style="color: #000000;">-</span><span style="color: #000000;">set))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cddr&nbsp;leaf</span><span style="color: #000000;">-</span><span style="color: #000000;">set)))))</span></div>
<br><br><br><img src ="http://www.blogjava.net/killme2008/aggbug/131788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-07-23 08:56 <a href="http://www.blogjava.net/killme2008/archive/2007/07/23/131788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sicp 2.4节小题尝试解答</title><link>http://www.blogjava.net/killme2008/archive/2007/07/20/131469.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 20 Jul 2007 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/07/20/131469.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/131469.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/07/20/131469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/131469.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/131469.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 这一节那是相当的有趣，抽象数据的多重表示：采用标志(tag）来区分和数据导向（data-directed）技术，稍微提了下消息传递。通过一张二维表格将类型、操作的分派机制介绍的很清楚，静态OO语言正是通过类型来决定消息的分派，而消息传递以列进行划分，每个类型都以过程来表征，也就是所谓的&#8220;智能数据对象&#8221;，两者各有优缺点。当类型增加频繁时，消息传递风格的分派更容易扩展，当操作增加频繁时，反而是显式的类型分派更为容易扩展，这一点如果有OO设计经验应该很容易体会。<br>看看习题：<br><br>习题2.73，将求导程序以数据导向方式进行修改:<br>a）题目已经说了，基于被求导表达式的类型进行分派，加法表达式或者乘法表达式都有标志来区分，而number?和variable?并没有标志进行区分，因此无法加入数据导向分派。<br>b)选择函数不变，将求导过程提取出来，根据表达式类型划分，然后用put过程安装：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(deriv</span><span style="color: #000000;">-</span><span style="color: #000000;">sum&nbsp;</span><span style="color: #0000ff;">exp</span><span style="color: #000000;">&nbsp;var)<br>&nbsp;&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">sum&nbsp;(deriv&nbsp;(addend&nbsp;</span><span style="color: #0000ff;">exp</span><span style="color: #000000;">)&nbsp;var)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(deriv&nbsp;(augend&nbsp;</span><span style="color: #0000ff;">exp</span><span style="color: #000000;">)&nbsp;var)))<br><br>(define&nbsp;(deriv</span><span style="color: #000000;">-</span><span style="color: #000000;">prod&nbsp;</span><span style="color: #0000ff;">exp</span><span style="color: #000000;">&nbsp;var)<br>&nbsp;&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">sum<br>&nbsp;&nbsp;&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">product&nbsp;(multiplier&nbsp;</span><span style="color: #0000ff;">exp</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(deriv&nbsp;(multiplicand&nbsp;</span><span style="color: #0000ff;">exp</span><span style="color: #000000;">)&nbsp;var))<br>&nbsp;&nbsp;&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">product&nbsp;(deriv&nbsp;(multiplier&nbsp;</span><span style="color: #0000ff;">exp</span><span style="color: #000000;">)&nbsp;var)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(multiplicand&nbsp;</span><span style="color: #0000ff;">exp</span><span style="color: #000000;">))))<br><br>(define&nbsp;(install</span><span style="color: #000000;">-</span><span style="color: #000000;">deriv</span><span style="color: #000000;">-</span><span style="color: #0000ff;">package</span><span style="color: #000000;">)<br>&nbsp;&nbsp;(put&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">deriv&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;deriv</span><span style="color: #000000;">-</span><span style="color: #000000;">sum)<br>&nbsp;&nbsp;(put&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">deriv&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;deriv</span><span style="color: #000000;">-</span><span style="color: #000000;">prod)<br>&nbsp;&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">done)</span></div>
<br>c)我没做，不过和b差不了多少<br><br>习题2.75，很简单，跟着书上来：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">(define&nbsp;(make</span><span style="color: #000000;">-</span><span style="color: #000000;">from</span><span style="color: #000000;">-</span><span style="color: #000000;">mag</span><span style="color: #000000;">-</span><span style="color: #000000;">ang&nbsp;r&nbsp;a)<br>&nbsp;&nbsp;(define&nbsp;(dispatch&nbsp;op)<br>&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;((eq</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;op&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">real-part)&nbsp;(*&nbsp;r&nbsp;(cos&nbsp;a)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((eq?&nbsp;op&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">imag</span><span style="color: #000000;">-</span><span style="color: #000000;">part)&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;r&nbsp;(</span><span style="color: #0000ff;">sin</span><span style="color: #000000;">&nbsp;a)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((eq</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;op&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">magnitude)&nbsp;r)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((eq?&nbsp;op&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">angle)&nbsp;a)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Unknow&nbsp;op</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">)))<br>&nbsp;&nbsp;dispatch)</span></div>
将极角坐标系表示的复数用dispatch过程来表示，这正是消息传递风格。<br><br>习题2.76,在本文开头已经提了。<br><img src ="http://www.blogjava.net/killme2008/aggbug/131469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-07-20 14:32 <a href="http://www.blogjava.net/killme2008/archive/2007/07/20/131469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#实现二叉查找树</title><link>http://www.blogjava.net/killme2008/archive/2007/04/02/108018.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 02 Apr 2007 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/04/02/108018.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/108018.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/04/02/108018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/108018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/108018.html</trackback:ping><description><![CDATA[<p>二叉查找树（binary search tree)</p>
<p>1）概念：对于树中的每个节点n，其左子节点中保存的所有数值都小于n保存的数值，右子节点保存的数值都大于n保存的数值。</p>
<p>2）二叉查找树可以实现更为优越的查找性能，主要实现方式有数组和链表结构，相比较而言，链表实现更为容易，因为数组实现删除和添加功能需要移动数组元素（如填补删除空位等）</p>
<br>今天下午在打印问题搞定后用C#实现了一下，比java版本比较有趣的使用C#的delegate来代替遍历二叉树时的visit方法，这样一来可以在遍历时对节点进行你所想要的任何操作。我们知道C#的delegate是类型化的函数指针，而C++的函数指针可以模仿动态语言的闭包或者匿名函数。这里也有这样的味道。<br><br>代码如下，只实现了整数型的，节点定义：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BSTIntNode<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntNode&nbsp;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntNode&nbsp;right;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntNode(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;value,&nbsp;BSTIntNode&nbsp;left,&nbsp;BSTIntNode&nbsp;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntNode(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>然后定义一个Delegate，作为遍历时的访问方法：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">delegate</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Visit(BSTIntNode&nbsp;node);</span></div>
<br>然后就是二叉树的实现，删除算法只实现了复制删除法：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BSTIntTree<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;BSTIntNode&nbsp;root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Visit&nbsp;visit;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntTree()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;BSTIntNode&nbsp;Search(BSTIntNode&nbsp;node,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(node&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(el&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;node.value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(el&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;node.value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查找</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntNode&nbsp;Search(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Search(root,&nbsp;el);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">广度优先遍历,利用队列实现,至上而下，至左而右</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;BreadthFirst()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntNode&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue&nbsp;queue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ListQueue();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.Enqueue(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">queue.IsEmpty())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(BSTIntNode)queue.Dequeue();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p.left&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.Enqueue(p.left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p.right&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.Enqueue(p.right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">深度优先遍历，递归实现线序，中序和后序<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">先序</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;PreOrder(BSTIntNode&nbsp;p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreOrder(p.left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreOrder(p.right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;PreOrder()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreOrder(root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">中序</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;InOrder(BSTIntNode&nbsp;p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InOrder(p.left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InOrder(p.right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;InOrder()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InOrder(root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">后序</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;PostOrder(BSTIntNode&nbsp;p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostOrder(p.left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostOrder(p.right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;PostOrder()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostOrder(root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">插入节点操作</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Insert(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntNode&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;root,&nbsp;prev&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查找节点位置</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p.value&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(root&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">空树</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BSTIntNode(el);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(prev.value&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;el)&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">大于节点，插入右子树</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev.right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BSTIntNode(el);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev.left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BSTIntNode(el);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">复制删除法的实现，归并删除法可能改变树的高度</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Delete(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntNode&nbsp;node,&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;root,&nbsp;prev&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查找节点位置</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">p.value</span><span style="color: #000000;">!=</span><span style="color: #000000;">el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p.value&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;p.value&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(node.right&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(node.left&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntNode&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntNode&nbsp;previous&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(temp.right&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查找左字节数的最右子节点</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previous&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp.right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp.value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(previous&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previous.left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previous.right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;root)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(prev.left&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev.left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev.right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(root&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">没有找到节点：{0}</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;el);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">树为空！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>注意，在树中我们维持了一个Visit的delegate，看看使用方法：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;args)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntTree&nbsp;tree</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BSTIntTree();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;[]num</span><span style="color: #000000;">=</span><span style="color: #000000;">{</span><span style="color: #000000;">10</span><span style="color: #000000;">,</span><span style="color: #000000;">20</span><span style="color: #000000;">,</span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;">12</span><span style="color: #000000;">,</span><span style="color: #000000;">23</span><span style="color: #000000;">,</span><span style="color: #000000;">15</span><span style="color: #000000;">,</span><span style="color: #000000;">8</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;num.Length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.Insert(num[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">添加遍历处理函数，可以有多个&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.visit&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Visit(printNode);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">广度优先遍历</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.BreadthFirst();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">先序</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.PreOrder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">中序</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.InOrder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">后序</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.PostOrder();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.Delete(</span><span style="color: #000000;">8</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.Delete(</span><span style="color: #000000;">15</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">删除后广度优先遍历</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.BreadthFirst();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;printNode(BSTIntNode&nbsp;node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">访问节点:{0}</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;node.value);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>
<p>可以看到，C#的delegate机制非常有趣，如果在java中恐怕需要用inner class来实现了。<br></p>
<p><br></p><img src ="http://www.blogjava.net/killme2008/aggbug/108018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-04-02 17:29 <a href="http://www.blogjava.net/killme2008/archive/2007/04/02/108018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#实现栈和队列</title><link>http://www.blogjava.net/killme2008/archive/2007/03/30/107409.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 30 Mar 2007 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/03/30/107409.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/107409.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/03/30/107409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/107409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/107409.html</trackback:ping><description><![CDATA[有了前一篇<a href="/killme2008/archive/2007/03/29/107261.html">C#链表的实现</a>，实现栈和队列易如反掌。<br /><br />栈，利用单向链表实现：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> AbstractStack<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> Object Pop();<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Push(Object obj);<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">bool</span><span style="color: rgb(0, 0, 0);"> IsEmpty();<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> Object Top();<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Clear();<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Stack : AbstractStack<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> SList list;<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Stack()<br />        {<br />            list </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> SList();<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">bool</span><span style="color: rgb(0, 0, 0);"> IsEmpty()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.IsEmpty();<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Push(Object obj)<br />        {<br />            list.Push(obj);<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> Pop()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.Pop();<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> Top()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.getTail();<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Clear()<br />        {<br />            list.Clear(); <br />        }<br />    }</span></div><br />队列的实现，通过双向链表实现，对于环形数组的实现请参考《<a href="/killme2008/archive/2007/02/20/100239.html">数组结构之栈与链表</a>》：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> Queue<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">bool</span><span style="color: rgb(0, 0, 0);"> IsEmpty();<br />        </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Enqueue(Object obj);<br />        Object Dequeue();<br />        Object First();<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> ListQueue:Queue<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> LinkedList list;<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> ListQueue()<br />        {<br />            list </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> LinkedList();<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">bool</span><span style="color: rgb(0, 0, 0);"> IsEmpty()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.IsEmpty();<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Enqueue(Object obj)<br />        {<br />            list.Push(obj);<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Object Dequeue()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.Shift();<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Object First()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.getHead();<br />        }<br />    }<br /></span></div><br /><img src ="http://www.blogjava.net/killme2008/aggbug/107409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-03-30 09:44 <a href="http://www.blogjava.net/killme2008/archive/2007/03/30/107409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#实现链表</title><link>http://www.blogjava.net/killme2008/archive/2007/03/29/107261.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 29 Mar 2007 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/03/29/107261.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/107261.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/03/29/107261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/107261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/107261.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C#实现单向和双向链表。&nbsp;&nbsp;<a href='http://www.blogjava.net/killme2008/archive/2007/03/29/107261.html'>阅读全文</a><img src ="http://www.blogjava.net/killme2008/aggbug/107261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-03-29 17:02 <a href="http://www.blogjava.net/killme2008/archive/2007/03/29/107261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据结构之堆 </title><link>http://www.blogjava.net/killme2008/archive/2007/02/20/100243.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 20 Feb 2007 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/20/100243.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/100243.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/20/100243.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/100243.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/100243.html</trackback:ping><description><![CDATA[1。概念：堆是一种特殊的二叉树，具备以下两种性质<br />1）每个节点的值都大于（或者都小于，称为最小堆）其子节点的值<br />2）树是完全平衡的，并且最后一层的树叶都在最左边<br />这样就定义了一个最大堆。<br /><br />2。堆可以用一个数组表示，有如下性质：<br />heap[i]&gt;=heap[2*i+1]  其中0&lt;=i&lt;=(n-1)/2<br />heap[i]&gt;=heap[2*i+2]  其中0&lt;=i&lt;=(n-2)/2<br /><br />3。用数组实现堆，<br />1）插入操作<br />自顶向下，伪代码：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">  heapEnqueue(el)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      将el放在堆尾<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> el不在根节点并且el</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">parent(el)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          交换el及其父节点<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />自底向上，伪代码：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> FloydAlgrithm(data[])<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">最后一个非叶节点的下标,i</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      调用moveDown(data,i,n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)恢复以data[i]为根的树的堆性质<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>  <br />2)moveDown的方法实现，此方法是堆排序的关键，也是删除操作的关键。删除操作，将根节点删除，并把最末的树叶换到根节点，通过moveDown方法找到正确的位置，恢复堆性质。<br /><br />4。堆的一个实现：<br /><pre><pre>// heap.java<br />// demonstrates heaps<br />// to run this program: C&gt;java HeapApp<br />import java.io.*;<br />////////////////////////////////////////////////////////////////<br />class Node<br />   {<br />   private int iData;             // data item (key)<br />// -------------------------------------------------------------<br />   public Node(int key)           // constructor<br />      { iData = key; }<br />// -------------------------------------------------------------<br />   public int getKey()<br />      { return iData; }<br />// -------------------------------------------------------------<br />   public void setKey(int id)<br />      { iData = id; }<br />// -------------------------------------------------------------<br />   }  // end class Node<br />////////////////////////////////////////////////////////////////<br />class Heap<br />   {<br />   private Node[] heapArray;<br />   private int maxSize;           // size of array<br />   private int currentSize;       // number of nodes in array<br />// -------------------------------------------------------------<br />   public Heap(int mx)            // constructor<br />      {<br />      maxSize = mx;<br />      currentSize = 0;<br />      heapArray = new Node[maxSize];  // create array<br />      }<br />// -------------------------------------------------------------<br />   public boolean isEmpty()<br />      { return currentSize==0; }<br />// -------------------------------------------------------------<br />   public boolean insert(int key)<br />      {<br />      if(currentSize==maxSize)<br />         return false;<br />      Node newNode = new Node(key);<br />      heapArray[currentSize] = newNode;<br />      trickleUp(currentSize++);<br />      return true;<br />      }  // end insert()<br />// -------------------------------------------------------------<br />   public void trickleUp(int index)<br />      {<br />      int parent = (index-1) / 2;<br />      Node bottom = heapArray[index];<br /><br />      while( index &gt; 0 &amp;&amp;<br />             heapArray[parent].getKey() &lt; bottom.getKey() )<br />         {<br />         heapArray[index] = heapArray[parent];  // move it down<br />         index = parent;<br />         parent = (parent-1) / 2;<br />         }  // end while<br />      heapArray[index] = bottom;<br />      }  // end trickleUp()<br />// -------------------------------------------------------------<br />   public Node remove()           // delete item with max key<br />      {                           // (assumes non-empty list)<br />      Node root = heapArray[0];<br />      heapArray[0] = heapArray[--currentSize];<br />      trickleDown(0);<br />      return root;<br />      }  // end remove()<br />// -------------------------------------------------------------<br />   public void trickleDown(int index)<br />      {<br />      int largerChild;<br />      Node top = heapArray[index];       // save root<br />      while(index &lt; currentSize/2)       // while node has at<br />         {                               //    least one child,<br />         int leftChild = 2*index+1;<br />         int rightChild = leftChild+1;<br />                                         // find larger child<br />         if(rightChild &lt; currentSize &amp;&amp;  // (rightChild exists?)<br />                             heapArray[leftChild].getKey() &lt;<br />                             heapArray[rightChild].getKey())<br />            largerChild = rightChild;<br />         else<br />            largerChild = leftChild;<br />                                         // top &gt;= largerChild?<br />         if( top.getKey() &gt;= heapArray[largerChild].getKey() )<br />            break;<br />                                         // shift child up<br />         heapArray[index] = heapArray[largerChild];<br />         index = largerChild;            // go down<br />         }  // end while<br />      heapArray[index] = top;            // root to index<br />      }  // end trickleDown()<br />// -------------------------------------------------------------<br />   public boolean change(int index, int newValue)<br />      {<br />      if(index&lt;0 || index&gt;=currentSize)<br />         return false;<br />      int oldValue = heapArray[index].getKey(); // remember old<br />      heapArray[index].setKey(newValue);  // change to new<br /><br />      if(oldValue &lt; newValue)             // if raised,<br />         trickleUp(index);                // trickle it up<br />      else                                // if lowered,<br />         trickleDown(index);              // trickle it down<br />      return true;<br />      }  // end change()<br />// -------------------------------------------------------------<br />   public void displayHeap()<br />      {<br />      System.out.print("heapArray: ");    // array format<br />      for(int m=0; m&lt;currentSize; m++)<br />         if(heapArray[m] != null)<br />            System.out.print( heapArray[m].getKey() + " ");<br />         else<br />            System.out.print( "-- ");<br />      System.out.println();<br />                                          // heap format<br />      int nBlanks = 32;<br />      int itemsPerRow = 1;<br />      int column = 0;<br />      int j = 0;                          // current item<br />      String dots = "...............................";<br />      System.out.println(dots+dots);      // dotted top line<br /><br />      while(currentSize &gt; 0)              // for each heap item<br />         {<br />         if(column == 0)                  // first item in row?<br />            for(int k=0; k&lt;nBlanks; k++)  // preceding blanks<br />               System.out.print(' ');<br />                                          // display item<br />         System.out.print(heapArray[j].getKey());<br /><br />         if(++j == currentSize)           // done?<br />            break;<br /><br />         if(++column==itemsPerRow)        // end of row?<br />            {<br />            nBlanks /= 2;                 // half the blanks<br />            itemsPerRow *= 2;             // twice the items<br />            column = 0;                   // start over on<br />            System.out.println();         //    new row<br />            }<br />         else                             // next item on row<br />            for(int k=0; k&lt;nBlanks*2-2; k++)<br />               System.out.print(' ');     // interim blanks<br />         }  // end for<br />      System.out.println("/n"+dots+dots); // dotted bottom line<br />      }  // end displayHeap()<br />// -------------------------------------------------------------<br />   }  // end class Heap<br />////////////////////////////////////////////////////////////////<br />class HeapApp<br />   {<br />   public static void main(String[] args) throws IOException<br />      {<br />      int value, value2;<br />      Heap theHeap = new Heap(31);  // make a Heap; max size 31<br />      boolean success;<br /><br />      theHeap.insert(70);           // insert 10 items<br />      theHeap.insert(40);<br />      theHeap.insert(50);<br />      theHeap.insert(20);<br />      theHeap.insert(60);<br />      theHeap.insert(100);<br />      theHeap.insert(80);<br />      theHeap.insert(30);<br />      theHeap.insert(10);<br />      theHeap.insert(90);<br /><br />      while(true)                   // until [Ctrl]-[C]<br />         {<br />         System.out.print("Enter first letter of ");<br />         System.out.print("show, insert, remove, change: ");<br />         int choice = getChar();<br />         switch(choice)<br />            {<br />            case 's':                        // show<br />               theHeap.displayHeap();<br />               break;<br />            case 'i':                        // insert<br />               System.out.print("Enter value to insert: ");<br />               value = getInt();<br />               success = theHeap.insert(value);<br />               if( !success )<br />                  System.out.println("Can't insert; heap full");<br />               break;<br />            case 'r':                        // remove<br />               if( !theHeap.isEmpty() )<br />                  theHeap.remove();<br />               else<br />                  System.out.println("Can't remove; heap empty");<br />               break;<br />            case 'c':                        // change<br />               System.out.print("Enter current index of item: ");<br />               value = getInt();<br />               System.out.print("Enter new key: ");<br />               value2 = getInt();<br />               success = theHeap.change(value, value2);<br />               if( !success )<br />                  System.out.println("Invalid index");<br />               break;<br />            default:<br />               System.out.println("Invalid entry/n");<br />            }  // end switch<br />         }  // end while<br />      }  // end main()<br />//-------------------------------------------------------------<br />   public static String getString() throws IOException<br />      {<br />      InputStreamReader isr = new InputStreamReader(System.in);<br />      BufferedReader br = new BufferedReader(isr);<br />      String s = br.readLine();<br />      return s;<br />      }<br />//-------------------------------------------------------------<br />   public static char getChar() throws IOException<br />      {<br />      String s = getString();<br />      return s.charAt(0);<br />      }<br />//-------------------------------------------------------------<br />   public static int getInt() throws IOException<br />      {<br />      String s = getString();<br />      return Integer.parseInt(s);<br />      }<br />//-------------------------------------------------------------<br />  }  // end class HeapApp<br />////////////////////////////////////////////////////////////////</pre></pre><img src ="http://www.blogjava.net/killme2008/aggbug/100243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-20 12:59 <a href="http://www.blogjava.net/killme2008/archive/2007/02/20/100243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据结构之AVL树 </title><link>http://www.blogjava.net/killme2008/archive/2007/02/20/100242.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 20 Feb 2007 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/20/100242.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/100242.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/20/100242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/100242.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/100242.html</trackback:ping><description><![CDATA[树的平衡，我们已经知道DWL算法，不过DWL算法需要从整体上平衡树，但是树的平衡也可以局部的进行，由Adel'son-Vel'skii-Landis提出了一种经典方法，称为AVL树。<br /><br />1。概念：AVL树，或者说可适应树，是指树中每个节点的的平衡因子的绝对值不大于1，即只能为-1，0，1<br />平衡因子：节点的右子树的高度减去左子树的高度<br /><br />2。AVL树的插入：从新插入节点到根的路径上，修改遇到的节点的平衡因子即可，对其他部分没影响<br />1）向右子女的右子树插入一个节点，单旋转就可以<br />2）向右子女的左子树插入一个节点，双旋转，先围绕父节点，再围绕祖父节点<br /><br />3。AVL树的删除：从删除节点到根的路径上，任何不平衡因子的节点都需要修改，与插入不同，需要O(lgn)次旋转。<br /><br />4。一个java实现：<br />http://www.koders.com/java/fid3B5247D34968077A6EFD4216589026D343559FF9.aspx?s=avl%2Btree<img src ="http://www.blogjava.net/killme2008/aggbug/100242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-20 12:57 <a href="http://www.blogjava.net/killme2008/archive/2007/02/20/100242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 数据结构之递归 </title><link>http://www.blogjava.net/killme2008/archive/2007/02/20/100241.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 20 Feb 2007 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/20/100241.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/100241.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/20/100241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/100241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/100241.html</trackback:ping><description><![CDATA[1。递归的定义：<br />递归的定义由两部分组成：<br />1）称作定位点（anchor）或者基本情况（ground case），它们是一些基本元素，这些基本元素是集合序列中其他所有对象的基础。<br />2）给出除基本元素或者已创建对象之外的新对象的构造规则，可以再三使用这个规则不断产生新的对象。<br /><br />2。递归的实现：一般是由操作系统完成的，但是大部分的计算机系统的递归定义都是利用运行时堆栈实现的。在系统内，无论何时调用一个方法都会创建一个活动记录。一个递归调用并不仅仅是一个方法调用其自身，而是方法的一个instance调用相同方法的另一个instance，在计算机内部，这些调用是用不同的活动记录表示，并由系统区分。<br /><br />3。尾递归：<br />仅在方法的末尾实行一次递归调用，这样的递归叫尾递归。尾递归很容易被循环所替换，或者说它只是一个名字比较好听的循环，如：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_16_77_Open_Image" onclick="this.style.display='none'; Codehighlighter1_16_77_Open_Text.style.display='none'; Codehighlighter1_16_77_Closed_Image.style.display='inline'; Codehighlighter1_16_77_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_16_77_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_16_77_Closed_Text.style.display='none'; Codehighlighter1_16_77_Open_Image.style.display='inline'; Codehighlighter1_16_77_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> tail(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i)</span><span id="Codehighlighter1_16_77_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_16_77_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_27_75_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_75_Open_Text.style.display='none'; Codehighlighter1_27_75_Closed_Image.style.display='inline'; Codehighlighter1_27_75_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_27_75_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_75_Closed_Text.style.display='none'; Codehighlighter1_27_75_Open_Image.style.display='inline'; Codehighlighter1_27_75_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_27_75_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_27_75_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    System.out.print(i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    tail(i</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />替换为循环：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_17_66_Open_Image" onclick="this.style.display='none'; Codehighlighter1_17_66_Open_Text.style.display='none'; Codehighlighter1_17_66_Closed_Image.style.display='inline'; Codehighlighter1_17_66_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_17_66_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_17_66_Closed_Text.style.display='none'; Codehighlighter1_17_66_Open_Image.style.display='inline'; Codehighlighter1_17_66_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> tail2(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i)</span><span id="Codehighlighter1_17_66_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_17_66_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;i</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     System.out.print(i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br /><br />尾递归对一些没有显式循环结构的语言（如Prolog）特别重要<br /><br />4。非尾递归：<br />递归相比于迭代结构的优点就是非常清晰并易于理解，这一点可以在二叉树遍历上得到体现。3种遍历方式的递归版本与迭代版本在可读性上不可同日而语。<br />问题：逆序输出一行输入（以ruby语言为例）<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">def </span><span style="COLOR: #0000ff">reverse</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  s</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">STDIN</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">getc</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> s</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">chr</span><span style="COLOR: #000000">!=</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">/n</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">reverse</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000"> s</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">chr</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">reverse</span><span style="COLOR: #000000"> </span></div><br /><br />运行此程序，输入一行字符，将逆序输出，本质上是利用运行时堆栈完成的递归调用<br /><br />5。间接递归：<br />方法通过一连串的调用，然后间接地调用它自身，这样的递归称为间接递归。<br />6。嵌套递归<br />一般出现在函数的定义中，如果这个函数不仅用它自身定义，而且还江它自身作为一个参数，如：<br />     0            n=0<br />h(n)=n         n&gt;4<br />h(2+h(2n))   n&lt;=4<br /><br />7。过分递归：递归带来的逻辑简单性和可读性的代价是拖长了运行时间并且相对于非递归方法，它占用了更多的运行时堆栈空间。如果递归层次太深，可能导致运行时堆栈溢出，程序非正常结束的错误。<br /><br />8。回溯（backtracking技术）：在某点有多条道路供选择的时候，但不清楚哪一条能解决问题。在尝试一条道路失败后，返回岔口再试另一条道路。但是必须确定所有的道路都是可尝试的，可返回的。这种技术成为回溯。<br />在迷宫问题中和8皇后问题中使用此技术。具体程序不再列出（好长@_@）<br /><img src ="http://www.blogjava.net/killme2008/aggbug/100241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-20 12:56 <a href="http://www.blogjava.net/killme2008/archive/2007/02/20/100241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>算法之简单排序 </title><link>http://www.blogjava.net/killme2008/archive/2007/02/20/100240.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 20 Feb 2007 04:54:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/20/100240.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/100240.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/20/100240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/100240.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/100240.html</trackback:ping><description><![CDATA[一。直接插入排序<br />1。直接插入排序：<font size="4"><span style="FONT-FAMILY: 宋体">直接插入排序是一种简单的排序方法，它的基本思想是将待排序的记录按照其值的大小插入到已排好序的有序表的适当位置，直到全部插入完为止。举个整型的排序例子<br />2。直接插入排序的伪代码：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">insertionsort(data[])<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> to data.length</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />       tmp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data[i];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />       将所有大于tmp的元素data[j]向后移动一位;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />       将tmp放在正确的位置上;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />3.简单例子，以整型为例。<br />A）ruby语言实现：<br />  
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">def insertion_sort(a)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">length</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    tmp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[i]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> j</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      break </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> tmp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">a[j</span><span style="COLOR: #000000">-</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      a[j]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[j</span><span style="COLOR: #000000">-</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      j</span><span style="COLOR: #000000">-=</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    a[j]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tmp<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    i</span><span style="COLOR: #000000">+=</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end       <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">[</span><span style="COLOR: #800000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">3</span><span style="COLOR: #000000">]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />insertion_sort(a)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />a</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">each</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">i </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">to_s</span><span style="COLOR: #000000">+</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000">}<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />B）java语言实现：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.sohu.blog.denns_zane.sort;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_63_509_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_509_Open_Text.style.display='none'; Codehighlighter1_63_509_Closed_Image.style.display='inline'; Codehighlighter1_63_509_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_63_509_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_509_Closed_Text.style.display='none'; Codehighlighter1_63_509_Open_Image.style.display='inline'; Codehighlighter1_63_509_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> InsertSort</span><span id="Codehighlighter1_63_509_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_63_509_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_107_267_Open_Image" onclick="this.style.display='none'; Codehighlighter1_107_267_Open_Text.style.display='none'; Codehighlighter1_107_267_Closed_Image.style.display='inline'; Codehighlighter1_107_267_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_107_267_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_107_267_Closed_Text.style.display='none'; Codehighlighter1_107_267_Open_Image.style.display='inline'; Codehighlighter1_107_267_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String args[])</span><span id="Codehighlighter1_107_267_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_107_267_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_128_141_Open_Image" onclick="this.style.display='none'; Codehighlighter1_128_141_Open_Text.style.display='none'; Codehighlighter1_128_141_Closed_Image.style.display='inline'; Codehighlighter1_128_141_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_128_141_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_128_141_Closed_Text.style.display='none'; Codehighlighter1_128_141_Open_Image.style.display='inline'; Codehighlighter1_128_141_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> []data</span><span style="COLOR: #000000">=</span><span id="Codehighlighter1_128_141_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_128_141_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">56</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">90</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        insertsort(data);<br /><img id="Codehighlighter1_208_261_Open_Image" onclick="this.style.display='none'; Codehighlighter1_208_261_Open_Text.style.display='none'; Codehighlighter1_208_261_Closed_Image.style.display='inline'; Codehighlighter1_208_261_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_208_261_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_208_261_Closed_Text.style.display='none'; Codehighlighter1_208_261_Open_Image.style.display='inline'; Codehighlighter1_208_261_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data.length;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_208_261_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_208_261_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            System.out.print(data[i]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_314_507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_314_507_Open_Text.style.display='none'; Codehighlighter1_314_507_Closed_Image.style.display='inline'; Codehighlighter1_314_507_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_314_507_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_314_507_Closed_Text.style.display='none'; Codehighlighter1_314_507_Open_Image.style.display='inline'; Codehighlighter1_314_507_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> insertsort(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> []data)</span><span id="Codehighlighter1_314_507_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_314_507_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_356_501_Open_Image" onclick="this.style.display='none'; Codehighlighter1_356_501_Open_Text.style.display='none'; Codehighlighter1_356_501_Closed_Image.style.display='inline'; Codehighlighter1_356_501_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_356_501_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_356_501_Closed_Text.style.display='none'; Codehighlighter1_356_501_Open_Image.style.display='inline'; Codehighlighter1_356_501_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,j;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data.length;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_356_501_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_356_501_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> tmp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data[i];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i;j</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">tmp</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data[j</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];j</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />               data[j]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data[j</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            data[j]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tmp;   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />5。算法复杂度：<br />最好情况：进行n-1次比较和2(n-1)次移动，尽管他们其实都是多余的，复杂度O(n)<br />最坏情况：具体计算略，O(n*n)<br />平均情况：O(n*n)，也就是接近最坏情况，在平均情况下，数组大小翻倍，它的排序工作将是原来的4倍。<br /><br />二。选择排序<br />1。算法描述：选择算法试图先查找一个放错位置的元素并将它放到最终位置上，以此来局部化数组元素的交换。选择值最小的元素并将它和第一个位置上的元素交换。在第i步中，查找data[i],...,data[n-1]中的最小元素，并将它和data[i]进行交换。重复此过程，直到所有的元素都放入正确的位置为止。<br /><br />2。伪代码描述：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">selectionsort(data[])<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> to data.length</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        从data[i],<img src="http://www.blogjava.net/images/dot.gif" />,data[n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]中选取最小的元素<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        将它和data[i]交换<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>  <br />3。实现，以整型数组为例：<br />1)ruby语言实现：<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">def selection_sort(a)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  least</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> i in (</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">..</span><span style="COLOR: #000000">(a</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">length</span><span style="COLOR: #000000">-</span><span style="COLOR: #800000">2</span><span style="COLOR: #000000">))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">+</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    least</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">length</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> a[j]</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">a[least]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        least</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">j<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      j</span><span style="COLOR: #000000">+=</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    a[least]</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">a[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[i]</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">a[least] </span><span style="COLOR: #0000ff">unless</span><span style="COLOR: #000000"> least</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">i </span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">交换</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">  end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">[</span><span style="COLOR: #800000">12</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">34</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">23</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">45</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">35</span><span style="COLOR: #000000">]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />selection_sort(a)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />a</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">each</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">to_s</span><span style="COLOR: #000000">+</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000">}<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />代码很好理解，不做解释。<br /><br />2）java语言实现：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sohu</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">blog</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">denns_zane</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">sort</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />public class SelectionSort{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    public static </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[] selection_sort(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> [] data){<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">j</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">least</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">length</span><span style="COLOR: #000000">-</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">){<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">+</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">least</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">length</span><span style="COLOR: #000000">;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (data[j]</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">data[least])<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                    least</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">j;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (least</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">i)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            swap(data</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">least</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">i);  </span><span style="COLOR: #000000">//</span><span style="COLOR: #000000">½»»»data[i]ºÍ×îÐ¡ÔªËØ<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        }    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> data;   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    public static void swap(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[]data</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> least</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i){<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> tmp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data[least];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        data[least]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data[i];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        data[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tmp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    public static void main(String args[]){<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[] t</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{</span><span style="COLOR: #800000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">29</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">12</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">23</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">56</span><span style="COLOR: #000000">};<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        selection_sort(t);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">t){<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">System</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">out</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">+</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        } <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />4.算法效率：<br />任何情况下，都需要进行n*(n-1)/2次比较，也就是O(n*n)的复杂度<br />最好情况：数组已经排序，不需要交换任何元素<br />最坏情况：最大元素在第一个位置而其他元素有序时，需要进行3*(n-1)次交换，即O(n)，也是很好的结果<br /><br />三。冒泡排序<br />1。算法伪代码描述：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">bubblesort(data[])<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> to data.length</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data.length</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> downto i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         如果顺序错误，就交换j和j</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1位置上的元素<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />2。实现：<br />1)ruby语言实现：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">def bubble_sort(data)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> i in (</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">..</span><span style="COLOR: #000000">(data</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">length</span><span style="COLOR: #000000">-</span><span style="COLOR: #800000">2</span><span style="COLOR: #000000">))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">length</span><span style="COLOR: #000000">-</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> j</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">i<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> data[j]</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data[j</span><span style="COLOR: #000000">-</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />           data[j]</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">data[j</span><span style="COLOR: #000000">-</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data[j</span><span style="COLOR: #000000">-</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">data[j]   </span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">交换</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">        end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        j</span><span style="COLOR: #000000">-=</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">[</span><span style="COLOR: #800000">12</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">56</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">7</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">89</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">87</span><span style="COLOR: #000000">]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />bubble_sort(a)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />a</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">each</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">to_s</span><span style="COLOR: #000000">+</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000">}<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />2）java语言实现：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.sohu.blog.denns_zane.sort;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_63_604_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_604_Open_Text.style.display='none'; Codehighlighter1_63_604_Closed_Image.style.display='inline'; Codehighlighter1_63_604_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_63_604_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_604_Closed_Text.style.display='none'; Codehighlighter1_63_604_Open_Image.style.display='inline'; Codehighlighter1_63_604_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> BubbleSort</span><span id="Codehighlighter1_63_604_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_63_604_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_112_283_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_283_Open_Text.style.display='none'; Codehighlighter1_112_283_Closed_Image.style.display='inline'; Codehighlighter1_112_283_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_112_283_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_112_283_Closed_Text.style.display='none'; Codehighlighter1_112_283_Open_Image.style.display='inline'; Codehighlighter1_112_283_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> bubble_sort(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> [] data)</span><span id="Codehighlighter1_112_283_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_112_283_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data.length</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data.length</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;j</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">i;j</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />              </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(data[j]</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data[j</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">])<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                swap(data,j,j</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_339_424_Open_Image" onclick="this.style.display='none'; Codehighlighter1_339_424_Open_Text.style.display='none'; Codehighlighter1_339_424_Closed_Image.style.display='inline'; Codehighlighter1_339_424_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_339_424_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_339_424_Closed_Text.style.display='none'; Codehighlighter1_339_424_Open_Image.style.display='inline'; Codehighlighter1_339_424_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> swap(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[]data,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> least,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i)</span><span id="Codehighlighter1_339_424_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_339_424_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> tmp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data[least];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        data[least]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">data[i];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        data[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tmp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_468_602_Open_Image" onclick="this.style.display='none'; Codehighlighter1_468_602_Open_Text.style.display='none'; Codehighlighter1_468_602_Closed_Image.style.display='inline'; Codehighlighter1_468_602_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_468_602_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_468_602_Closed_Text.style.display='none'; Codehighlighter1_468_602_Open_Image.style.display='inline'; Codehighlighter1_468_602_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String args[])</span><span id="Codehighlighter1_468_602_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_468_602_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_486_501_Open_Image" onclick="this.style.display='none'; Codehighlighter1_486_501_Open_Text.style.display='none'; Codehighlighter1_486_501_Closed_Image.style.display='inline'; Codehighlighter1_486_501_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_486_501_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_486_501_Closed_Text.style.display='none'; Codehighlighter1_486_501_Open_Image.style.display='inline'; Codehighlighter1_486_501_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[] t</span><span style="COLOR: #000000">=</span><span id="Codehighlighter1_486_501_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_486_501_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">29</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">23</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">56</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        bubble_sort(t);<br /><img id="Codehighlighter1_548_595_Open_Image" onclick="this.style.display='none'; Codehighlighter1_548_595_Open_Text.style.display='none'; Codehighlighter1_548_595_Closed_Image.style.display='inline'; Codehighlighter1_548_595_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_548_595_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_548_595_Closed_Text.style.display='none'; Codehighlighter1_548_595_Open_Image.style.display='inline'; Codehighlighter1_548_595_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i:t)</span><span id="Codehighlighter1_548_595_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_548_595_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            System.out.print(i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />3。算法效率：<br />冒泡排序的比较次数近似是插入排序的两倍，和选择排序相同；移动次数和插入排序相同，是选择排序的n倍。可以说，插入排序比冒泡排序快两倍。<br /></span></font><img src ="http://www.blogjava.net/killme2008/aggbug/100240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-20 12:54 <a href="http://www.blogjava.net/killme2008/archive/2007/02/20/100240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据结构之栈与队列 </title><link>http://www.blogjava.net/killme2008/archive/2007/02/20/100239.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 20 Feb 2007 04:51:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/20/100239.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/100239.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/20/100239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/100239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/100239.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一。栈1。概念：栈（stack）是一种线性数据结构，只能访问它的一端来存储或者读取数据。栈是一种后进先出的结构（LIFO)2。栈的主要操作：.clear()——清栈.isEmpty()——检查栈是否为空.push(e)——压栈.pop()——出栈.topEl()——返回栈顶元素3。栈的java实现：使用数组链表实现/** *//** *  */package com.sohu.blog.denns...&nbsp;&nbsp;<a href='http://www.blogjava.net/killme2008/archive/2007/02/20/100239.html'>阅读全文</a><img src ="http://www.blogjava.net/killme2008/aggbug/100239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-20 12:51 <a href="http://www.blogjava.net/killme2008/archive/2007/02/20/100239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据结构之二叉树</title><link>http://www.blogjava.net/killme2008/archive/2007/02/20/100238.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 20 Feb 2007 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/20/100238.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/100238.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/20/100238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/100238.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/100238.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 树、二叉树和二叉查找树		1。树的概念：		递归定义：		1） 一个空结构是一个空树		2）如果t1,...,tk是分离的树，那么以t1,...,tk的根为子节点的根结构也是树		3）只有按照1，2规则产生的结构才是树		树的概念更多用于分层结构，比如数据库管理系统的分层模型。		2。二叉树（binary tree）：所有节点都有两个子节点（可以为空），并且每个子节...&nbsp;&nbsp;<a href='http://www.blogjava.net/killme2008/archive/2007/02/20/100238.html'>阅读全文</a><img src ="http://www.blogjava.net/killme2008/aggbug/100238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-20 12:49 <a href="http://www.blogjava.net/killme2008/archive/2007/02/20/100238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据结构之链表</title><link>http://www.blogjava.net/killme2008/archive/2007/02/20/100237.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 20 Feb 2007 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/20/100237.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/100237.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/20/100237.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/100237.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/100237.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 数组的两大缺点：		1。若改变数组的大小就要创建一个新的数组，并需要从原数组复制所有的数据到新的数组		2。数组元素在内存中依次顺序存储，这意味着向数组插入一项要移动数组中的其他元素		因此，我们使用链式结构，链式结构是存储数据的结点以及指向其他节点的指针的集合。如此一来，节点可以位于内存的任意位置，而且从一个节点到另一个节点的传递可以通过在结构中存储节点间引用来实现。		一。单向...&nbsp;&nbsp;<a href='http://www.blogjava.net/killme2008/archive/2007/02/20/100237.html'>阅读全文</a><img src ="http://www.blogjava.net/killme2008/aggbug/100237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-20 12:44 <a href="http://www.blogjava.net/killme2008/archive/2007/02/20/100237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>