﻿<?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-思想比知识更重要 成长比成功更重要-随笔分类-Arithmetic &amp; Data Structure</title><link>http://www.blogjava.net/renyangok/category/17011.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 15 Dec 2007 10:28:01 GMT</lastBuildDate><pubDate>Sat, 15 Dec 2007 10:28:01 GMT</pubDate><ttl>60</ttl><item><title>求两个数或多个数的最大公约数算法及其实现</title><link>http://www.blogjava.net/renyangok/archive/2007/12/15/167956.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Sat, 15 Dec 2007 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/12/15/167956.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/167956.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/12/15/167956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/167956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/167956.html</trackback:ping><description><![CDATA[一，两个数的最大公约数：<br />
<br />
1、欧几里德算法 <br />
<p style="margin: 5px; line-height: 150%;">
<br />
欧几里德算法又称辗转相除法，用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理： <br />
<br />
定理：gcd(a,b) = gcd(b,a mod b) <br />
<br />
证明：a可以表示成a = kb + r，则r = a mod b <br />
假设d是a,b的一个公约数，则有 <br />
d|a, d|b，而r = a - kb，因此d|r <br />
因此d是(b,a mod b)的公约数 <br />
<br />
假设d 是(b,a mod b)的公约数，则 <br />
d | b , d |r ，但是a = kb +r <br />
因此d也是(a,b)的公约数 <br />
<br />
因此(a,b)和(b,a mod b)的公约数是一样的，其最大公约数也必然相等，得证 <br />
<br />
欧几里德算法就是根据这个原理来做的，其算法用C++语言描述为：</p>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><font face="新宋体"><span style="color: #0000ff;">void</span> <span style="color: #ff0000;">swap</span><span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> <span style="color: #0000cc;">&amp;</span> a<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">int</span> <span style="color: #0000cc;">&amp;</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">int</span> c <span style="color: #0000cc;">=</span> a<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a <span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b <span style="color: #0000cc;">=</span> c<span style="color: #0000cc;">;</span> <br />
<span style="color: #0000cc;">}</span> <br />
<br />
<span style="color: #0000ff;">int</span> gcd<span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> a<span style="color: #0000cc;">,</span><span style="color: #0000ff;">int</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>0 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> a <span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> b<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000cc;">}</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span> 0 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> a<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000cc;">}</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>a <span style="color: #0000cc;">&gt;</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000;">swap</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000cc;">}</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">int</span> c<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">for</span><span style="color: #0000cc;">(</span>c <span style="color: #0000cc;">=</span> a <span style="color: #0000cc;">%</span> b <span style="color: #0000cc;">;</span> c <span style="color: #0000cc;">&gt;</span> 0 <span style="color: #0000cc;">;</span> c <span style="color: #0000cc;">=</span> a <span style="color: #0000cc;">%</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a <span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b <span style="color: #0000cc;">=</span> c<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000cc;">}</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> b<span style="color: #0000cc;">;</span> <br />
<span style="color: #0000cc;">}</span></font></span></code></p>
<p style="margin: 5px; line-height: 150%;">
2、Stein算法 <br />
欧几里德算法是计算两个数最大公约数的传统算法，它无论从理论还是从效率上都是很好的。但是有一个致命的缺陷，这个缺陷只有在大素数时才会显现出来。 <br />
<br />
考虑现在的硬件平台，一般整数最多也就是64位，对于这样的整数，计算两个数之间的模是很简单的。对于字长为32位的平台，计算两个不超过32位的整数的
模，只需要一个指令周期，而计算64位以下的整数模，也不过几个周期而已。但是对于更大的素数，这样的计算过程就不得不由用户来设计，为了计算两个超过
64位的整数的模，用户也许不得不采用类似于多位数除法手算过程中的试商法，这个过程不但复杂，而且消耗了很多CPU时间。对于现代密码算法，要求计算
128位以上的素数的情况比比皆是，设计这样的程序迫切希望能够抛弃除法和取模。 <br />
<br />
Stein算法由J. Stein 1961年提出，这个方法也是计算两个数的最大公约数。和欧几里德算法 算法不同的是，Stein算法只有整数的移位和加减法，这对于程序设计者是一个福音。 <br />
<br />
为了说明Stein算法的正确性，首先必须注意到以下结论： <br />
<br />
gcd(a,a) = a，也就是一个数和它自身的公约数是其自身 <br />
gcd(ka,kb) = k gcd(a,b)，也就是最大公约数运算和倍乘运算可以交换，特殊的，当k=2时，说明两个偶数的最大公约数必然能被2整除 <br />
<br />
C++/java 实现 <br />
<code><span style="color: #000000;"><font face="新宋体"></font></span></code></p>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><font face="新宋体"><span style="color: #ff9900;">// c++/java stein 算法 <br />
</span><span style="color: #0000ff;">int</span> gcd<span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> a<span style="color: #0000cc;">,</span><span style="color: #0000ff;">int</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">&lt;</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span></font><font face="新宋体"><span style="color: #ff9900;">//arrange so that a&gt;b <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">int</span> temp <span style="color: #0000cc;">=</span> a<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a <span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b<span style="color: #0000cc;">=</span>temp<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000cc;">}</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>0<span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>b<span style="color: #0000cc;">)</span></font><font face="新宋体"><span style="color: #ff9900;">//the base case <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> a<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">%</span>2<span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>0 <span style="color: #0000cc;">&amp;</span><span style="color: #0000cc;">&amp;</span> b<span style="color: #0000cc;">%</span>2 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>0<span style="color: #0000cc;">)</span></font><font face="新宋体"><span style="color: #ff9900;">//a and b are even <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> 2<span style="color: #0000cc;">*</span>gcd<span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span> a<span style="color: #0000cc;">%</span>2 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> 0<span style="color: #0000cc;">)</span></font><font face="新宋体"><span style="color: #ff9900;">// only a is even <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> gcd<span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span> b<span style="color: #0000cc;">%</span>2<span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>0 <span style="color: #0000cc;">)</span></font><font face="新宋体"><span style="color: #ff9900;">// only b is even <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> gcd<span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> gcd<span style="color: #0000cc;">(</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">+</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">,</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">-</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span></font><font face="新宋体"><span style="color: #ff9900;">// a and b are odd <br />
</span><span style="color: #0000cc;">}</span></font></span></code></p>
二，多个数的最大公约数：(python实现：取出数组a中最小的，从2到最小的循环，找出其中最大的能被数组中所有数整除的那个数，就是最大公约数)<br />
def gcd(a):<br />
&nbsp;&nbsp;&nbsp; a.sort()<br />
&nbsp;&nbsp;&nbsp; min = a[0]<br />
&nbsp;&nbsp;&nbsp; result = 1<br />
&nbsp;&nbsp;&nbsp; for i in range(2, min+1):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag = True<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for j in a:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if j % i != 0:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag = False<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if flag == True:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = i<br />
&nbsp;&nbsp;&nbsp; return result<br />
<img src ="http://www.blogjava.net/renyangok/aggbug/167956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-12-15 15:40 <a href="http://www.blogjava.net/renyangok/archive/2007/12/15/167956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>组合数学－Catalan数</title><link>http://www.blogjava.net/renyangok/archive/2007/11/16/161089.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Fri, 16 Nov 2007 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/11/16/161089.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/161089.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/11/16/161089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/161089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/161089.html</trackback:ping><description><![CDATA[Catalan数：(for http://acm.pku.edu.cn/JudgeOnline/problem?id=2084)<br />
<br />
C_n =
&#931;C_i*C_(n-i)，其中0&#8804;i&lt;n；<br />
C_n = C(2n,n) / (n+1)； 其中C(2n, n) 表示组合数，公式为：C(n, k) = n! / (k!(n-k)!)<br />
C_n=C_(n-1)*(4n-2)/(n+1)。<br />
<br />
它的意义有很多，例如：n+1边形用对角线划分成
三角形的方法数；n个+1和n个-1满足所有部分和不小于零的排列数；具有n个节点的二叉树的数量&#8230;&#8230;<br />
<br />
（详细说明参考：http://hi.baidu.com/kikoqiu/blog/item/81d792015ab13e01738da51d.html）<br />
<img src ="http://www.blogjava.net/renyangok/aggbug/161089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-11-16 18:07 <a href="http://www.blogjava.net/renyangok/archive/2007/11/16/161089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java用字节数截取字符串</title><link>http://www.blogjava.net/renyangok/archive/2007/03/06/102213.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 06 Mar 2007 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/03/06/102213.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/102213.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/03/06/102213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/102213.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/102213.html</trackback:ping><description><![CDATA[
		<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_0_230_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_230_Open_Text.style.display='none'; Codehighlighter1_0_230_Closed_Image.style.display='inline'; Codehighlighter1_0_230_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_0_230_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_230_Closed_Text.style.display='none'; Codehighlighter1_0_230_Open_Image.style.display='inline'; Codehighlighter1_0_230_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span id="Codehighlighter1_0_230_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">/**/</span>
				<span id="Codehighlighter1_0_230_Open_Text">
						<span style="COLOR: #008000">/*</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 题目：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 编写一个截取字符串的函数，输入为一个字符串和字节数，输出为按字节截取的字符串。 但是要保证汉字不被截半个，如“我ABC”4，应该截为“我AB”，输入“我ABC汉DEF”，6，应该输出为“我ABC”而不是“我ABC+汉的半个”。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 解释：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 此处的编码方式应该是操作系统默认的GB编码，即汉字占2个字节且第一个字节的最高位是1，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 如果理解为有符号数的话，就是负数；而英文占1个字节，符合ASC2码。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> SplitString <br /><img id="Codehighlighter1_251_822_Open_Image" onclick="this.style.display='none'; Codehighlighter1_251_822_Open_Text.style.display='none'; Codehighlighter1_251_822_Closed_Image.style.display='inline'; Codehighlighter1_251_822_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_251_822_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_251_822_Closed_Text.style.display='none'; Codehighlighter1_251_822_Open_Image.style.display='inline'; Codehighlighter1_251_822_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_251_822_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_251_822_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> String str;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> byteNum;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_318_319_Open_Image" onclick="this.style.display='none'; Codehighlighter1_318_319_Open_Text.style.display='none'; Codehighlighter1_318_319_Closed_Image.style.display='inline'; Codehighlighter1_318_319_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_318_319_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_318_319_Closed_Text.style.display='none'; Codehighlighter1_318_319_Open_Image.style.display='inline'; Codehighlighter1_318_319_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"> SplitString()</span>
						<span id="Codehighlighter1_318_319_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_318_319_Open_Text">
								<span style="COLOR: #000000">{}</span>
						</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/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> SplitString(String str,</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> byteNum)<br /><img id="Codehighlighter1_367_411_Open_Image" onclick="this.style.display='none'; Codehighlighter1_367_411_Open_Text.style.display='none'; Codehighlighter1_367_411_Closed_Image.style.display='inline'; Codehighlighter1_367_411_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_367_411_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_367_411_Closed_Text.style.display='none'; Codehighlighter1_367_411_Open_Image.style.display='inline'; Codehighlighter1_367_411_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span id="Codehighlighter1_367_411_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_367_411_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.str</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">str;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.byteNum</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">byteNum;<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 src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> splitIt()<br /><img id="Codehighlighter1_439_820_Open_Image" onclick="this.style.display='none'; Codehighlighter1_439_820_Open_Text.style.display='none'; Codehighlighter1_439_820_Closed_Image.style.display='inline'; Codehighlighter1_439_820_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_439_820_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_439_820_Closed_Text.style.display='none'; Codehighlighter1_439_820_Open_Image.style.display='inline'; Codehighlighter1_439_820_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span id="Codehighlighter1_439_820_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_439_820_Open_Text">
								<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/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">byte</span>
								<span style="COLOR: #000000"> bt[]</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">str.getBytes();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Length of this String ===&gt;</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">bt.length);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(byteNum</span>
								<span style="COLOR: #000000">&gt;=</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_551_760_Open_Image" onclick="this.style.display='none'; Codehighlighter1_551_760_Open_Text.style.display='none'; Codehighlighter1_551_760_Closed_Image.style.display='inline'; Codehighlighter1_551_760_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_551_760_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_551_760_Closed_Text.style.display='none'; Codehighlighter1_551_760_Open_Image.style.display='inline'; Codehighlighter1_551_760_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
								<span id="Codehighlighter1_551_760_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_551_760_Open_Text">
										<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">(bt[byteNum]</span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_577_662_Open_Image" onclick="this.style.display='none'; Codehighlighter1_577_662_Open_Text.style.display='none'; Codehighlighter1_577_662_Closed_Image.style.display='inline'; Codehighlighter1_577_662_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_577_662_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_577_662_Closed_Text.style.display='none'; Codehighlighter1_577_662_Open_Image.style.display='inline'; Codehighlighter1_577_662_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span>
										<span id="Codehighlighter1_577_662_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_577_662_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    String substrx</span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #0000ff">new</span>
												<span style="COLOR: #000000"> String(bt,</span>
												<span style="COLOR: #000000">0</span>
												<span style="COLOR: #000000">,</span>
												<span style="COLOR: #000000">--</span>
												<span style="COLOR: #000000">byteNum);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    System.out.println(substrx);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span>
										</span>
										<span style="COLOR: #0000ff">else</span>
										<span style="COLOR: #000000">
												<br />
												<img id="Codehighlighter1_671_756_Open_Image" onclick="this.style.display='none'; Codehighlighter1_671_756_Open_Text.style.display='none'; Codehighlighter1_671_756_Closed_Image.style.display='inline'; Codehighlighter1_671_756_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_671_756_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_671_756_Closed_Text.style.display='none'; Codehighlighter1_671_756_Open_Image.style.display='inline'; Codehighlighter1_671_756_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span>
										<span id="Codehighlighter1_671_756_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_671_756_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    String substrex</span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #0000ff">new</span>
												<span style="COLOR: #000000"> String(bt,</span>
												<span style="COLOR: #000000">0</span>
												<span style="COLOR: #000000">,byteNum);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    System.out.println(substrex);<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: #0000ff">else</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_768_817_Open_Image" onclick="this.style.display='none'; Codehighlighter1_768_817_Open_Text.style.display='none'; Codehighlighter1_768_817_Closed_Image.style.display='inline'; Codehighlighter1_768_817_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_768_817_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_768_817_Closed_Text.style.display='none'; Codehighlighter1_768_817_Open_Image.style.display='inline'; Codehighlighter1_768_817_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
								<span id="Codehighlighter1_768_817_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_768_817_Open_Text">
										<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   System.out.println(</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" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.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"> TestSplitString<br /><img id="Codehighlighter1_854_1009_Open_Image" onclick="this.style.display='none'; Codehighlighter1_854_1009_Open_Text.style.display='none'; Codehighlighter1_854_1009_Closed_Image.style.display='inline'; Codehighlighter1_854_1009_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_854_1009_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_854_1009_Closed_Text.style.display='none'; Codehighlighter1_854_1009_Open_Image.style.display='inline'; Codehighlighter1_854_1009_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_854_1009_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_854_1009_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.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[])<br /><img id="Codehighlighter1_897_1007_Open_Image" onclick="this.style.display='none'; Codehighlighter1_897_1007_Open_Text.style.display='none'; Codehighlighter1_897_1007_Closed_Image.style.display='inline'; Codehighlighter1_897_1007_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_897_1007_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_897_1007_Closed_Text.style.display='none'; Codehighlighter1_897_1007_Open_Image.style.display='inline'; Codehighlighter1_897_1007_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span id="Codehighlighter1_897_1007_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_897_1007_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  String str</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">我ABC汉DEF</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">int</span>
								<span style="COLOR: #000000"> num</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">6</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  SplitString sptstr </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> SplitString(str,num);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  sptstr.splitIt();<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>
<img src ="http://www.blogjava.net/renyangok/aggbug/102213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-03-06 17:17 <a href="http://www.blogjava.net/renyangok/archive/2007/03/06/102213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java两个字符串的最大公共自串</title><link>http://www.blogjava.net/renyangok/archive/2007/03/05/101934.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Mon, 05 Mar 2007 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/03/05/101934.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/101934.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/03/05/101934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/101934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/101934.html</trackback:ping><description><![CDATA[
		<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_0_85_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_85_Open_Text.style.display='none'; Codehighlighter1_0_85_Closed_Image.style.display='inline'; Codehighlighter1_0_85_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_0_85_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_85_Closed_Text.style.display='none'; Codehighlighter1_0_85_Open_Image.style.display='inline'; Codehighlighter1_0_85_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span id="Codehighlighter1_0_85_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">/**/</span>
				<span id="Codehighlighter1_0_85_Open_Text">
						<span style="COLOR: #008000">/*</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> 求两个字符串的最大公共子串<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> String s1 = "abcdefghigj";<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> String s2 = "xyzabcdeigj";<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> 则输出abcde<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.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"> Test<br /><img id="Codehighlighter1_106_627_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_627_Open_Text.style.display='none'; Codehighlighter1_106_627_Closed_Image.style.display='inline'; Codehighlighter1_106_627_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_106_627_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_106_627_Closed_Text.style.display='none'; Codehighlighter1_106_627_Open_Image.style.display='inline'; Codehighlighter1_106_627_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_106_627_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_106_627_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> String search(String s1,String s2)<br /><img id="Codehighlighter1_154_432_Open_Image" onclick="this.style.display='none'; Codehighlighter1_154_432_Open_Text.style.display='none'; Codehighlighter1_154_432_Closed_Image.style.display='inline'; Codehighlighter1_154_432_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_154_432_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_432_Closed_Text.style.display='none'; Codehighlighter1_154_432_Open_Image.style.display='inline'; Codehighlighter1_154_432_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
						<span id="Codehighlighter1_154_432_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_154_432_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  String max </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" />  </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"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">; i </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> s1.length(); i</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_216_412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_412_Open_Text.style.display='none'; Codehighlighter1_216_412_Closed_Image.style.display='inline'; Codehighlighter1_216_412_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_216_412_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_216_412_Closed_Text.style.display='none'; Codehighlighter1_216_412_Open_Image.style.display='inline'; Codehighlighter1_216_412_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
								<span id="Codehighlighter1_216_412_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_216_412_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"> j </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> i</span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">; j </span>
										<span style="COLOR: #000000">&lt;=</span>
										<span style="COLOR: #000000"> s1.length(); j</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_266_408_Open_Image" onclick="this.style.display='none'; Codehighlighter1_266_408_Open_Text.style.display='none'; Codehighlighter1_266_408_Closed_Image.style.display='inline'; Codehighlighter1_266_408_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_266_408_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_266_408_Closed_Text.style.display='none'; Codehighlighter1_266_408_Open_Image.style.display='inline'; Codehighlighter1_266_408_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
										<span id="Codehighlighter1_266_408_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_266_408_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      String sub </span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #000000"> s1.substring(i,j);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
												<span style="COLOR: #0000ff">if</span>
												<span style="COLOR: #000000">((s2.indexOf(sub)</span>
												<span style="COLOR: #000000">!=</span>
												<span style="COLOR: #000000"> </span>
												<span style="COLOR: #000000">-</span>
												<span style="COLOR: #000000">1</span>
												<span style="COLOR: #000000">)</span>
												<span style="COLOR: #000000">&amp;&amp;</span>
												<span style="COLOR: #000000"> sub.length() </span>
												<span style="COLOR: #000000">&gt;</span>
												<span style="COLOR: #000000"> max.length())<br /><img id="Codehighlighter1_375_402_Open_Image" onclick="this.style.display='none'; Codehighlighter1_375_402_Open_Text.style.display='none'; Codehighlighter1_375_402_Closed_Image.style.display='inline'; Codehighlighter1_375_402_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_375_402_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_375_402_Closed_Text.style.display='none'; Codehighlighter1_375_402_Open_Image.style.display='inline'; Codehighlighter1_375_402_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span>
												<span id="Codehighlighter1_375_402_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_375_402_Open_Text">
														<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        max </span>
														<span style="COLOR: #000000">=</span>
														<span style="COLOR: #000000"> sub;<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/ExpandedSubBlockEnd.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000">  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> max;<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/InBlock.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.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)<br /><img id="Codehighlighter1_480_625_Open_Image" onclick="this.style.display='none'; Codehighlighter1_480_625_Open_Text.style.display='none'; Codehighlighter1_480_625_Closed_Image.style.display='inline'; Codehighlighter1_480_625_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_480_625_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_480_625_Closed_Text.style.display='none'; Codehighlighter1_480_625_Open_Image.style.display='inline'; Codehighlighter1_480_625_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
						<span id="Codehighlighter1_480_625_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_480_625_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    String s1 </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">abedafghigj</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    String s2 </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">xyzabfddfigj</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    String output </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> Test().search(s1,s2);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    System.out.println(output);<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>
<img src ="http://www.blogjava.net/renyangok/aggbug/101934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-03-05 15:50 <a href="http://www.blogjava.net/renyangok/archive/2007/03/05/101934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串匹配</title><link>http://www.blogjava.net/renyangok/archive/2007/03/05/101927.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Mon, 05 Mar 2007 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/03/05/101927.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/101927.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/03/05/101927.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/101927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/101927.html</trackback:ping><description><![CDATA[
		<h1>1 术语定义</h1>
		<p>在字符串匹配问题中，我们期待察看串T中是否含有串P。<br />其中串T被称为目标串，串S被称为模式串。</p>
		<h1>2 朴素匹配算法</h1>
		<p>进行字符串匹配，最简单的一个想法是：</p>
		<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_25_607_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_607_Open_Text.style.display='none'; Codehighlighter1_25_607_Closed_Image.style.display='inline'; Codehighlighter1_25_607_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_25_607_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_25_607_Closed_Text.style.display='none'; Codehighlighter1_25_607_Open_Image.style.display='inline'; Codehighlighter1_25_607_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> SimpleMatch </span>
				<span id="Codehighlighter1_25_607_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_25_607_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_81_424_Open_Image" onclick="this.style.display='none'; Codehighlighter1_81_424_Open_Text.style.display='none'; Codehighlighter1_81_424_Closed_Image.style.display='inline'; Codehighlighter1_81_424_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_81_424_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_81_424_Closed_Text.style.display='none'; Codehighlighter1_81_424_Open_Image.style.display='inline'; Codehighlighter1_81_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">int</span>
						<span style="COLOR: #000000"> StringMatch(String target,String patten) </span>
						<span id="Codehighlighter1_81_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_81_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"> tl </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> target.length();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> pl </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> patten.length();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.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"> </span>
								<span style="COLOR: #000000">0</span>
								<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"> j </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">;<br /><img id="Codehighlighter1_216_365_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_365_Open_Text.style.display='none'; Codehighlighter1_216_365_Closed_Image.style.display='inline'; Codehighlighter1_216_365_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_216_365_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_216_365_Closed_Text.style.display='none'; Codehighlighter1_216_365_Open_Image.style.display='inline'; Codehighlighter1_216_365_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.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"> tl </span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000"> pl </span>
								<span style="COLOR: #000000">&amp;&amp;</span>
								<span style="COLOR: #000000"> j </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> pl) </span>
								<span id="Codehighlighter1_216_365_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_216_365_Open_Text">
										<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">(patten.charAt(j) </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> target.charAt(i</span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000">j))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />              j</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">;<br /><img id="Codehighlighter1_305_357_Open_Image" onclick="this.style.display='none'; Codehighlighter1_305_357_Open_Text.style.display='none'; Codehighlighter1_305_357_Closed_Image.style.display='inline'; Codehighlighter1_305_357_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_305_357_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_305_357_Closed_Text.style.display='none'; Codehighlighter1_305_357_Open_Image.style.display='inline'; Codehighlighter1_305_357_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />          </span>
										<span style="COLOR: #0000ff">else</span>
										<span style="COLOR: #000000"> </span>
										<span id="Codehighlighter1_305_357_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_305_357_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />              j </span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #000000"> </span>
												<span style="COLOR: #000000">0</span>
												<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />              i</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/InBlock.gif" align="top" />      </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(j </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> pl)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> i;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </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/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_469_605_Open_Image" onclick="this.style.display='none'; Codehighlighter1_469_605_Open_Text.style.display='none'; Codehighlighter1_469_605_Closed_Image.style.display='inline'; Codehighlighter1_469_605_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_469_605_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_469_605_Closed_Text.style.display='none'; Codehighlighter1_469_605_Open_Image.style.display='inline'; Codehighlighter1_469_605_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_469_605_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_469_605_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      String t </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">123456789</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      String p </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">456</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      SimpleMatch sm </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> SimpleMatch();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      System.out.println(sm.StringMatch(t, p));<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>
		<p>可以看见，这个算法（假定m&gt;&gt;n）的复杂度是O(mn)，其中m是T的长度，n是P的长度。这种算法的缺陷是匹配过程中带有回溯——准确地说是T串存在回溯，也就是当匹配不成功的时候，之前进行的匹配完全变为无用功，所有的比较需要重新开始。</p>
		<h1>3 KMP算法</h1>
		<p>KMP算法是D.E.Knuth、J.H.Morris和V.R.Pratt提出的无回溯的字符串匹配算法，算法的核心思想就是设法在匹配失败的时候，尽量利用之前的匹配结果，消除T串的回溯问题。那么如何消除回溯呢？请看下面的例子：</p>
		<p>假设P=abacd，如果T=abax...，当从头开始匹配到字符c时，若c=x，显然，匹配过程继续；当c≠x时，按照朴素的匹配算法，T串会发生回溯，之后T串会从第2个字符b开始重新匹配，而不是从匹配失败的字符x开始继续。但是显然，对于上述的匹配过程，T串不需要从b开始重新匹配，它只需要从x开始和P的b字符继续匹配即可。如下：<br />匹配过程：<br />P=abacd<br />T=abax....<br />     ^----比较到此处时发生匹配失败<br />朴素匹配算法：<br />P= abacd<br />T=abax...<br />   ^----回溯到b，重新开始和P的匹配<br />KMP算法：<br />P=  abacd<br />T=abax...<br />     ^----T串不回溯，从x处继续匹配</p>
		<p>现在的问题是，按照KMP算法，匹配失败的时候，P串需要重新调整位置，但是调整的依据是什么？Knuth等人发现，P调整位置的依据和P的构造有关，和T无关。具体来说，定义失效函数：f(j)=k，其中0&lt;=k&lt;=j，且k是使得p<sub>0</sub>p<sub>1</sub>...p<sub>k-1</sub> = p<sub>j-k+1</sub>p<sub>j-k+2</sub>...p<sub>j</sub>成立的最大整数。建立失效函数的算法如下：<br />public void Build() {<br /> if(pattern == null)<br />  throw new Exception("KMP Exception : null pattern");<br /> array = new int[pattern.Length];<br /> int i = 0, s = pattern.Length;<br /> if(s &gt; 1)<br />  array[0] = 0;<br /> for(i = 1; i &lt; s; i++) {<br />  if(pattern[i] == pattern[array[i - 1]])<br />   array[i] = array[i - 1] + 1;<br />  else<br />   array[i] = 0;<br /> }<br />}</p>
		<p>匹配过程如下：<br />public int Match(String target, int start) {<br /> if(array == null || pattern == null || target == null)<br />  return -1;<br /> int target_index = start;<br /> int pattern_index = 0;<br /> int token_length = target.Length;<br /> int pattern_length = pattern.Length;<br /> while(target_index &lt; token_length &amp;&amp; pattern_index &lt; pattern_length) {<br />  if(target[target_index] == pattern[pattern_index]) {<br />   target_index++;<br />   pattern_index++;<br />  } else {<br />   if(pattern_index == begin)<br />    target_index++;<br />   else<br />    pattern_index = array[pattern_index - 1];<br />  }<br /> }<br /> if(pattern_index == pattern_length)<br />  return target_index - pattern_length;<br /> return -1;<br />}</p>
		<h1>4 支持通配符?和*的KMP算法</h1>
		<p>KMP算法虽然能够进行字符串匹配，但是，在实践中字符串匹配往往还要支持通配符，MS系统中最常见的通配符是?和*。其中，?可以代表一个字符（不能没有），*可以代表任意多个字符（可以为空）。经典的KMP算法针对通配符是无能为力的，但是经过简单的改造，KMP算法也可以识别通配符。</p>
		<p>首先是?，根据?的功能，?表示任意字符，也就是说在匹配过程中，?永远匹配成功。因此对匹配函数的修改十分简单：<br />...<br /> while(target_index &lt; token_length &amp;&amp; pattern_index &lt; pattern_length) {<br />  if(target[target_index] == pattern[pattern_index]|| pattern[pattern_index] == '?') {<br />   target_index++;<br />   pattern_index++;<br />  } else {<br />...<br />建立失效函数的过程和匹配过程类似，修改如下：<br />...<br /> for(i = 1; i &lt; s; i++) {<br />  if(pattern[i] == pattern[array[i - 1]]|| pattern[i] == '?' || pattern[array[i - 1]] == '?')<br />   array[i] = array[i - 1] + 1;<br />...</p>
		<p>本质上，?并没有修改算法，而仅仅修改了匹配规则——遇到?则一定匹配。然而*与此不同，*的作用是匹配任意多个字符，显然我们不能简单的修改匹配过程而满足要求。如果我们重新思考*的作用，我们会发现*的另一个作用就是分割P串，即如果P=P<sub>1</sub>*P<sub>2</sub>，那么与其说*代表匹配任意多个字符，不如说P的匹配条件是在匹配P<sub>1</sub>子串后再匹配P<sub>2</sub>子串。</p>
		<p>现在回顾失效函数的作用，如果当匹配到P的j+1位时匹配失败，那么重新开始匹配的时候，P串的位置调整到f(j)位，直到P串的位置调整到0，则匹配重新开始。但当P=P<sub>1</sub>*P<sub>2</sub>，假如P<sub>1</sub>已经匹配成功，而在P<sub>2</sub>中发生匹配失败，那么P串要需要调整位置，但P串无论如何调整，此时也不应该调整到0，最多调整到P<sub>2</sub>的开始处，因为P<sub>1</sub>已经匹配，只需匹配P<sub>2</sub>即可。假如P=abcab*abcab，失效函数应该是（注意之前提到*的作用）：<br />a b c a b * a b c a b<br />0 0 0 1 2 - 6 6 6 7 8</p>
		<p>因此，要想让KMP支持*，那么关键是要重新设计失效函数的建立算法，如下：<br />public void Build() {<br /> if(pattern == null)<br />  throw new Exception("KMP Exception : null pattern");<br /> array = new int[pattern.Length];<br /> int i = 0, s = pattern.Length;<br /> if(s &gt; 1)<br />  array[0] = 0;<br /> int begin = 0;<br /> for(i = 1; i &lt; s; i++) {<br />  if(pattern[i] == '*') {<br />   array[i] = i;<br />   begin = i + 1;<br />  } else if(pattern[i] == pattern[array[i - 1]] || pattern[i] == '?' || pattern[array[i - 1]] == '?')<br />   array[i] = array[i - 1] + 1;<br />  else<br />   array[i] = begin;<br /> }<br />} </p>
		<p>算法中begin表示每段字符串的开始位置。此外，匹配过程也应该进行相应的修改，因为字符*对于匹配没有任何帮助，它属于占位符，因此需要跳过，匹配算法如下：<br />public int Match(String target, int start) {<br /> if(array == null || pattern == null || target == null)<br />  return -1;<br /> int target_index = start;<br /> int pattern_index = 0;<br /> int token_length = target.Length;<br /> int pattern_length = pattern.Length;<br /> int begin = 0;<br /> while(target_index &lt; token_length &amp;&amp; pattern_index &lt; pattern_length) {<br />  if(pattern[pattern_index] == '*') {<br />   begin = pattern_index + 1;<br />   pattern_index++;<br />  } else if(target[target_index] == pattern[pattern_index] || pattern[pattern_index] == '?') {<br />   target_index++;<br />   pattern_index++;<br />  } else {<br />   if(pattern_index == begin)<br />    target_index++;<br />   else<br />    pattern_index = array[pattern_index - 1];<br />  }<br /> }<br /> if(pattern_index == pattern_length)<br />  return target_index - pattern_length + begin;<br /> return -1;<br />}</p>
		<h1>5 正则语言和确定状态自动机</h1>
		<p>一个数字逻辑的问题：设计一个识别11011的电路，解这个问题的关键就是设计出这个电路的DFA，如下：<br /><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.blog.edu.cn/UploadFiles/2006-8/823915044.png" onload="javascript:if(this.width&gt;500){this.resized=true;this.style.width=500;}" /></p>
		<p>仔细看看这个状态机，是不是和KMP的算法有几分类似呢？这并不是巧合，因为KMP算法中的失效函数总可以等价的转化为一个DFA。当然KMP的DFA远比识别11011的DFA要复杂，原因在于KMP接受的输入是全体字符集合，识别11011的DFA只接受0和1这两个输入。我们知道，一个正则语言和一个DFA是等价的，而KMP计算失效函数的算法，实际上等价于求DFA的过程，f(j)的值实际上表明状态j+1接受到不正确的字符时应该回溯到的状态（注意此时输入流并没有前进）。普通的字符串都能看成是一个正则语言，含有通配符?和*的字符串也可以等价的转换为一个正则表达式。但是，正则语言的集合远比KMP算法所能支持的模式集合的更大，期间原因还是刚才提过的输入问题。试想P=p<sub>1</sub>p<sub>2</sub>...p<sub>n</sub>，当匹配到p<sub>j</sub>的时候，如果下一个输入字符正是p<sub>j</sub>，那么状态机进入下一个状态，如果不是p<sub>j</sub>，那么状态机按照实效函数的指示转移到状态f(j-1)，也就是说KMP状态机的每个状态只能根据输入是否为p<sub>j</sub>来进行转移。而正则表达式所对应的状态机则有所不同，如果正则语言L=l<sub>1</sub>l<sub>2</sub>...l<sub>n</sub>，假设这些都是字母，当匹配到l<sub>j</sub>位的时候，如果下一个输入字符正是l<sub>j</sub>，那么状态机进入下一个状态，否则它还可以根据输入的值进行转移，例如l<sub>j</sub>=c<sub>1</sub>时转换到状态x，l<sub>j</sub>=c<sub>2</sub>时状态转换到y等等。</p>
		<h1>6 结语</h1>
		<p>字符串匹配问题是老问题了，并没有太多新意可言，只不过虽然KMP算法十分简单，但它的内在含义还是十分深刻的。横向比较KMP、DFA和正则语言、正则表达式我们会发现，它们之间存在很多的关联，而这种比较也有利于我们更好的理解这些算法，或者改进这些算法。最后说一句，试图利用目前的框架使得KMP算法支持全部种类的通配符（对应于正则表达式就是x?、x*、x+、{m,n}等等）是不可能，而我们也不需要这么做，因为我们还有正则表达式嘛。</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/101927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-03-05 15:29 <a href="http://www.blogjava.net/renyangok/archive/2007/03/05/101927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java整型数组平衡点算法</title><link>http://www.blogjava.net/renyangok/archive/2007/03/05/101848.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Mon, 05 Mar 2007 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/03/05/101848.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/101848.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/03/05/101848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/101848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/101848.html</trackback:ping><description><![CDATA[
		<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_0_119_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_119_Open_Text.style.display='none'; Codehighlighter1_0_119_Closed_Image.style.display='inline'; Codehighlighter1_0_119_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_0_119_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_119_Closed_Text.style.display='none'; Codehighlighter1_0_119_Open_Image.style.display='inline'; Codehighlighter1_0_119_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span id="Codehighlighter1_0_119_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">/**/</span>
				<span id="Codehighlighter1_0_119_Open_Text">
						<span style="COLOR: #008000">/*</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 整形数组平衡点问题：平衡点指左边的整数和等于右边的整数和，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 求出平衡点位置，要求输入的数组可能是GB级<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 本题要求找出整型数组的一个平衡点（如果要找出所有平衡点的话，按此方法需要把每一个平衡点都存起来）<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img id="Codehighlighter1_140_665_Open_Image" onclick="this.style.display='none'; Codehighlighter1_140_665_Open_Text.style.display='none'; Codehighlighter1_140_665_Closed_Image.style.display='inline'; Codehighlighter1_140_665_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_140_665_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_140_665_Closed_Text.style.display='none'; Codehighlighter1_140_665_Open_Image.style.display='inline'; Codehighlighter1_140_665_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"> Test </span>
				<span id="Codehighlighter1_140_665_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_140_665_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_182_455_Open_Image" onclick="this.style.display='none'; Codehighlighter1_182_455_Open_Text.style.display='none'; Codehighlighter1_182_455_Closed_Image.style.display='inline'; Codehighlighter1_182_455_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_182_455_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_182_455_Closed_Text.style.display='none'; Codehighlighter1_182_455_Open_Image.style.display='inline'; Codehighlighter1_182_455_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">int</span>
						<span style="COLOR: #000000"> findBalanceableNod(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000">[] a)</span>
						<span id="Codehighlighter1_182_455_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_182_455_Open_Text">
								<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_199_217_Open_Image" onclick="this.style.display='none'; Codehighlighter1_199_217_Open_Text.style.display='none'; Codehighlighter1_199_217_Closed_Image.style.display='inline'; Codehighlighter1_199_217_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_199_217_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_199_217_Closed_Text.style.display='none'; Codehighlighter1_199_217_Open_Image.style.display='inline'; Codehighlighter1_199_217_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">(a </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">)</span>
								<span id="Codehighlighter1_199_217_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_199_217_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </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/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">long</span>
								<span style="COLOR: #000000"> sum </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0l</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">long</span>
								<span style="COLOR: #000000"> subSum </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0l</span>
								<span style="COLOR: #000000">;<br /><img id="Codehighlighter1_291_311_Open_Image" onclick="this.style.display='none'; Codehighlighter1_291_311_Open_Text.style.display='none'; Codehighlighter1_291_311_Closed_Image.style.display='inline'; Codehighlighter1_291_311_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_291_311_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_291_311_Closed_Text.style.display='none'; Codehighlighter1_291_311_Open_Image.style.display='inline'; Codehighlighter1_291_311_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"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">; i </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> a.length; i</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">)</span>
								<span id="Codehighlighter1_291_311_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_291_311_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            sum </span>
										<span style="COLOR: #000000">+=</span>
										<span style="COLOR: #000000"> a[i];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_348_439_Open_Image" onclick="this.style.display='none'; Codehighlighter1_348_439_Open_Text.style.display='none'; Codehighlighter1_348_439_Closed_Image.style.display='inline'; Codehighlighter1_348_439_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_348_439_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_348_439_Closed_Text.style.display='none'; Codehighlighter1_348_439_Open_Image.style.display='inline'; Codehighlighter1_348_439_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"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">; i </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> a.length; i</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">)</span>
								<span id="Codehighlighter1_348_439_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_348_439_Open_Text">
										<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_386_405_Open_Image" onclick="this.style.display='none'; Codehighlighter1_386_405_Open_Text.style.display='none'; Codehighlighter1_386_405_Closed_Image.style.display='inline'; Codehighlighter1_386_405_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_386_405_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_386_405_Closed_Text.style.display='none'; Codehighlighter1_386_405_Open_Image.style.display='inline'; Codehighlighter1_386_405_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">(subSum </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> sum </span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000"> subSum </span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000"> a[i])</span>
										<span id="Codehighlighter1_386_405_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_386_405_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
												<span style="COLOR: #0000ff">return</span>
												<span style="COLOR: #000000"> i;<br /><img id="Codehighlighter1_410_435_Open_Image" onclick="this.style.display='none'; Codehighlighter1_410_435_Open_Text.style.display='none'; Codehighlighter1_410_435_Closed_Image.style.display='inline'; Codehighlighter1_410_435_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_410_435_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_410_435_Closed_Text.style.display='none'; Codehighlighter1_410_435_Open_Image.style.display='inline'; Codehighlighter1_410_435_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            }</span>
										</span>
										<span style="COLOR: #0000ff">else</span>
										<span id="Codehighlighter1_410_435_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_410_435_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                subSum </span>
												<span style="COLOR: #000000">+=</span>
												<span style="COLOR: #000000"> a[i];<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/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </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/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_499_663_Open_Image" onclick="this.style.display='none'; Codehighlighter1_499_663_Open_Text.style.display='none'; Codehighlighter1_499_663_Closed_Image.style.display='inline'; Codehighlighter1_499_663_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_499_663_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_499_663_Closed_Text.style.display='none'; Codehighlighter1_499_663_Open_Image.style.display='inline'; Codehighlighter1_499_663_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_499_663_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_499_663_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">测试用例：平衡点为0位，为n-1位，为中间位，a的每个为存了Integer.MAX_VALUE(所以用sum,subSum用long型)</span>
								<span style="COLOR: #008000">
										<br />
										<img id="Codehighlighter1_586_589_Open_Image" onclick="this.style.display='none'; Codehighlighter1_586_589_Open_Text.style.display='none'; Codehighlighter1_586_589_Closed_Image.style.display='inline'; Codehighlighter1_586_589_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_586_589_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_586_589_Closed_Text.style.display='none'; Codehighlighter1_586_589_Open_Image.style.display='inline'; Codehighlighter1_586_589_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">        </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000">[] a </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span id="Codehighlighter1_586_589_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_586_589_Open_Text">
										<span style="COLOR: #000000">{</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">}</span>
								</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Test t </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> Test();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(t.findBalanceableNod(a));<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>
<img src ="http://www.blogjava.net/renyangok/aggbug/101848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-03-05 10:40 <a href="http://www.blogjava.net/renyangok/archive/2007/03/05/101848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java字符串全排列问题（经典）</title><link>http://www.blogjava.net/renyangok/archive/2007/03/02/101515.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Fri, 02 Mar 2007 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/03/02/101515.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/101515.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/03/02/101515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/101515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/101515.html</trackback:ping><description><![CDATA[
		<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_0_393_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_393_Open_Text.style.display='none'; Codehighlighter1_0_393_Closed_Image.style.display='inline'; Codehighlighter1_0_393_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_0_393_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_393_Closed_Text.style.display='none'; Codehighlighter1_0_393_Open_Image.style.display='inline'; Codehighlighter1_0_393_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span id="Codehighlighter1_0_393_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">/**/</span>
				<span id="Codehighlighter1_0_393_Open_Text">
						<span style="COLOR: #008000">/*</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 原题如下：用1、2、2、3、4、6这六个数字，用java写一个main函数，打印出所有不同的排列，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 如：612234、412346等，要求："4"不能在第三位，"3"与"6"不能相连. <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点，把六个结点连接成无向连通图，对于每一个结点求这个图形的遍历路径，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 所有结点的遍历路径就是最后对这6个数字的排列组合结果集。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 2 显然这个结果集还未达到题目的要求。从以下几个方面考虑： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 1. 3，6不能相连：实际要求这个连通图的结点3，5之间不能连通, 可在构造图结构时就满足改条件，然后再遍历图。 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 2. 不能有重复: 考虑到有两个2，明显会存在重复结果，可以把结果集放在TreeSet中过滤重复结果 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span>
						<span style="COLOR: #008000">*/</span>
				</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">import</span>
				<span style="COLOR: #000000"> java.util.Iterator;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.TreeSet;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_468_1874_Open_Image" onclick="this.style.display='none'; Codehighlighter1_468_1874_Open_Text.style.display='none'; Codehighlighter1_468_1874_Closed_Image.style.display='inline'; Codehighlighter1_468_1874_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_468_1874_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_468_1874_Closed_Text.style.display='none'; Codehighlighter1_468_1874_Open_Image.style.display='inline'; Codehighlighter1_468_1874_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"> Test </span>
				<span id="Codehighlighter1_468_1874_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_1874_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_506_537_Open_Image" onclick="this.style.display='none'; Codehighlighter1_506_537_Open_Text.style.display='none'; Codehighlighter1_506_537_Closed_Image.style.display='inline'; Codehighlighter1_506_537_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_506_537_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_506_537_Closed_Text.style.display='none'; Codehighlighter1_506_537_Open_Image.style.display='inline'; Codehighlighter1_506_537_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> String[] b </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> String[] </span>
						<span id="Codehighlighter1_506_537_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_506_537_Open_Text">
								<span style="COLOR: #000000">{ </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">2</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">2</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">3</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">4</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">6</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000"> }</span>
						</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/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> n </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> b.length;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">boolean</span>
						<span style="COLOR: #000000">[] visited </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">boolean</span>
						<span style="COLOR: #000000">[n];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000">[][] a </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000">[n][n];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> String result </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" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> TreeSet set </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> TreeSet();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_761_786_Open_Image" onclick="this.style.display='none'; Codehighlighter1_761_786_Open_Text.style.display='none'; Codehighlighter1_761_786_Closed_Image.style.display='inline'; Codehighlighter1_761_786_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_761_786_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_761_786_Closed_Text.style.display='none'; Codehighlighter1_761_786_Open_Image.style.display='inline'; Codehighlighter1_761_786_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_761_786_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_761_786_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> Test().start();<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/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_811_1311_Open_Image" onclick="this.style.display='none'; Codehighlighter1_811_1311_Open_Text.style.display='none'; Codehighlighter1_811_1311_Closed_Image.style.display='inline'; Codehighlighter1_811_1311_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_811_1311_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_811_1311_Closed_Text.style.display='none'; Codehighlighter1_811_1311_Open_Image.style.display='inline'; Codehighlighter1_811_1311_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> start() </span>
						<span id="Codehighlighter1_811_1311_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_811_1311_Open_Text">
								<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/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> Initial the map a[][]</span>
								<span style="COLOR: #008000">
										<br />
										<img id="Codehighlighter1_871_986_Open_Image" onclick="this.style.display='none'; Codehighlighter1_871_986_Open_Text.style.display='none'; Codehighlighter1_871_986_Closed_Image.style.display='inline'; Codehighlighter1_871_986_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_871_986_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_871_986_Closed_Text.style.display='none'; Codehighlighter1_871_986_Open_Image.style.display='inline'; Codehighlighter1_871_986_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">  </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"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">; i </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> n; i</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_871_986_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_871_986_Open_Text">
										<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_904_982_Open_Image" onclick="this.style.display='none'; Codehighlighter1_904_982_Open_Text.style.display='none'; Codehighlighter1_904_982_Closed_Image.style.display='inline'; Codehighlighter1_904_982_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_904_982_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_904_982_Closed_Text.style.display='none'; Codehighlighter1_904_982_Open_Image.style.display='inline'; Codehighlighter1_904_982_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"> j </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">; j </span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000"> n; j</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">) </span>
										<span id="Codehighlighter1_904_982_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_904_982_Open_Text">
												<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_922_946_Open_Image" onclick="this.style.display='none'; Codehighlighter1_922_946_Open_Text.style.display='none'; Codehighlighter1_922_946_Closed_Image.style.display='inline'; Codehighlighter1_922_946_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_922_946_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_922_946_Closed_Text.style.display='none'; Codehighlighter1_922_946_Open_Image.style.display='inline'; Codehighlighter1_922_946_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">==</span>
												<span style="COLOR: #000000"> j) </span>
												<span id="Codehighlighter1_922_946_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_922_946_Open_Text">
														<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     a[i][j] </span>
														<span style="COLOR: #000000">=</span>
														<span style="COLOR: #000000"> </span>
														<span style="COLOR: #000000">0</span>
														<span style="COLOR: #000000">;<br /><img id="Codehighlighter1_953_977_Open_Image" onclick="this.style.display='none'; Codehighlighter1_953_977_Open_Text.style.display='none'; Codehighlighter1_953_977_Closed_Image.style.display='inline'; Codehighlighter1_953_977_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_953_977_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_953_977_Closed_Text.style.display='none'; Codehighlighter1_953_977_Open_Image.style.display='inline'; Codehighlighter1_953_977_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span>
												</span>
												<span style="COLOR: #000000"> </span>
												<span style="COLOR: #0000ff">else</span>
												<span style="COLOR: #000000"> </span>
												<span id="Codehighlighter1_953_977_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_953_977_Open_Text">
														<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     a[i][j] </span>
														<span style="COLOR: #000000">=</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/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/InBlock.gif" align="top" />
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 3 and 5 can not be the neighbor.</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">  a[</span>
								<span style="COLOR: #000000">3</span>
								<span style="COLOR: #000000">][</span>
								<span style="COLOR: #000000">5</span>
								<span style="COLOR: #000000">] </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  a[</span>
								<span style="COLOR: #000000">5</span>
								<span style="COLOR: #000000">][</span>
								<span style="COLOR: #000000">3</span>
								<span style="COLOR: #000000">] </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</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/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> Begin to depth search.</span>
								<span style="COLOR: #008000">
										<br />
										<img id="Codehighlighter1_1116_1149_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1116_1149_Open_Text.style.display='none'; Codehighlighter1_1116_1149_Closed_Image.style.display='inline'; Codehighlighter1_1116_1149_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_1116_1149_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1116_1149_Closed_Text.style.display='none'; Codehighlighter1_1116_1149_Open_Image.style.display='inline'; Codehighlighter1_1116_1149_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">  </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"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">; i </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> n; i</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_1116_1149_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_1116_1149_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">this</span>
										<span style="COLOR: #000000">.depthFirstSearch(i);<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/InBlock.gif" align="top" />
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> Print result treeset.</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">  Iterator it </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> set.iterator();<br /><img id="Codehighlighter1_1234_1308_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1234_1308_Open_Text.style.display='none'; Codehighlighter1_1234_1308_Closed_Image.style.display='inline'; Codehighlighter1_1234_1308_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1234_1308_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1234_1308_Closed_Text.style.display='none'; Codehighlighter1_1234_1308_Open_Image.style.display='inline'; Codehighlighter1_1234_1308_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">while</span>
								<span style="COLOR: #000000"> (it.hasNext()) </span>
								<span id="Codehighlighter1_1234_1308_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_1234_1308_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   String string </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> (String) it.next();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   System.out.println(string);<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/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_1361_1872_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1361_1872_Open_Text.style.display='none'; Codehighlighter1_1361_1872_Closed_Image.style.display='inline'; Codehighlighter1_1361_1872_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1361_1872_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1361_1872_Closed_Text.style.display='none'; Codehighlighter1_1361_1872_Open_Image.style.display='inline'; Codehighlighter1_1361_1872_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">private</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> depthFirstSearch(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> startIndex) </span>
						<span id="Codehighlighter1_1361_1872_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_1361_1872_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  visited[startIndex] </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">true</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  result </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> result </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> b[startIndex];<br /><img id="Codehighlighter1_1456_1593_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1456_1593_Open_Text.style.display='none'; Codehighlighter1_1456_1593_Closed_Image.style.display='inline'; Codehighlighter1_1456_1593_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1456_1593_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1456_1593_Closed_Text.style.display='none'; Codehighlighter1_1456_1593_Open_Image.style.display='inline'; Codehighlighter1_1456_1593_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"> (result.length() </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> n) </span>
								<span id="Codehighlighter1_1456_1593_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_1456_1593_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">   "4" can not be the third position.</span>
										<span style="COLOR: #008000">
												<br />
												<img id="Codehighlighter1_1531_1589_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1531_1589_Open_Text.style.display='none'; Codehighlighter1_1531_1589_Closed_Image.style.display='inline'; Codehighlighter1_1531_1589_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_1531_1589_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1531_1589_Closed_Text.style.display='none'; Codehighlighter1_1531_1589_Open_Image.style.display='inline'; Codehighlighter1_1531_1589_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">   </span>
										<span style="COLOR: #0000ff">if</span>
										<span style="COLOR: #000000"> (result.indexOf(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">4</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">2</span>
										<span style="COLOR: #000000">) </span>
										<span id="Codehighlighter1_1531_1589_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_1531_1589_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">    Filt the duplicate value.</span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">    set.add(result);<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_1625_1714_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1625_1714_Open_Text.style.display='none'; Codehighlighter1_1625_1714_Closed_Image.style.display='inline'; Codehighlighter1_1625_1714_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_1625_1714_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1625_1714_Closed_Text.style.display='none'; Codehighlighter1_1625_1714_Open_Image.style.display='inline'; Codehighlighter1_1625_1714_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"> j </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">; j </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> n; j</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_1625_1714_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_1625_1714_Open_Text">
										<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_1680_1710_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1680_1710_Open_Text.style.display='none'; Codehighlighter1_1680_1710_Closed_Image.style.display='inline'; Codehighlighter1_1680_1710_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1680_1710_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1680_1710_Closed_Text.style.display='none'; Codehighlighter1_1680_1710_Open_Image.style.display='inline'; Codehighlighter1_1680_1710_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"> (a[startIndex][j] </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">&amp;&amp;</span>
										<span style="COLOR: #000000"> visited[j] </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">false</span>
										<span style="COLOR: #000000">) </span>
										<span id="Codehighlighter1_1680_1710_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_1680_1710_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    depthFirstSearch(j);<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/InBlock.gif" align="top" />
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> restore the result value and visited value after listing a node.</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">  result </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> result.substring(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">, result.length() </span>
								<span style="COLOR: #000000">-</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" />  visited[startIndex] </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">false</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" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>只要这样定义图，根本不用在代码中写IF ELSE语句。 <br />实际上基于图的算法好处在于，只要你能定义好满足题目要求的图结构，遍历的结果就是你要的结果，不用任何对遍历结果做任何处理。包括本题中的：4不能在第三位置，3，5不能相连，唯一性要求，其实都可以在体现在构造的图形结构里，然后直接遍历图取得自己要的结果。而不用再次处理结果集。只是说这里实际上对其它要求要体现在图结构里有困难（理论上是可以的），但起码3，5不能相接是很好构造的，就是上面的代码段来解释的。</p>
		<p>关于图形数据结构建议先看看数据结构的书，主要是将如何利用二维数组描述图结构，再看看图的深度遍历实现原理。最后再应用到这个问题上来，自然就不难明白了。</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/101515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-03-02 17:37 <a href="http://www.blogjava.net/renyangok/archive/2007/03/02/101515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态规划算法</title><link>http://www.blogjava.net/renyangok/archive/2007/02/27/100957.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 27 Feb 2007 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/02/27/100957.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/100957.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/02/27/100957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/100957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/100957.html</trackback:ping><description><![CDATA[
		<p>（转自：<a href="http://chinavery.100steps.net/chengxuyuan/4759.html">http://chinavery.100steps.net/chengxuyuan/4759.html</a>）<br />动态规划是本书介绍的五种算法设计方法中难度最大的一种，它建立在最优原则的基础上。采用动态规划方法，可以优雅而高效地解决许多用贪婪算法或分而治之算法无法解决的问题。在介绍动态规划的原理之后，本章将分别考察动态规划方法在解决背包问题、图象压缩、矩阵乘法链、最短路径、无交叉子集和元件折叠等方面的应用。</p>
		<p>3.1 算法思想</p>
		<p>和贪婪算法一样，在动态规划中，可将一个问题的解决方案视为一系列决策的结果。不同的是，在贪婪算法中，每采用一次贪婪准则便做出一个不可撤回的决策，而在动态规划中，还要考察每个最优决策序列中是否包含一个最优子序列。</p>
		<p>例3-1 [最短路经] 考察图1 2 - 2中的有向图。假设要寻找一条从源节点s= 1到目的节点d= 5的最短路径，即选择此路径所经过的各个节点。第一步可选择节点2，3或4。假设选择了节点3，则此时所要求解的问题变成：选择一条从3到5的最短路径。如果3到5的路径不是最短的，则从1开始经过3和5的路径也不会是最短的。例如，若选择的子路径（非最短路径）是3，2，5 (耗费为9 )，则1到5的路径为1，3，2，5 (耗费为11 )，这比选择最短子路径3，4，5而得到的1到5的路径1，3，4，5 (耗费为9) 耗费更大。</p>
		<p>所以在最短路径问题中，假如在的第一次决策时到达了某个节点v，那么不管v 是怎样确定的，此后选择从v 到d 的路径时，都必须采用最优策略。</p>
		<p>例3-2 [0/1背包问题] 考察1 3 . 4节的0 / 1背包问题。如前所述，在该问题中需要决定x1 .. xn的值。假设按i = 1，2，.，n 的次序来确定xi 的值。如果置x1 = 0，则问题转变为相对于其余物品（即物品2，3，.，n），背包容量仍为c 的背包问题。若置x1 = 1，问题就变为关于最大背包容量为c-w1 的问题。现设r?{c，c-w1 } 为剩余的背包容量。</p>
		<p>在第一次决策之后，剩下的问题便是考虑背包容量为r 时的决策。不管x1 是0或是1，[x2 ，.，xn ] 必须是第一次决策之后的一个最优方案，如果不是，则会有一个更好的方案[y2，.，yn ]，因而[x1，y2，.，yn ]是一个更好的方案。</p>
		<p>假设n=3, w=[100,14,10], p=[20,18,15], c= 11 6。若设x1 = 1，则在本次决策之后，可用的背包容量为r= 116-100=16 。[x2，x3 ]=[0,1] 符合容量限制的条件，所得值为1 5，但因为[x2，x3 ]= [1，0] 同样符合容量条件且所得值为1 8，因此[x2，x3 ] = [ 0，1] 并非最优策略。即x= [ 1，0，1] 可改进为x= [ 1，1，0 ]。若设x1 = 0，则对于剩下的两种物品而言，容量限制条件为11 6。总之，如果子问题的结果[x2，x3 ]不是剩余情况下的一个最优解，则[x1，x2，x3 ]也不会是总体的最优解。</p>
		<p>例3-3 [航费] 某航线价格表为：从亚特兰大到纽约或芝加哥，或从洛杉矶到亚特兰大的费用为$ 1 0 0；从芝加哥到纽约票价$ 2 0；而对于路经亚特兰大的旅客，从亚特兰大到芝加哥的费用仅为$ 2 0。从洛杉矶到纽约的航线涉及到对中转机场的选择。如果问题状态的形式为（起点，终点），那么在选择从洛杉矶到亚特兰大后，问题的状态变为（亚特兰大，纽约）。从亚特兰大到纽约的最便宜航线是从亚特兰大直飞纽约，票价$ 1 0 0。而使用直飞方式时，从洛杉矶到纽约的花费为$ 2 0 0。不过，从洛杉矶到纽约的最便宜航线为洛杉矶-亚特兰大-芝加哥-纽约，其总花费为$ 1 4 0（在处理局部最优路径亚特兰大到纽约过程中选择了最低花费的路径：亚特兰大-芝加哥-纽约）。</p>
		<p>如果用三维数组（t a g，起点，终点）表示问题状态，其中t a g为0表示转飞， t a g为1表示其他情形，那么在到达亚特兰大后，状态的三维数组将变为（ 0，亚特兰大，纽约），它对应的最优路径是经由芝加哥的那条路径。</p>
		<p>当最优决策序列中包含最优决策子序列时，可建立动态规划递归方程（ d y n a m i c -programming recurrence equation），它可以帮助我们高效地解决问题。</p>
		<p>例3-4 [0/1背包] 在例3 - 2的0 / 1背包问题中，最优决策序列由最优决策子序列组成。假设f (i,y) 表示例1 5 - 2中剩余容量为y，剩余物品为i，i + 1，.，n 时的最优解的值，即：和利用最优序列由最优子序列构成的结论，可得到f 的递归式。f ( 1 ,c) 是初始时背包问题的最优解。可使用（ 1 5 - 2）式通过递归或迭代来求解f ( 1 ,c)。从f (n, * )开始迭式， f (n, * )由（1 5 - 1）式得出，然后由（ 1 5 - 2）式递归计算f (i,*) ( i=n- 1，n- 2，.， 2 )，最后由（ 1 5 - 2）式得出f ( 1 ,c)。</p>
		<p>对于例1 5 - 2，若0≤y＜1 0，则f ( 3 ,y) = 0；若y≥1 0，f ( 3 ,y) = 1 5。利用递归式（1 5 - 2），可得f (2, y) = 0 ( 0≤y＜10 )；f（2，y）= 1 5（1 0≤y＜1 4）；f（2，y）= 1 8（1 4≤y＜2 4）和f（2，y）= 3 3（y≥2 4）。因此最优解f ( 1 , 11 6 ) = m a x {f（2，11 6），f（2，11 6 - w1）+ p1} = m a x {f（2，11 6），f（2，1 6）+ 2 0 } = m a x { 3 3，3 8 } = 3 8。</p>
		<p>现在计算xi 值，步骤如下：若f ( 1 ,c) =f ( 2 ,c)，则x1 = 0，否则x1 = 1。接下来需从剩余容量c-w1中寻求最优解，用f (2, c-w1) 表示最优解。依此类推，可得到所有的xi (i= 1.n) 值。</p>
		<p>在该例中，可得出f ( 2 , 11 6 ) = 3 3≠f ( 1 , 11 6 )，所以x1 = 1。接着利用返回值3 8 -p1=18 计算x2 及x3，此时r = 11 6 -w1 = 1 6，又由f ( 2 , 1 6 ) = 1 8，得f ( 3 , 1 6 ) = 1 4≠f ( 2 , 1 6 )，因此x2 = 1，此时r= 1 6 -w2 = 2，所以f (3,2) =0，即得x3 = 0。</p>
		<p>动态规划方法采用最优原则（ principle of optimality）来建立用于计算最优解的递归式。所谓最优原则即不管前面的策略如何，此后的决策必须是基于当前状态（由上一次决策产生）的最优决策。由于对于有些问题的某些递归式来说并不一定能保证最优原则，因此在求解问题时有必要对它进行验证。若不能保持最优原则，则不可应用动态规划方法。在得到最优解的递归式之后，需要执行回溯（t r a c e b a c k）以构造最优解。</p>
		<p>编写一个简单的递归程序来求解动态规划递归方程是一件很诱人的事。然而，正如我们将在下文看到的，如果不努力地去避免重复计算，递归程序的复杂性将非常可观。如果在递归程序设计中解决了重复计算问题时，复杂性将急剧下降。动态规划递归方程也可用迭代方式来求解，这时很自然地避免了重复计算。尽管迭代程序与避免重复计算的递归程序有相同的复杂性，但迭代程序不需要附加的递归栈空间，因此将比避免重复计算的递归程序更快。</p>
		<p>
				<br />3.2 应用 </p>
		<p>3.2.1 0/1背包问题 </p>
		<p>1. 递归策略</p>
		<p>在例3 - 4中已建立了背包问题的动态规划递归方程，求解递归式（ 1 5 - 2）的一个很自然的方法便是使用程序1 5 - 1中的递归算法。该模块假设p、w 和n 为输入，且p 为整型，F(1,c) 返回f ( 1 ,c) 值。</p>
		<p>程序15-1 背包问题的递归函数</p>
		<p>int F(int i, int y)</p>
		<p>{// 返回f ( i , y ) .</p>
		<p>if (i == n) return (y &lt; w[n]) ? 0 : p[n];</p>
		<p>if (y &lt; w[i]) return F(i+1,y);</p>
		<p>return max(F(i+1,y), F(i+1,y-w[i]) + p[i]);</p>
		<p>}</p>
		<p>程序1 5 - 1的时间复杂性t (n)满足：t ( 1 ) =a；t（n）≤2t（n- 1）+b（n＞1），其中a、b 为常数。通过求解可得t (n) =O( 2n)。</p>
		<p>例3-5 设n= 5，p= [ 6 , 3 , 5 , 4 , 6 ]，w=[2,2,6,5,4] 且c= 1 0 ,求f ( 1 , 1 0 )。为了确定f ( 1 , 1 0 )，调用函数F ( 1 , 1 0 )。递归调用的关系如图1 5 - 1的树型结构所示。每个节点用y值来标记。对于第j层的节点有i=j，因此根节点表示F ( 1 , 1 0 )，而它有左孩子和右孩子，分别对应F ( 2 , 1 0 )和F ( 2 , 8 )。总共执行了2 8次递归调用。但我们注意到，其中可能含有重复前面工作的节点，如f ( 3 , 8 )计算过两次，相同情况的还有f ( 4 , 8 )、f ( 4 , 6 )、f ( 4 , 2 )、f ( 5 , 8 )、f ( 5 , 6 )、f ( 5 , 3 )、f (5,2) 和f ( 5 , 1 )。如果保留以前的计算结果，则可将节点数减至1 9，因为可以丢弃图中的阴影节点。</p>
		<p>正如在例3 - 5中所看到的，程序1 5 - 1做了一些不必要的工作。为了避免f (i,y)的重复计算，必须定义一个用于保留已被计算出的f (i,y)值的表格L，该表格的元素是三元组(i,y,f (i,y) )。在计算每一个f (i,y)之前，应检查表L中是否已包含一个三元组(i,y, * )，其中*表示任意值。如果已包含，则从该表中取出f (i,y)的值，否则，对f (i,y)进行计算并将计算所得的三元组(i,y,f (i,y) )加入表L。L既可以用散列（见7 . 4节）的形式存储，也可用二叉搜索树(见11章)的形式存储。</p>
		<p>2. 权为整数的迭代方法</p>
		<p>当权为整数时，可设计一个相当简单的算法（见程序1 5 - 2）来求解f ( 1 ,c)。该算法基于例3 - 4所给出的策略，因此每个f (i,y) 只计算一次。程序1 5 - 2用二维数组f [ ][ ]来保存各f 的值。而回溯函数Tr a c e b a c k用于确定由程序1 5 - 2所产生的xi 值。函数K n a p s a c k的复杂性为( n c），而Tr a c e b a c k的复杂性为( n )。</p>
		<p>程序15-2 f 和x 的迭代计算</p>
		<p>template&lt;class T&gt;</p>
		<p>void Knapsack(T p[], int w[], int c, int n, T** f)</p>
		<p>{// 对于所有i和y计算f [ i ] [ y ]</p>
		<p>// 初始化f [ n ] [ ]</p>
		<p>for (int y = 0; y &lt;= yMax; y++)</p>
		<p>f[n][y] = 0;</p>
		<p>for (int y = w[n]; y &lt;= c; y++)</p>
		<p>f[n][y] = p[n];</p>
		<p>// 计算剩下的f</p>
		<p>for (int i = n - 1; i &gt; 1; i--) {</p>
		<p>for (int y = 0; y &lt;= yMax; y++)</p>
		<p>f[i][y] = f[i+1][y];</p>
		<p>for (int y = w[i]; y &lt;= c; y++)</p>
		<p>f[i][y] = max(f[i+1][y], f[i+1][y-w[i]] + p[i]);</p>
		<p>}</p>
		<p>f[1][c] = f[2][c];</p>
		<p>if (c &gt;= w[1])</p>
		<p>f[1][c] = max(f[1][c], f[2][c-w[1]] + p[1]);</p>
		<p>}</p>
		<p>template&lt;class T&gt;</p>
		<p>void Traceback(T **f, int w[], int c, int n, int x[])</p>
		<p>{// 计算x</p>
		<p>for (int i = 1; i &lt; n; i++)</p>
		<p>if (f[i][c] == f[i+1][c]) x[i] = 0;</p>
		<p>else {x[i] = 1;</p>
		<p>c -= w[i];}</p>
		<p>x[n] = (f[n][c]) ? 1 : 0;</p>
		<p>}</p>
		<p>3. 元组方法（ 选读）</p>
		<p>程序1 5 - 2有两个缺点：1) 要求权为整数；2) 当背包容量c 很大时，程序1 5 - 2的速度慢于程序1 5 - 1。一般情况下，若c＞2n，程序1 5 - 2的复杂性为W (n2n )。可利用元组的方法来克服上述两个缺点。在元组方法中，对于每个i，f (i, y) 都以数对(y, f (i, y)) 的形式按y的递增次序存储于表P(i)中。同时，由于f (i, y) 是y 的非递减函数，因此P(i) 中各数对(y, f (i, y)) 也是按f (i, y) 的递增次序排列的。</p>
		<p>例3-6 条件同例3 - 5。对f 的计算如图1 5 - 2所示。当i= 5时，f 由数对集合P( 5 ) = [ ( 0 , 0 ) , ( 4 , 6 ) ]表示。而P( 4 )、P( 3 )和P( 2 )分别为[ ( 0 , 0 ) , ( 4 , 6 ) , ( 9 , 1 0 ) ]、[ ( 0 , 0 ) ( 4 , 6 ) , ( 9 , 1 0 ) , ( 1 0 , 11)] 和[ ( 0 , 0 ) ( 2 , 3 ) ( 4 , 6 ) ( 6 , 9 ) ( 9 , 1 0 ) ( 1 0 , 11 ) ]。</p>
		<p>为求f ( 1 , 1 0 )，利用式（1 5 - 2）得f ( 1 , 1 0 ) = m a x｛f ( 2 , 1 0 )，f ( 2 , 8 ) + p 1｝。由P( 2 )得f ( 2 , 1 0 ) = 11、f (2,8)=9 (f ( 2 , 8 ) = 9来自数对( 6，9 ) )，因此f ( 1 , 1 0 ) = m a x｛11 , 1 5｝= 1 5。现在来求xi 的值，因为f ( 1 , 1 0 ) =f ( 2 , 6 ) +p1，所以x1 = 1；由f ( 2 , 6 ) =f ( 3 , 6 - w 2 ) +p2 =f ( 3 , 4 ) +p2，得x2 = 1；由f ( 3 , 4 ) =f ( 4 , 4 ) =f ( 5 , 4 )得x3=x4 = 0；最后，因f ( 5 , 4 )≠0得x5= 1。</p>
		<p>检查每个P(i) 中的数对，可以发现每对(y,f (i,y)) 对应于变量xi , ., xn 的0/1 赋值的不同组合。设（a,b）和（c,d）是对应于两组不同xi , ., xn 的0 / 1赋值，若a≥c且b＜d，则(a, b) 受(b, c) 支配。被支配者不必加入P(i)中。若在相同的数对中有两个或更多的赋值，则只有一个放入P(i)。假设wn≤C，P(n)=[(0,0), (wn , pn ) ]，P（n）中对应于xn 的两个数对分别等于0和1。对于每个i，P(i)可由P(i+ 1 )得出。首先，要计算数对的有序集合Q，使得当且仅当wi≤s≤c且(s-wi , t-pi )为P(i+1) 中的一个数对时，（s,t）为Q中的一个数对。现在Q中包含xi = 1时的数对集，而P(i+ 1 )对应于xi = 0的数对集。接下来，合并Q和P(i+ 1 )并删除受支配者和重复值即可得到P(i)。</p>
		<p>例3-7 各数据同例1 5 - 6。P(5)=[(0,0),(4,6)], 因此Q= [ ( 5 , 4 ) , ( 9 , 1 0 ) ]。现在要将P( 5 )和Q合并得到P( 4 )。因( 5 , 4 )受( 4 , 6 )支配，可删除( 5 , 4 )，所以P（4）=[(0,0), (4,6), (9,10)]。接着计算P( 3 )，首先由P( 4 )得Q=[(6,5), (10,11 ) ]，然后又由合并方法得P(3)=[(0,0), (4,6), (9,10), (10,11 ) ]。最后计算P( 2 )：由P( 3 )得Q= [ ( 2 , 3 )，( 6 , 9 ) ]，P( 3 )与Q合并得P(2)=[(0,0), (2,3), (4,6), (6,9), (9,10). (10,11 ) ]。因为每个P(i) 中的数对对应于xi , ., xn 的不同0 / 1赋值，因此P(i) 中的数对不会超过2n-i+ 1个。计算P(i) 时，计算Q需消耗( |P(i+ 1 ) |）的时间，合并P(i+1) 和Q同样需要( |P(i+ 1 ) | )的时间。计算所有P(i) 时所需要的总时间为： (n ?i=2|P(i + 1)|= O ( 2n )。当权为整数时，|P(i) |≤c+1, 此时复杂性为O ( m i n {n c, 2n } )。</p>
		<p>如6 . 4 . 3节定义的，数字化图像是m×m的像素阵列。假定每个像素有一个0 ~ 2 5 5的灰度值。因此存储一个像素至多需8位。若每个像素存储都用最大位8位，则总的存储空间为8m2 位。为了减少存储空间，我们将采用变长模式（ variable bit scheme），即不同像素用不同位数来存储。像素值为0和1时只需1位存储空间；值2、3各需2位；值4，5，6和7各需3位；以此类推，使用变长模式的步骤如下：</p>
		<p>1) 图像线性化根据图15-3a 中的折线将m×m维图像转换为1×m2 维矩阵。</p>
		<p>2) 分段将像素组分成若干个段，分段原则是：每段中的像素位数相同。每个段是相邻像素的集合且每段最多含2 5 6个像素，因此，若相同位数的像素超过2 5 6个的话，则用两个以上的段表示。</p>
		<p>3) 创建文件创建三个文件：S e g m e n t L e n g t h, BitsPerPixel 和P i x e l s。第一个文件包含在2 )中所建的段的长度(减1 )，文件中各项均为8位长。文件BitsPerPixel 给出了各段中每个像素的存储位数（减1），文件中各项均为3位。文件Pixels 则是以变长格式存储的像素的二进制串。</p>
		<p>4) 压缩文件压缩在3) 中所建立的文件，以减少空间需求。</p>
		<p>上述压缩方法的效率（用所得压缩率表示）很大程度上取决于长段的出现频率。</p>
		<p>例3-8 考察图15-3b 的4×4图像。按照蛇形的行主次序，灰度值依次为1 0，9，1 2，4 0，5 0，3 5，1 5，1 2，8，1 0，9，1 5，11，1 3 0，1 6 0和2 4 0。各像素所需的位数分别为4，4，4，6，6，6，4，4，4，4，4，4，4，8，8和8，按等长的条件将像素分段，可以得到4个段[ 1 0，9，1 2 ]、[ 4 0，5 0，3 5 ]、[15, 12, 8, 10, 9, 15, 11] 和［130, 160, 240］。因此，文件SegmentLength 为2，2，6，2；文件BitsPerSegment 的内容为3，5，3，7；文件P i x e l s包含了按蛇形行主次序排列的1 6个灰度值，其中头三个各用4位存储，接下来三个各用6位，再接下来的七个各用4位，最后三个各用8位存储。因此存储单元中前3 0位存储了前六个像素：</p>
		<p>1010 1001 1100 111000 110010 100011</p>
		<p>这三个文件需要的存储空间分别为：文件SegmentLength 需3 2位；BitsPerSegment 需1 2位；Pixels 需8 2位，共需1 2 6位。而如果每个像素都用8位存储，则存储空间需8×1 6 = 1 2 8位，因而在本例图像中，节省了2位的空间。</p>
		<p>假设在2) 之后，产生了n 个段。段标题（segment header）用于存储段的长度以及该段中每个像素所占用的位数。每个段标题需11位。现假设li 和bi 分别表示第i 段的段长和该段每个像素的长度，则存储第i 段像素所需要的空间为li *bi 。在2) 中所得的三个文件的总存储空间为11 n+n ?i = 1li bi。可通过将某些相邻段合并的方式来减少空间消耗。如当段i 和i+ 1被合并时，合并后的段长应为li +li + 1。此时每个像素的存储位数为m a x {bi，bi +1 } 位。尽管这种技术增加了文件P i x e l s的空间消耗，但同时也减少了一个段标题的空间。</p>
		<p>例3-9 如果将例1 5 - 8中的第1段和第2段合并，合并后，文件S e g m e n t L e n g t h变为5，6，2，BitsPerSegment 变为5，3，7。而文件Pixels 的前3 6位存储的是合并后的第一段：001010 001001 001100 111000 110010 100011其余的像素（例1 5 - 8第3段）没有改变。因为减少了1个段标题，文件S e g m e n t L e n g t h和BitsPerPixel 的空间消耗共减少了11位，而文件Pixels 的空间增加6位，因此总共节约的空间为5位，空间总消耗为1 2 1位。</p>
		<p>我们希望能设计一种算法，使得在产生n 个段之后，能对相邻段进行合并，以便产生一个具有最小空间需求的新的段集合。在合并相邻段之后，可利用诸如L Z W法（见7 . 5节）和霍夫曼编码（见9 . 5 . 3节）等其他技术来进一步压缩这三个文件。</p>
		<p>令sq 为前q 个段的最优合并所需要的空间。定义s0 = 0。考虑第i 段(i＞0 )，假如在最优合并C中，第i 段与第i- 1，i- 2，.，i-r+1 段相合并，而不包括第i-r 段。合并C所需要的空间消耗等于：第1段到第i-r 段所需空间+ l s u m (i-r+ 1 ,i) * b m a x (i-r+ 1 ,i) + 11</p>
		<p>其中l s u m(a, b)=b ?j =a</p>
		<p>lj，bmax (a, b)= m a x {ba , ..., bb }。假如在C中第1段到第i-r 段的合并不是最优合并，那么需要对合并进行修改，以使其具有更小的空间需求。因此还必须对段1到段i-r 进行最优合并，也即保证最优原则得以维持。故C的空间消耗为：</p>
		<p>si = si-r +l s u m（i-r+1, i）*b m a x（i-r+1, i）+ 11</p>
		<p>r 的值介于1到i 之间，其中要求l s u m不超过2 5 6 (因为段长限制在2 5 6之内)。尽管我们不知道如何选择r，但我们知道，由于C具有最小的空间需求，因此在所有选择中， r 必须产生最小的空间需求。</p>
		<p>假定k a yi 表示取得最小值时k 的值，sn 为n 段的最优合并所需要的空间，因而一个最优合并可用kay 的值构造出来。</p>
		<p>例3-10 假定在2) 中得到五个段，它们的长度为[ 6，3，1 0，2，3 ]，像素位数为[ 1，2，3，2，1 ]，要用公式（1 5 - 3）计算sn，必须先求出sn-1，.，s0 的值。s0 为0，现计算s1：s1 =s0 +l1 *b1+ 11 = 1 7k a y1 = 1s2 由下式得出：</p>
		<p>s2 = m i n {s1 +l2 b2 , s0 + (l1 +l2 ) * m a x {b1 , b2} } + 11 = m i n { 1 7 + 6 , 0 + 9 * 2 } + 11 = 2 9</p>
		<p>k a y2 = 2</p>
		<p>以此类推，可得s1.s5 = [ 1 7，2 9，6 7，7 3，82] ，k a y1.k a y5 = [ 1，2，2，3，4 ]。因为s5 = 8 2，所以最优空间合并需8 2位的空间。可由k a y5 导出本合并的方式，过程如下：因为k a y5 = 4，所以s5 是由公式（1 5 - 3）在k=4 时取得的，因而最优合并包括：段1到段( 5 - 4 ) = 1的最优合并以及段2，3，4和5的合并。最后仅剩下两个段：段1以及段2到段5的合并段。</p>
		<p>1. 递归方法</p>
		<p>用递归式（1 5 - 3）可以递归地算出si 和k a yi。程序1 5 - 3为递归式的计算代码。l，b，和k a y是一维的全局整型数组，L是段长限制（ 2 5 6），h e a d e r为段标题所需的空间( 11 )。调用S ( n )返回sn 的值且同时得出k a y值。调用Tr a c e b a c k ( k a y, n )可得到最优合并。</p>
		<p>现讨论程序1 5 - 3的复杂性。t( 0 ) =c（c 为一个常数）： （n＞0），因此利用递归的方法可得t (n) = O ( 2n )。Tr a c e b a c k的复杂性为(n)。</p>
		<p>程序15-3 递归计算s , k a y及最优合并</p>
		<p>int S(int i)</p>
		<p>{ / /返回S ( i )并计算k a y [ i ]</p>
		<p>if (i == 0 ) return 0;</p>
		<p>//k = 1时, 根据公式（ 1 5 - 3）计算最小值</p>
		<p>int lsum = l[i],bmax = b[i];</p>
		<p>int s = S(i-1) + lsum * bmax;</p>
		<p>kay[i] = 1;</p>
		<p>/ /对其余的k计算最小值并求取最小值</p>
		<p>for (int k = 2; k &lt;= i &amp;&amp; lsum+l[i-k+1] &lt;= L; k++) {</p>
		<p>lsum += l[i-k+1];</p>
		<p>if (bmax &lt; b[i-k+1]) bmax = b[i-k+1];</p>
		<p>int t = S(i-k);</p>
		<p>if (s &gt; t + lsum * bmax) {</p>
		<p>s = t + lsum * bmax;</p>
		<p>kay[i] = k;}</p>
		<p>}</p>
		<p>return s + header;</p>
		<p>}</p>
		<p>void Traceback(int kay[], int n)</p>
		<p>{// 合并段</p>
		<p>if (n == 0) return;</p>
		<p>Tr a c e b a c k ( k a y, n-kay[n]);</p>
		<p>cout &lt;&lt; "New segment begins at " &lt;&lt; (n - kay[n] + 1) &lt;&lt; endl;</p>
		<p>}</p>
		<p>2. 无重复计算的递归方法</p>
		<p>通过避免重复计算si，可将函数S的复杂性减少到(n)。注意这里只有n个不同的si。</p>
		<p>例3 - 11 再考察例1 5 - 1 0中五个段的例子。当计算s5 时，先通过递归调用来计算s4，.，s0。计算s4 时，通过递归调用计算s3，.，s0，因此s4 只计算了一次，而s3 计算了两次，每一次计算s3要计算一次s2，因此s2 共计算了四次，而s1 重复计算了1 6次！可利用一个数组s 来保存先前计算过的si 以避免重复计算。改进后的代码见程序1 5 - 4，其中s为初值为0的全局整型数组。</p>
		<p>程序15-4 避免重复计算的递归算法</p>
		<p>int S(int i)</p>
		<p>{ / /计算S ( i )和k a y [ i ]</p>
		<p>/ /避免重复计算</p>
		<p>if (i == 0) return 0;</p>
		<p>if (s[i] &gt; 0) return s[i]; //已计算完</p>
		<p>/ /计算s [ i ]</p>
		<p>/ /首先根据公式（1 5 - 3）计算k = 1时最小值</p>
		<p>int lsum = l[i], bmax = b[i];</p>
		<p>s[i] =S(i-1) + lsum * bmax;</p>
		<p>kay[i] = 1;</p>
		<p>/ /对其余的k计算最小值并更新</p>
		<p>for (int k = 2; k &lt;= i &amp;&amp; lsum+l[i-k+1] &lt;= L; k++) {</p>
		<p>lsum += l[i-k+1];</p>
		<p>if (bmax &lt; b[i-k+1]) bmax = b[i-k+1];</p>
		<p>int t = S(i-k);</p>
		<p>if (s[i] &gt; t + lsum * bmax) {</p>
		<p>s[i] = t + lsum * bmax;</p>
		<p>kay[i] = k;}</p>
		<p>}</p>
		<p>s[i] += header;</p>
		<p>return s[i];</p>
		<p>}</p>
		<p>为了确定程序1 5 - 4的时间复杂性，我们将使用分期计算模式（ amortization scheme）。在该模式中，总时间被分解为若干个不同项，通过计算各项的时间然后求和来获得总时间。当计算si 时，若sj 还未算出，则把调用S(j) 的消耗计入sj ；若sj 已算出，则把S(j) 的消耗计入si (这里sj依次把计算新sq 的消耗转移至每个sq )。程序1 5 - 4的其他消耗也被计入si。因为L是2 5 6之内的常数且每个li 至少为1，所以程序1 5 - 4的其他消耗为( 1 )，即计入每个si 的量是一个常数，且si 数目为n，因而总工作量为(n)。</p>
		<p>3. 迭代方法</p>
		<p>倘若用式（1 5 - 3）依序计算s1 , ., sn，便可得到一个复杂性为(n)的迭代方法。在该方法中，在si 计算之前， sj 必须已计算好。该方法的代码见程序1 5 - 5，其中仍利用函数Tr a c e b a c k（见程序1 5 - 3）来获得最优合并。</p>
		<p>程序15-5 迭代计算s和k a y</p>
		<p>void Vbits (int l[], int b[], int n, int s[], int kay[])</p>
		<p>{ / /计算s [ i ]和k a y [ i ]</p>
		<p>int L = 256, header = 11 ;</p>
		<p>s[0] = 0;</p>
		<p>/ /根据式（1 5 - 3）计算s [ i ]</p>
		<p>for (int i = 1; i &lt;= n; i++) {</p>
		<p>// k = 1时,计算最小值</p>
		<p>int lsum = l,</p>
		<p>bmax = b[i];</p>
		<p>s[i] = s[i-1] + lsum * bmax;</p>
		<p>kay[i] = 1;</p>
		<p>/ /对其余的k计算最小值并更新</p>
		<p>for (int k=2; k&lt;= i &amp;&amp; lsum+l[i-k+1]&lt;= L; k++) {</p>
		<p>lsum += l[i-k+1];</p>
		<p>if (bmax &lt; b[i-k+1]) bmax = b[i-k+1];</p>
		<p>if (s[i] &gt; s[i-k] + lsum * bmax){</p>
		<p>s[i] = s[i-k] + lsum * bmax;</p>
		<p>kay[i] = k; }</p>
		<p>}</p>
		<p>s[i] += header;</p>
		<p>}</p>
		<p>}</p>
		<p>
				<br />3.2.3 矩阵乘法链</p>
		<p>m×n矩阵A与n×p矩阵B相乘需耗费(m n p)的时间（见第2章练习1 6）。我们把m n p作为两个矩阵相乘所需时间的测量值。现假定要计算三个矩阵A、B和C的乘积，有两种方式计算此乘积。在第一种方式中，先用A乘以B得到矩阵D，然后D乘以C得到最终结果，这种乘法的顺序可写为(A*B) *C。第二种方式写为A* (B*C) ,道理同上。尽管这两种不同的计算顺序所得的结果相同，但时间消耗会有很大的差距。</p>
		<p>例3-12 假定A为1 0 0×1矩阵，B为1×1 0 0矩阵，C为1 0 0×1矩阵，则A*B的时间耗费为10 0 0 0，得到的结果D为1 0 0×1 0 0矩阵，再与C相乘所需的时间耗费为1 000 000，因此计算(A*B) *C的总时间为1 010 000。B*C的时间耗费为10 000，得到的中间矩阵为1×1矩阵，再与A相乘的时间消耗为1 0 0，因而计算A*（B*C）的时间耗费竟只有10 100！而且，计算（ A*B）*C时，还需10 000个单元来存储A*B，而A*（B*C）计算过程中，只需用1个单元来存储B*C。</p>
		<p>下面举一个得益于选择合适秩序计算A*B*C矩阵的实例：考虑两个3维图像的匹配。图像匹配问题的要求是，确定一个图像需旋转、平移和缩放多少次才能逼近另一个图像。实现匹配的方法之一便是执行约1 0 0次迭代计算，每次迭代需计算1 2×1个向量T：</p>
		<p>T=?A(x, y, z) *B(x, y, z)*C(x, y, z )</p>
		<p>其中A，B和C分别为1 2×3，3×3和3×1矩阵。(x , y, z) 为矩阵中向量的坐标。设t 表示计算A(x , y, z) *B(x , y, z) *C(x , y, z)的计算量。假定此图像含2 5 6×2 5 6×2 5 6个向量，在此条件中，这1 0 0个迭代所需的总计算量近似为1 0 0 * 2 5 63 * t≈1 . 7 * 1 09 t。若三个矩阵是按由左向右的顺序相乘的，则t = 1 2 * 3 * 3 + 1 2 * 3 *1= 1 4 4；但如果从右向左相乘， t = 3 * 3 * 1 + 1 2 * 3 * 1 = 4 5。由左至右计算约需2 . 4 * 1 011个操作，而由右至左计算大概只需7 . 5 * 1 01 0个操作。假如使用一个每秒可执行1亿次操作的计算机，由左至右需4 0分钟，而由右至左只需1 2 . 5分钟。</p>
		<p>在计算矩阵运算A*B*C时，仅有两种乘法顺序（由左至右或由右至左），所以可以很容易算出每种顺序所需要的操作数，并选择操作数比较少的那种乘法顺序。但对于更多矩阵相乘来说，情况要复杂得多。如计算矩阵乘积M1×M2×.×Mq，其中Mi 是一个ri×ri + 1 矩阵( 1≤i≤q)。不妨考虑q=4 的情况，此时矩阵运算A*B*C*D可按以下方式（顺序）计算：</p>
		<p>A* ( (B*C) *D) A* (B* (C*D)) (A*B) * (C*D) (A* (B*C) ) *D</p>
		<p>不难看出计算的方法数会随q 以指数级增加。因此，对于很大的q 来说，考虑每一种计算顺序并选择最优者已是不切实际的。</p>
		<p>现在要介绍一种采用动态规划方法获得矩阵乘法次序的最优策略。这种方法可将算法的时间消耗降为(q3 )。用Mi j 表示链Mi×.×Mj （i≤j）的乘积。设c(i,j) 为用最优法计算Mi j 的消耗，k a y(i, j) 为用最优法计算Mi j 的最后一步Mi k×Mk+1, j 的消耗。因此Mij 的最优算法包括如何用最优算法计算Mik 和Mkj 以及计算Mik×Mkj 。根据最优原理，可得到如下的动态规划递归式：k a y(i,i+s)= 获得上述最小值的k. 以上求c 的递归式可用递归或迭代的方法来求解。c( 1，q) 为用最优法计算矩阵链的消耗，k a y( 1 ,q) 为最后一步的消耗。其余的乘积可由k a y值来确定。</p>
		<p>1. 递归方法</p>
		<p>与求解0 / 1背包及图像压缩问题一样，本递归方法也须避免重复计算c (i, j) 和k a y(i, j)，否则算法的复杂性将会非常高。</p>
		<p>例3-13 设q= 5和r =（1 0 , 5 , 1 , 1 0 , 2 , 1 0），式中待求的c 中有四个c的s= 0或1，因此用动态规划方法可立即求得它们的值： c( 1 , 1 ) =c( 5 , 5 ) = 0 ;c(1,2)=50; c( 4 , 5 ) = 2 0 0。现计算C( 2，5 )：c( 2 , 5 ) = m i n {c( 2 , 2 ) +c(3,5)+50, c( 2 , 3 ) +c(4,5)+500, c( 2 , 4 ) +c( 5 , 5 ) + 1 0 0 } （1 5 - 5）其中c( 2 , 2 ) =c( 5 , 5 ) = 0；c( 2 , 3 ) = 5 0；c(4,5)=200 。再用递归式计算c( 3 , 5 )及c( 2 , 4 ) :c( 3 , 5 ) = m i n {c( 3 , 3 ) +c(4,5)+100, c( 3 , 4 ) +c( 5 , 5 ) + 2 0 } = m i n { 0 + 2 0 0 + 1 0 0 , 2 0 + 0 + 2 0 } = 4 0c( 2 , 4 ) = m i n {c( 2 , 2 ) +c( 3 , 4 ) + 1 0 ,c( 2 , 3 ) +c( 4 , 4 ) + 1 0 0 } = m i n { 0 + 2 0 + 1 0 , 5 0 + 1 0 + 2 0 } = 3 0由以上计算还可得k a y( 3 , 5 ) = 4，k ay( 2 , 4 ) = 2。现在,计算c(2,5) 所需的所有中间值都已求得，将它们代入式（1 5 - 5）得：</p>
		<p>c(2,5)=min{0+40+50, 50+200+500, 30+0+100}=90且k a y( 2 , 5 ) = 2</p>
		<p>再用式（1 5 - 4）计算c( 1 , 5 )，在此之前必须算出c( 3 , 5 )、c(1,3) 和c( 1 , 4 )。同上述过程，亦可计算出它们的值分别为4 0、1 5 0和9 0，相应的k a y 值分别为4、2和2。代入式（1 5 - 4）得：</p>
		<p>c(1,5)=min{0+90+500, 50+40+100, 150+200+1000, 90+0+200}=190且k a y( 1 , 5 ) = 2</p>
		<p>此最优乘法算法的消耗为1 9 0，由k a y(1,5) 值可推出该算法的最后一步， k a y(1,5) 等于2，因此最后一步为M1 2×M3 5，而M12 和M35 都是用最优法计算而来。由k a y( 1 , 2 ) = 1知M12 等于M11×M2 2，同理由k a y( 3 , 5) = 4得知M35 由M3 4×M55 算出。依此类推，M34 由M3 3×M44 得出。因而此最优乘法算法的步骤为：</p>
		<p>M11×M2 2 = M1 2</p>
		<p>M3 3×M4 4 = M3 4</p>
		<p>M3 4×M5 5 = M3 5</p>
		<p>M1 2×M3 5 = M1 5</p>
		<p>计算c(i, j) 和k a y (i, j) 的递归代码见程序1 5 - 6。在函数C中，r 为全局一维数组变量， k a y是全局二维数组变量，函数C返回c(i j) 之值且置k a y [a] [b] =k ay (a , b) (对于任何a , b)，其中c(a , b)在计算c(i,j) 时皆已算出。函数Traceback 利用函数C中已算出的k a y值来推导出最优乘法算法的步骤。</p>
		<p>设t(q)为函数C的复杂性，其中q=j-i+ 1（即Mij 是q个矩阵运算的结果）。当q为1或2时，t(q) =d，其中d 为一常数；而q&gt; 2时，t (q)=2q-1?k = 1t (k ) +e q，其中e 是一个常量。因此当q＞2时，t(q)＞2t (q- 1 ) +e，所以t (q)= W ( 2q)。函数Traceback 的复杂性为(q)。</p>
		<p>程序15-6 递归计算c (i, j) 和kay (i, j)</p>
		<p>int C(int i, int j)</p>
		<p>{ / /返回c(i,j) 且计算k(i,j) = kay[i][j]</p>
		<p>if (i==j) return 0; //一个矩阵的情形</p>
		<p>if (i == j-1) { //两个矩阵的情形</p>
		<p>kay[i][i+1] = i;</p>
		<p>return r[i]*r[i+1]*r[r+2];}</p>
		<p>/ /多于两个矩阵的情形</p>
		<p>/ /设u为k = i 时的最小值</p>
		<p>int u = C(i,i) + C(i+1,j) + r[i]*r[i+1]*r[j+1];</p>
		<p>kay[i][j] = i;</p>
		<p>/ /计算其余的最小值并更新u</p>
		<p>for (int k = i+1; k &lt; j; k++) {</p>
		<p>int t = C(i,k) + C(k+1,j) + r[i]*r[k+1]*r[j+1];</p>
		<p>if (r &lt; u) {//小于最小值的情形</p>
		<p>u = t;</p>
		<p>kay[i][j] = k;</p>
		<p>}</p>
		<p>return u;</p>
		<p>}</p>
		<p>void Traceback (int i, int j ,int **kay)</p>
		<p>{ / /输出计算Mi j 的最优方法</p>
		<p>if ( i == j) return;</p>
		<p>Traceback(i, kay[i][j], kay);</p>
		<p>Traceback(kay[i][j]+1, j, kay);</p>
		<p>cout &lt;&lt; "Multiply M" &lt;&lt; i &lt;&lt; ", "&lt;&lt; kay[i][j];</p>
		<p>cout &lt;&lt; " and M " &lt;&lt; (kay[i][j]+1) &lt;&lt; ", " &lt;&lt; j &lt;&lt; end1;</p>
		<p>}</p>
		<p>2. 无重复计算的递归方法</p>
		<p>若避免再次计算前面已经计算过的c（及相应的k a y），可将复杂性降低到（q3）。而为了避免重复计算，需用一个全局数组c[ ][ ]存储c(i, j) 值，该数组初始值为0。函数C的新代码见程序1 5 - 7：</p>
		<p>程序15-7 无重复计算的c (i, j) 计算方法</p>
		<p>int C(int i,int j)</p>
		<p>{ / /返回c(i,j) 并计算k a y ( i , j ) = k a y [ I ] [ j ]</p>
		<p>/ /避免重复计算</p>
		<p>/ /检查是否已计算过</p>
		<p>if （c[i][j] &gt;） return c[i][j];</p>
		<p>/ /若未计算,则进行计算</p>
		<p>if(i==j) return 0; //一个矩阵的情形</p>
		<p>i f ( i = = j - 1 ) { / /两个矩阵的情形</p>
		<p>kay[i][i+1]=i;</p>
		<p>c [ i ] [ j ] = r [ i ] * r [ i + 1 ] * r [ i + 2 ] ;</p>
		<p>return c[i][j];}</p>
		<p>/ /多于两个矩阵的情形</p>
		<p>/ /设u为k = i 时的最小值</p>
		<p>int u=C(i,i)+C(i+1,j)+r[i]*r[i+1]*r[j+1];</p>
		<p>k a y [ i ] [ j ] = i ;</p>
		<p>/ /计算其余的最小值并更新u</p>
		<p>for (int k==i+1; k&lt;j;k++){</p>
		<p>int t=C(i,k)+C(k+1,j)+r[i]*r[k+1]*r[j+1];</p>
		<p>if (t&lt;u) {// 比最小值还小</p>
		<p>u = t ;</p>
		<p>k a y [ i ] [ j ] = k ; }</p>
		<p>}</p>
		<p>c [ i ] [ j ] = u ;</p>
		<p>return u;</p>
		<p>}</p>
		<p>为分析改进后函数C 的复杂性，再次使用分期计算方法。注意到调用C(1, q) 时每个c (i, j)（1≤i≤j≤q）仅被计算一次。要计算尚未计算过的c(a,b)，需附加的工作量s =j-i＞1。将s 计入第一次计算c (a, b) 时的工作量中。在依次计算c(a, b) 时，这个s 会转计到每个c (a, b) 的第一次计算时间c 中，因此每个c (i, i) 均被计入s。对于每个s，有q-s+ 1个c(i, j) 需要计算，因此总的工作消耗为q-1 ?s=1(q-s+ 1) = (q3 )。</p>
		<p>3. 迭代方法</p>
		<p>c 的动态规划递归式可用迭代的方法来求解。若按s = 2，3，.，q-1 的顺序计算c (i, i+s)，每个c 和kay 仅需计算一次。</p>
		<p>例3-14 考察例3 - 1 3中五个矩阵的情况。先初始化c (i, i) (0≤i≤5) 为0，然后对于i=1, ., 4分别计算c (i, i+ 1 )。c (1, 2)= r1 r2 r3 = 5 0，c (2, 3)= 5 0，c ( 3,4)=20 和c (4, 5) = 2 0 0。相应的k ay 值分别为1，2，3和4。</p>
		<p>当s= 2时，可得：</p>
		<p>c( 1 , 3 ) = m i n {c( 1 , 1 ) +c(2,3)+ r1 r2 r4 , c( 1 , 2 ) +c( 3 ,3 )+r1r3r4 }=min</p>
		<p>=150</p>
		<p>且k a y( 1 , 3 ) = 2。用相同方法可求得c( 2 , 4 )和c( 3 , 5 )分别为3 0和4 0，相应k a y值分别为2和3。</p>
		<p>当s= 3时，需计算c(1,4) 和c( 2 , 5 )。计算c(2,5) 所需要的所有中间值均已知(见( 1 5 - 5 )式)，代入计算公式后可得c( 2 , 5 ) = 9 0，k a y( 2 , 5 ) = 2。c( 1 , 4 )可用同样的公式计算。最后，当s= 4时，可直接用（1 5 - 4）式来计算c( 1 , 5 )，因为该式右边所有项都已知。 </p>
		<p>计算c 和kay 的迭代程序见函数M a t r i x C h a i n（见程序1 5 - 8），该函数的复杂性为(q3 )。计算出kay 后同样可用程序1 5 - 6中的Traceback 函数推算出相应的最优乘法计算过程。</p>
		<p>程序15-8 c 和kay 的迭代计算</p>
		<p>void MatrixChain(int r[], int q, int **c, int **kay)</p>
		<p>{// 为所有的Mij 计算耗费和k a y</p>
		<p>// 初始化c[i][i], c[i][i+1]和k a y [ i ] [ i + 1 ]</p>
		<p>for (int i = 1; i &lt; q; i++) {</p>
		<p>c[i][i] = 0;</p>
		<p>c[i][i+1] = r[i]*r[i+1]*r[i+2];</p>
		<p>kay[i][i+1] = i;</p>
		<p>}</p>
		<p>c[q][q] = 0;</p>
		<p>/ /计算余下的c和k a y</p>
		<p>for (int s = 2; s &lt; q; s++)</p>
		<p>for (int i = 1; i &lt;= q - s; i++) {</p>
		<p>// k = i时的最小项</p>
		<p>c[i][i+s] = c[i][i] + c[i+1][i+s] + r[i]*r[i+1]*r[i+s+1];</p>
		<p>kay[i][i+s] = i;</p>
		<p>// 余下的最小项</p>
		<p>for (int k = i+1; k &lt; i + s; k++) {</p>
		<p>int t = c[i][k] + c[k+1][i+s] + r[i]*r[k+1]*r[i+s+1];</p>
		<p>if (t &lt; c[i][i+s]) {// 更小的最小项</p>
		<p>c[i][i+s] = t;</p>
		<p>kay[i][i+s] = k;}</p>
		<p>}</p>
		<p>}</p>
		<p>}</p>
		<p>3.2.4 最短路径</p>
		<p>假设G为有向图，其中每条边都有一个长度（或耗费），图中每条有向路径的长度等于该路径中各边的长度之和。对于每对顶点(i, j)，在顶点i 与j 之间可能有多条路径，各路径的长度可能各不相同。我们定义从i 到j 的所有路径中，具有最小长度的路径为从i 到j 的最短路径。</p>
		<p>例3-15 如图1 5 - 4所示。从顶点1到顶点3的路径有</p>
		<p>1) 1,2,5,3</p>
		<p>2) 1,4,3</p>
		<p>3) 1,2,5,8,6,3</p>
		<p>4) 1,4,6,3</p>
		<p>由该图可知,各路径相应的长度为1 0、2 8、9、2 7，因而路径3) 是该图中顶点1到顶点3的最短路径。</p>
		<p>在所有点对最短路径问题（ a l l - p a i r sshorest-paths problem）中，要寻找有向图G中每对顶点之间的最短路径。也就是说，对于每对顶点(i, j)，需要寻找从i到j 的最短路径及从j 到i 的最短路径。因此对于一个n 个顶点的图来说，需寻找p =n(n-1) 条最短路径。假定图G中不含有长度为负数的环路，只有在这种假设下才可保证G中每对顶点(i, j) 之间总有一条不含环路的最短路径。当有向图中存在长度小于0的环路时，可能得到长度为－∞的更短路径，因为包含该环路的最短路径往往可无限多次地加上此负长度的环路。</p>
		<p>设图G中n 个顶点的编号为1到n。令c (i, j, k)表示从i 到j 的最短路径的长度，其中k 表示该路径中的最大顶点。因此，如果G中包含边&lt;i, j&gt;，则c(i, j, 0) =边&lt;i, j&gt; 的长度；若i= j ，则c(i,j, 0)=0；如果G中不包含边&lt;i, j&gt;，则c (i, j, 0)= +∞。c(i, j, n) 则是从i 到j 的最短路径的长度。</p>
		<p>例3-16 考察图1 5 - 4。若k=0, 1, 2, 3，则c (1, 3, k)= ∞；c (1, 3, 4)= 2 8；若k = 5, 6, 7，则c (1, 3,k) = 1 0；若k=8, 9, 10，则c (1, 3, k) = 9。因此1到3的最短路径长度为9。对于任意k＞0，如何确定c (i, j, k) 呢？中间顶点不超过k 的i 到j 的最短路径有两种可能：该路径含或不含中间顶点k。若不含，则该路径长度应为c(i, j, k- 1 )，否则长度为c(i, k, k- 1) +c (k, j, k- 1 )。c(i, j, k) 可取两者中的最小值。因此可得到如下递归式：</p>
		<p>c( i, j, k)= m i n {c(i, j, k-1), c (i, k, k- 1) +c (k, j, k- 1 ) }，k＞0</p>
		<p>以上的递归公式将一个k 级运算转化为多个k-1 级运算，而多个k-1 级运算应比一个k 级运算简单。如果用递归方法求解上式，则计算最终结果的复杂性将无法估量。令t (k) 为递归求解c (i, j, k) 的时间。根据递归式可以看出t(k) = 2t(k- 1 ) +c。利用替代方法可得t(n) = ( 2n )。因此得到所有c (i, j, n) 的时间为(n2 2n )。</p>
		<p>当注意到某些c (i, j, k-1) 值可能被使用多次时，可以更高效地求解c (i, j, n)。利用避免重复计算c(i, j, k) 的方法，可将计算c 值的时间减少到(n3 )。这可通过递归方式（见程序1 5 - 7矩阵链问题）或迭代方式来实现。出迭代算法的伪代码如图1 5 - 5所示。</p>
		<p> </p>
		<p>/ /寻找最短路径的长度</p>
		<p>/ /初始化c（i，j，1）</p>
		<p>for （int i=1； i &lt; = n ; i + +）</p>
		<p>for (int j=1; j&lt;=n; j+ + )</p>
		<p>c ( i ,j, 0 ) = a ( i ,j); // a 是长度邻接矩阵</p>
		<p>/ /计算c ( i ,j, k ) ( 0 &lt; k &lt; = n )</p>
		<p>for(int k=1;k&lt;=n;k++)</p>
		<p>for (int i=1;i&lt;=n;i++)</p>
		<p>for (int j= 1 ;j&lt; = n ;j+ + )</p>
		<p>if (c(i,k,k-1)+c(k,j, k - 1 ) &lt; c ( i ,j, k - 1 ) )</p>
		<p>c ( i ,j, k ) = c ( i , k , k - 1 ) + c ( k ,j, k - 1 ) ;</p>
		<p>else c(i,j, k ) = c ( i ,j, k - 1 ) ;</p>
		<p>图15-5 最短路径算法的伪代码</p>
		<p> </p>
		<p>注意到对于任意i，c(i,k,k) =c(i,k,k- 1 )且c(k,i,k) =c(k,i,k- 1 )，因而，若用c(i,j)代替图1 5 - 5的c(i,j,k)，最后所得的c(i,j) 之值将等于c(i,j,n) 值。此时图1 5 - 5可改写成程序1 5 - 9的C + +代码。程序1 5 - 9中还利用了程序1 2 - 1中定义的AdjacencyWDigraph 类。函数AllPairs 在c 中返回最短路径的长度。若i 到j 无通路，则c [i] [j]被赋值为N o E d g e。函数AllPairs 同时计算了k a y [ i ] [ j ]，其中kay[i][j] 表示从i 到j 的最短路径中最大的k 值。在后面将看到如何根据kay 值来推断出从一个顶点到另一顶点的最短路径（见程序1 5 - 1 0中的函数O u t p u t P a t h）。</p>
		<p>程序1 5 - 9的时间复杂性为(n3 )，其中输出一条最短路径的实际时间为O (n)。</p>
		<p>程序15-9 c 和kay 的计算</p>
		<p>template&lt;class T&gt;</p>
		<p>void AdjacencyWDigraph&lt;T&gt;::Allpairs(T **c, int **kay)</p>
		<p>{ / /所有点对的最短路径</p>
		<p>/ /对于所有i和j，计算c [ i ] [ j ]和k a y [ i ] [ j ]</p>
		<p>/ /初始化c [ i ] [ j ] = c（i，j，0）</p>
		<p>for (int i = 1; i &lt;= n; i++)</p>
		<p>for (int j = 1; j &lt;= n; j++) {</p>
		<p>c[i][j] = a[i][j];</p>
		<p>kay[i][j] = 0;</p>
		<p>}</p>
		<p>for (i = 1; i &lt;= n; i++)</p>
		<p>c[i][i] = 0;</p>
		<p>// 计算c[i][j] = c(i,j,k)</p>
		<p>for (int k = 1; k &lt;= n; k++)</p>
		<p>for (int i = 1; i &lt;= n; i++)</p>
		<p>for (int j = 1; j &lt;= n; j++) {</p>
		<p>T t1 = c[i][k];</p>
		<p>T t2 = c[k][j];</p>
		<p>T t3 = c[i][j];</p>
		<p>if (t1 != NoEdge &amp;&amp; t2 != NoEdge &amp;&amp; (t3 == NoEdge || t1 + t2 &lt; t3)) {</p>
		<p>c[i][j] = t1 + t2;</p>
		<p>kay[i][j] = k;}</p>
		<p>}</p>
		<p>}</p>
		<p>程序15-10 输出最短路径</p>
		<p>void outputPath(int **kay, int i, int j)</p>
		<p>{// 输出i 到j 的路径的实际代码</p>
		<p>if (i == j) return;</p>
		<p>if (kay[i][j] == 0) cout &lt;&lt; j &lt;&lt; ' ';</p>
		<p>else {outputPath(kay, i, kay[i][j]);</p>
		<p>o u t p u t P a t h ( k a y, kay[i][j], j);}</p>
		<p>}</p>
		<p>template&lt;class T&gt;</p>
		<p>void OutputPath(T **c, int **kay, T NoEdge, int i, int j)</p>
		<p>{// 输出从i 到j的最短路径</p>
		<p>if (c[i][j] == NoEdge) {</p>
		<p>cout &lt;&lt; "There is no path from " &lt;&lt; i &lt;&lt; " to " &lt;&lt; j &lt;&lt; endl;</p>
		<p>r e t u r n ; }</p>
		<p>cout &lt;&lt; "The path is" &lt;&lt; endl;</p>
		<p>cout &lt;&lt; i &lt;&lt; ' ';</p>
		<p>o u t p u t P a t h ( k a y, i , j ) ;</p>
		<p>cout &lt;&lt; endl;</p>
		<p>}</p>
		<p>例3-17 图15-6a 给出某图的长度矩阵a，15-6b 给出由程序1 5 - 9所计算出的c 矩阵，15-6c 为对应的k a y值。根据15-6c 中的kay 值，可知从1到5的最短路径是从1到k a y [ 1 ] [ 5 ] = 4的最短路径再加上从4到5的最短路径，因为k a y [ 4 ] [ 5 ] = 0，所以从4到5的最短路径无中间顶点。从1到4的最短路径经过k a y [ 1 ] [ 4 ] = 3。重复以上过程，最后可得1到5的最短路径为：1，2，3，4，5。</p>
		<p>3.2.5 网络的无交叉子集</p>
		<p>在11 . 5 . 3节的交叉分布问题中，给定一个每边带n 个针脚的布线通道和一个排列C。顶部的针脚i 与底部的针脚Ci 相连，其中1≤i≤n，数对(i, Ci ) 称为网组。总共有n 个网组需连接或连通。假设有两个或更多的布线层，其中有一个为优先层，在优先层中可以使用更细的连线，其电阻也可能比其他层要小得多。布线时应尽可能在优先层中布设更多的网组。而剩下的其他网组将布设在其他层。当且仅当两个网组之间不交叉时，它们可布设在同一层。我们的任务是寻找一个最大无交叉子集（Maximum Noncrossing Su b s e t，M N S )。在该集中，任意两个网组都不交叉。因(i, Ci ) 完全由i 决定，因此可用i 来指定(i, Ci )。</p>
		<p>例3-18 考察图1 5 - 7（对应于图1 0 - 1 7）。( 1 , 8 )和( 2 , 7 )（也即1号网组和2号网组）交叉，因而不能布设在同一层中。而( 1 , 8 )，(7,9) 和(9,10) 未交叉，因此可布设在同一层。但这3个网组并不能构成一个M N S，因为还有更大的不交叉子集。图1 0 - 1 7中给出的例子中，集合｛ ( 4 , 2 ) ,( 5 , 5 ) , ( 7 , 9 ) , ( 9 , 1 0 )｝是一个含4个网组的M N S。</p>
		<p>设M N S(i, j) 代表一个M N S，其中所有的(u, Cu ) 满足u≤i，Cu≤j。令s i z e(i,j) 表示M N S(i,j)的大小(即网组的数目)。显然M N S(n,n)是对应于给定输入的M N S，而s i z e(n,n)是它的大小。</p>
		<p>例3-19 对于图1 0 - 1 7中的例子，M N S( 1 0 , 1 0 )是我们要找的最终结果。如例3 - 1 8中所指出的，s i z e( 1 0 , 1 0 ) = 4，因为( 1 , 8 )，( 2 , 7 )，( 7 , 9 )，( 8 , 3 )，( 9 , 1 0 )和( 1 0 , 6 )中要么顶部针脚编号比7大，要么底部针脚编号比6大，因此它们都不属于M N S( 7 , 6 )。因此只需考察剩下的4个网组是否属于M N S( 7 , 6 )，如图1 5 - 8所示。子集｛( 3 , 4 ) , ( 5 , 5 )｝是大小为2的无交叉子集。没有大小为3的无交叉子集，因此s i z e( 7 , 6) = 2。</p>
		<p>当i= 1时，( 1 ,C1) 是M N S( 1 ,j) 的唯一候选。仅当j≥C1 时，这个网组才会是M N S( 1 ,j) 的一个成员. </p>
		<p>下一步，考虑i＞1时的情况。若j＜Ci，则(i,Ci ) 不可能是M N S( i,j) 的成员，所有属于M N S(i,j) 的(u, Cu ) 都需满足u＜i且Cu＜j，因此：s i z e(i,j) =s i z e(i- 1 ,j), j&lt;Ci （1 5 - 7）</p>
		<p>若j≥Ci，则(i,Ci ) 可能在也可能不在M N S(i,j) 内。若(i,Ci ) 在M N S(i,j) 内，则在M N S(i,j)中不会有这样的(u,Cu )：u＜i且Cu＞Ci，因为这个网组必与(i, Ci ) 相交。因此M N S(i,j) 中的其他所有成员都必须满足条件u＜i且Cu＜Ci。在M N S(i,j) 中这样的网组共有Mi- 1 , Ci- 1 个。若(i,Ci ) 不在M N S(i,j)中，则M N S(i,j) 中的所有(u, Cu ) 必须满足u＜i；因此s i z e(i,j)=s i z e(i- 1 ,j)。虽然不能确定(i, Ci )是否在M N S(i,j) 中，但我们可以根据获取更大M N S的原则来作出选择。因此：s i z e(i,j) = m a x {s i z e(i-1 ,j), s i z e(i- 1 ,Ci-1)+1}, j≥Ci （1 5 - 8）</p>
		<p>虽然从（1 5 - 6）式到（ 1 5 - 8）式可用递归法求解，但从前面的例子可以看出，即使避免了重复计算，动态规划递归算法的效率也不够高，因此只考虑迭代方法。在迭代过程中先用式（1 5 - 6）计算出s i ze ( 1 ,j)，然后再用式（1 5 - 7）和（1 5 - 8）按i=2, 3, ., n 的顺序计算s i ze (i,j)，最后再用Traceback 来得到M N S(n, n) 中的所有网组。</p>
		<p>例3-20 图1 5 - 9给出了图1 5 - 7对应的s i z e(i,j) 值。因s i z e( 1 0 , 1 0) = 4，可知M N S含4个网组。为求得这4个网组，先从s i ze ( 1 0 , 1 0 )入手。可用（1 5 - 8）式算出s i z e( 1 0 , 1 0 )。根据式（1 5 - 8）时的产生原因可知s i ze ( 1 0 , 1 0)=s i z e( 9 , 1 0 )，因此现在要求M NS ( 9 , 1 0 )。由于M NS ( 1 0 , 1 0 )≠s i z e( 8 , 1 0 )，因此M NS (9,10) 中必包含9号网组。M N S(9,10) 中剩下的网组组成M NS ( 8 , C9- 1)=M N S( 8 , 9 )。由M N S( 8 , 9 ) =M NS (7,9) 知，8号网组可以被排除。接下来要求M N S( 7 , 9 )，因为s i z e( 7 , 9 )≠s i z e( 6 , 9 )，所以M N S中必含7号网组。M NS (7,9) 中余下的网组组成M NS ( 6 , C7- 1 ) =M N S( 6 , 8 )。根据s i z e( 6 , 8 ) =s i z e( 5 , 8 )可排除6号网组。按同样的方法， 5号网组，3号网组加入M N S中，而4号网组等其他网组被排除。因此回溯过程所得到的大小为4的M N S为{ 3 , 5 , 7 , 9 }。</p>
		<p>注意到在回溯过程中未用到s i z e( 1 0 ,j) (j≠1 0 )，因此不必计算这些值。</p>
		<p>程序1 5 - 11给出了计算s i z e ( i , j ) 的迭代代码和输出M N S的代码。函数M N S用来计算s i ze (i,j) 的值，计算结果用一个二维数组M N来存储。size[i][j] 表示s i z e(i,j)，其中i=j= n 或1≤i＜n，0≤j≤n，计算过程的时间复杂性为(n2 )。函数Traceback 在N et［0 : m - 1］中输出所得到的M N S，其时间复杂性为(n)。因此求解M M S问题的动态规划算法的总的时间复杂性</p>
		<p>为(n2 )。</p>
		<p>程序1 5 - 11 寻找最大无交叉子集</p>
		<p>void MNS(int C[], int n, int **size)</p>
		<p>{ / /对于所有的i 和j，计算s i z e [ i ] [ j ]</p>
		<p>/ /初始化s i z e [ 1 ] [ * ]</p>
		<p>for (int j = 0; j &lt; C[1]; j++)</p>
		<p>size[1][j] = 0;</p>
		<p>for (j = C[1]; j &lt;= n; j++)</p>
		<p>size[1][j] = 1;</p>
		<p>// 计算size[i][*], 1 &lt; i &lt; n</p>
		<p>for (int i = 2; i &lt; n; i++) {</p>
		<p>for (int j = 0; j &lt; C[i]; j++)</p>
		<p>size[i][j] = size[i-1][j];</p>
		<p>for (j = C[i]; j &lt;= n; j++)</p>
		<p>size[i][j] = max(size[i-1][j], size[i-1][C[i]-1]+1);</p>
		<p>}</p>
		<p>size[n][n] = max(size[n-1][n], size[n-1][C[n]-1]+1);</p>
		<p>}</p>
		<p>void Traceback(int C[], int **size, int n, int Net[], int&amp; m)</p>
		<p>{// 在N e t [ 0 : m - 1 ]中返回M M S</p>
		<p>int j = n; // 所允许的底部最大针脚编号</p>
		<p>m = 0; // 网组的游标</p>
		<p>for (int i = n; i &gt; 1; i--)</p>
		<p>// i 号n e t在M N S中?</p>
		<p>if (size[i][j] != size[i-1][j]){// 在M N S中</p>
		<p>Net[m++] = i;</p>
		<p>j = C[i] - 1;}</p>
		<p>// 1号网组在M N S中?</p>
		<p>if (j &gt;= C[1])</p>
		<p>Net[m++] = 1; // 在M N S中</p>
		<p>}</p>
		<p>3.2.6 元件折叠</p>
		<p>在设计电路的过程中，工程师们会采取多种不同的设计风格。其中的两种为位－片设计（bit-slice design）和标准单元设计（standard-cell design）。在前一种方法中，电路首先被设计为一个元件栈（如图15-10a 所示）。每个元件Ci 宽为wi ，高为hi ，而元件宽度用片数来表示。图15-10a 给出了一个四片的设计。线路是按片来连接各元件的，即连线可能连接元件Ci 的第j片到元件Ci+1 的第j 片。如果某些元件的宽度不足j 片，则这些元件之间不存在片j 的连线。当图1 5 -10a 的位－片设计作为某一大系统的一部分时，则在V L SI ( Very Large Scale Integrated) 芯片上为它分配一定数量的空间单元。分配是按空间宽度或高度的限制来完成的。现在的问题便是如何将元件栈折叠到分配空间中去，以便尽量减小未受限制的尺度（如，若高度限制为H时，必须折叠栈以尽量减小宽度W）。由于其他尺度不变，因此缩小一个尺度（如W）等价于缩小面积。可用折线方式来折叠元件栈，在每一折叠点，元件旋转1 8 0°。在图15-10b 的例子中，一个1 2元件的栈折叠成四个垂直栈，折叠点为C6 , C9 和C1 0。折叠栈的宽度是宽度最大的元件所需的片数。在图15-10b 中，栈宽各为4，3，2和4。折叠栈的高度等于各栈所有元件高度之和的最大值。在图15-10b 中栈1的元件高度之和最大，该栈的高度决定了包围所有栈的矩形高度。</p>
		<p>实际上，在元件折叠问题中，还需考虑连接两个栈的线路所需的附加空间。如，在图1 5 -10b 中C5 和C6 间的线路因C6 为折叠点而弯曲。这些线路要求在C5 和C6 之下留有垂直空间，以便能从栈1连到栈2。令ri 为Ci 是折叠点时所需的高度。栈1所需的高度为5 ?i =1hi +r6，栈2所需高度为8 ?i=6hi +r6+r9。</p>
		<p>在标准单元设计中，电路首先被设计成为具有相同高度的符合线性顺序的元件排列。假设此线性顺序中的元件为C1，.，Cn，下一步元件被折叠成如图1 5 - 11所示的相同宽度的行。在此图中， 1 2个标准单元折叠成四个等宽行。折叠点是C4，C6 和C11。在相邻标准单元行之间，使用布线通道来连接不同的行。折叠点决定了所需布线通道的高度。设li 表示当Ci 为折叠点时所需的通道高度。在图1 5 - 11的例子中，布线通道1的高度为l4，通道2的高度为l6，通道3的高度为l11。位－片栈折叠和标准单元折叠都会引出一系列的问题，这些问题可用动态规划方法来解决。</p>
		<p>1. 等宽位－片元件折叠</p>
		<p>定义r1 = rn+1 =0。由元件Ci 至Cj 构成的栈的高度要求为j ?k= ilk+ ri+ rj + 1。设一个位－片设计中所有元件有相同宽度W。首先考察在折叠矩形的高度H给定的情况下，如何缩小其宽度。设Wi</p>
		<p>为将元件Ci 到Cn 折叠到高为H的矩形时的最小宽度。若折叠不能实现（如当ri +hi＞H时），取Wi =∞。注意到W1 可能是所有n 个元件的最佳折叠宽度。</p>
		<p>当折叠Ci 到Cn 时，需要确定折叠点。现假定折叠点是按栈左到栈右的顺序来取定的。若第一点定为Ck+ 1，则Ci 到Ck 在第一个栈中。为了得到最小宽度，从Ck+1 到Cn 的折叠必须用最优化方法，因此又将用到最优原理，可用动态规划方法来解决此问题。当第一个折叠点k+ 1已知时，可得到以下公式：</p>
		<p>Wi =w+ Wk + 1 （1 5 - 9）</p>
		<p>由于不知道第一个折叠点，因此需要尝试所有可行的折叠点，并选择满足（ 1 5 - 9）式的折叠点。令h s u m(i,k)=k ?j = ihj。因k+ 1是一个可行的折叠点，因此h s u m(i, k) +ri +rk+1 一定不会超过H。</p>
		<p>根据上述分析，可得到以下动态规划递归式：</p>
		<p>这里Wn+1 =0，且在无最优折叠点k+ 1时Wi 为∞。利用递归式（1 5 - 1 0），可通过递归计算Wn , Wn- 1., W2 , W1 来计算Wi。Wi 的计算需要至多检查n-i+ 1个Wk+ 1，耗时为O (n-k)。因此计算所有Wi 的时间为O (n2 )。通过保留式（1 5 - 1 0）每次所得的k 值，可回溯地计算出各个最优的折叠点，其时间耗费为O (n)。</p>
		<p>现在来考察另外一个有关等宽元件的折叠问题：折叠后矩形的宽度W已知，需要尽量减小其高度。因每个折叠矩形宽为w，因此折叠后栈的最大数量为s=W / w。令Hi, j 为Ci , ., Cn 折叠成一宽度为jw 的矩形后的最小高度， H1, s 则是所有元件折叠后的最小高度。当j= 1时，不允许任何折叠，因此：Hi,1 =h s u m(i,n) +ri , 1≤i≤n</p>
		<p>另外，当i=n 时，仅有一个元件，也不可能折叠，因此：Hn ,j=hn+rn , 1≤j≤s</p>
		<p>在其他情况下，都可以进行元件折叠。如果第一个折叠点为k+ 1，则第一个栈的高度为</p>
		<p>h s u m(i,k) +ri +rk+ 1。其他元件必须以至多(j- 1 ) *w 的宽度折叠。为保证该折叠的最优性，其他元件也需以最小高度进行折叠.</p>
		<p>因为第一个折叠点未知，因此必须尝试所有可能的折叠点，然后从中找出一个使式（1 5 - 11）的右侧取最小值的点，该点成为第一个折叠点。</p>
		<p>可用迭代法来求解Hi, j ( 1≤i≤n, 1≤j≤s)，求解的顺序为：先计算j=2 时的H i, j，再算j= 3，.，以此类推。对应每个j 的Hi, j 的计算时间为O (n2 )，所以计算所有H i, j 的时间为O(s n2 )。通过保存由（ 1 5 - 1 2）式计算出的每个k 值，可以采用复杂性为O (n) 的回溯过程来确定各个最优的折叠点。</p>
		<p>2. 变宽位－片元件的折叠</p>
		<p>首先考察折叠矩形的高度H已定，欲求最小的折叠宽度的情况。令Wi 如式（1 5 - 1 0）所示，按照与（1 5 - 1 0）式相同的推导过程，可得：</p>
		<p>Wi = m i n {w m i n(i, k) +Wk+1 | h s u m(i,k)+ ri +rk+ 1≤H, i≤k≤n} （1 5 - 1 3）</p>
		<p>其中Wn+1=0且w m i n(i,k)= m ini≤j≤k{wj }。可用与（1 5 - 1 0）式一样的方法求解（1 5 - 1 3）式，所需时间为O(n2 )。</p>
		<p>当折叠宽度W给定时，最小高度折叠可用折半搜索方法对超过O(n2 )个可能值进行搜索来实现，可能的高度值为h(i,j)+ri +rj + 1。在检测每个高度时，也可用（ 1 5 - 1 3）式来确定该折叠的宽度是否小于等于W。这种情况下总的时间消耗为O (n2 l o gn)。</p>
		<p>3. 标准单元折叠</p>
		<p>用wi 定义单元Ci 的宽度。每个单元的高度为h。当标准单元行的宽度W 固定不变时，通过减少折叠高度，可以相应地减少折叠面积。考察Ci 到Cn 的最小高度折叠。设第一个折叠点是Cs+ 1。从元件Cs+1 到Cn 的折叠必须使用最小高度，否则，可使用更小的高度来折叠Cs+1 到Cn，从而得到更小的折叠高度。所以这里仍可使用最优原理和动态规划方法。</p>
		<p>令Hi , s 为Ci 到Cn 折叠成宽为W的矩形时的最小高度，其中第一个折叠点为Cs+ 1。令w s u m(i, s)=s ?j = iwj。可假定没有宽度超过W的元件，否则不可能进行折叠。对于Hn,n 因为只有一个元件，不存在连线问题，因此Hn, n =h。对于H i, s（1≤i＜s≤n）注意到如果w s u m(i, s )＞W，不可能实现折叠。若w s u m(i,s)≤W，元件Ci 和C j + 1 在相同的标准单元行中，该行下方布线通道的高度为ls+ 1（定义ln+1 = 0）。因而：Hi, s = Hi+1, k （1 5 - 1 4）</p>
		<p>当i=s＜n 时，第一个标准单元行只包含Ci 。该行的高度为h 且该行下方布线通道的高度为li+ 1。因Ci+ 1 到Cn 单元的折叠是最优的.</p>
		<p>为了寻找最小高度折叠，首先使用式（ 1 5 - 1 4）和（1 5 - 1 5）来确定Hi, s （1≤i≤s≤n）。最小高度折叠的高度为m in｛H1 , s｝。可以使用回溯过程来确定最小高度折叠中的折叠点。</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/100957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-02-27 17:10 <a href="http://www.blogjava.net/renyangok/archive/2007/02/27/100957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉树</title><link>http://www.blogjava.net/renyangok/archive/2007/02/27/100901.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 27 Feb 2007 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/02/27/100901.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/100901.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/02/27/100901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/100901.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/100901.html</trackback:ping><description><![CDATA[
		<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: #008000">//</span>
				<span style="COLOR: #008000">建立二叉树并先根遍历的代码</span>
				<span style="COLOR: #008000">
						<br />
						<img id="Codehighlighter1_44_936_Open_Image" onclick="this.style.display='none'; Codehighlighter1_44_936_Open_Text.style.display='none'; Codehighlighter1_44_936_Closed_Image.style.display='inline'; Codehighlighter1_44_936_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_44_936_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_44_936_Closed_Text.style.display='none'; Codehighlighter1_44_936_Open_Image.style.display='inline'; Codehighlighter1_44_936_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"> BinaryTreeTest </span>
				<span id="Codehighlighter1_44_936_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_44_936_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_86_615_Open_Image" onclick="this.style.display='none'; Codehighlighter1_86_615_Open_Text.style.display='none'; Codehighlighter1_86_615_Closed_Image.style.display='inline'; Codehighlighter1_86_615_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_86_615_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_86_615_Closed_Text.style.display='none'; Codehighlighter1_86_615_Open_Image.style.display='inline'; Codehighlighter1_86_615_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_86_615_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_86_615_Open_Text">
								<span style="COLOR: #000000">{</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">主方法</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">  BinaryTreeTest b </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> BinaryTreeTest();<br /><img id="Codehighlighter1_151_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_151_192_Open_Text.style.display='none'; Codehighlighter1_151_192_Closed_Image.style.display='inline'; Codehighlighter1_151_192_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_151_192_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_151_192_Closed_Text.style.display='none'; Codehighlighter1_151_192_Open_Image.style.display='inline'; Codehighlighter1_151_192_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 style="COLOR: #000000"> </span>
								<span id="Codehighlighter1_151_192_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_151_192_Open_Text">
										<span style="COLOR: #000000">{ </span>
										<span style="COLOR: #000000">12</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #000000">11</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #000000">34</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #000000">45</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #000000">67</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #000000">89</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #000000">56</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #000000">43</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #000000">22</span>
										<span style="COLOR: #000000">, </span>
										<span style="COLOR: #000000">98</span>
										<span style="COLOR: #000000"> }</span>
								</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  BinaryTree root </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> BinaryTree(data[</span>
								<span style="COLOR: #000000">0</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/InBlock.gif" align="top" />  System.out.print(</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" /></span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">建立二叉树</span>
								<span style="COLOR: #008000">
										<br />
										<img id="Codehighlighter1_324_403_Open_Image" onclick="this.style.display='none'; Codehighlighter1_324_403_Open_Text.style.display='none'; Codehighlighter1_324_403_Closed_Image.style.display='inline'; Codehighlighter1_324_403_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_324_403_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_324_403_Closed_Text.style.display='none'; Codehighlighter1_324_403_Open_Image.style.display='inline'; Codehighlighter1_324_403_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">  </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"> </span>
								<span style="COLOR: #000000">1</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_324_403_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_324_403_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   root.insertTree(root, data[i]);<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">1</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">;</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/InBlock.gif" align="top" />
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(data[data.length </span>
								<span style="COLOR: #000000">-</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/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> key </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> Integer.parseInt(args[</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">]);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_522_563_Open_Image" onclick="this.style.display='none'; Codehighlighter1_522_563_Open_Text.style.display='none'; Codehighlighter1_522_563_Closed_Image.style.display='inline'; Codehighlighter1_522_563_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_522_563_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_522_563_Closed_Text.style.display='none'; Codehighlighter1_522_563_Open_Image.style.display='inline'; Codehighlighter1_522_563_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"> (b.searchkey(root, key)) </span>
								<span id="Codehighlighter1_522_563_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_522_563_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   System.out.println(</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">+</span>
										<span style="COLOR: #000000"> key);<br /><img id="Codehighlighter1_570_612_Open_Image" onclick="this.style.display='none'; Codehighlighter1_570_612_Open_Text.style.display='none'; Codehighlighter1_570_612_Closed_Image.style.display='inline'; Codehighlighter1_570_612_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_570_612_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_570_612_Closed_Text.style.display='none'; Codehighlighter1_570_612_Open_Image.style.display='inline'; Codehighlighter1_570_612_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span id="Codehighlighter1_570_612_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_570_612_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   System.out.println(</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">+</span>
										<span style="COLOR: #000000"> key);<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/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_670_934_Open_Image" onclick="this.style.display='none'; Codehighlighter1_670_934_Open_Text.style.display='none'; Codehighlighter1_670_934_Closed_Image.style.display='inline'; Codehighlighter1_670_934_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_670_934_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_670_934_Closed_Text.style.display='none'; Codehighlighter1_670_934_Open_Image.style.display='inline'; Codehighlighter1_670_934_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">boolean</span>
						<span style="COLOR: #000000"> searchkey(BinaryTree root, </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> key) </span>
						<span id="Codehighlighter1_670_934_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_670_934_Open_Text">
								<span style="COLOR: #000000">{</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">查询</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">  </span>
								<span style="COLOR: #0000ff">boolean</span>
								<span style="COLOR: #000000"> bl </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">false</span>
								<span style="COLOR: #000000">;<br /><img id="Codehighlighter1_718_751_Open_Image" onclick="this.style.display='none'; Codehighlighter1_718_751_Open_Text.style.display='none'; Codehighlighter1_718_751_Closed_Image.style.display='inline'; Codehighlighter1_718_751_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_718_751_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_718_751_Closed_Text.style.display='none'; Codehighlighter1_718_751_Open_Image.style.display='inline'; Codehighlighter1_718_751_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"> (root </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_718_751_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_718_751_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   bl </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">false</span>
										<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> bl;<br /><img id="Codehighlighter1_780_812_Open_Image" onclick="this.style.display='none'; Codehighlighter1_780_812_Open_Text.style.display='none'; Codehighlighter1_780_812_Closed_Image.style.display='inline'; Codehighlighter1_780_812_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_780_812_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_780_812_Closed_Text.style.display='none'; Codehighlighter1_780_812_Open_Image.style.display='inline'; Codehighlighter1_780_812_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (root.data </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> key) </span>
								<span id="Codehighlighter1_780_812_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_780_812_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   bl </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">true</span>
										<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> bl;<br /><img id="Codehighlighter1_841_889_Open_Image" onclick="this.style.display='none'; Codehighlighter1_841_889_Open_Text.style.display='none'; Codehighlighter1_841_889_Closed_Image.style.display='inline'; Codehighlighter1_841_889_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_841_889_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_841_889_Closed_Text.style.display='none'; Codehighlighter1_841_889_Open_Image.style.display='inline'; Codehighlighter1_841_889_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (key </span>
								<span style="COLOR: #000000">&gt;=</span>
								<span style="COLOR: #000000"> root.data) </span>
								<span id="Codehighlighter1_841_889_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_841_889_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> searchkey(root.rightpoiter, key);<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/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> searchkey(root.leftpoiter, key);<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" />
						<br />
						<img id="Codehighlighter1_956_1493_Open_Image" onclick="this.style.display='none'; Codehighlighter1_956_1493_Open_Text.style.display='none'; Codehighlighter1_956_1493_Closed_Image.style.display='inline'; Codehighlighter1_956_1493_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_956_1493_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_956_1493_Closed_Text.style.display='none'; Codehighlighter1_956_1493_Open_Image.style.display='inline'; Codehighlighter1_956_1493_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> BinaryTree </span>
				<span id="Codehighlighter1_956_1493_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_956_1493_Open_Text">
						<span style="COLOR: #000000">{</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">二叉树类</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> data;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> BinaryTree leftpoiter;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> BinaryTree rightpoiter;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_1049_1115_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1049_1115_Open_Text.style.display='none'; Codehighlighter1_1049_1115_Closed_Image.style.display='inline'; Codehighlighter1_1049_1115_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1049_1115_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1049_1115_Closed_Text.style.display='none'; Codehighlighter1_1049_1115_Open_Image.style.display='inline'; Codehighlighter1_1049_1115_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> BinaryTree(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> data) </span>
						<span id="Codehighlighter1_1049_1115_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_1049_1115_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.data </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> data;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  leftpoiter </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  rightpoiter </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</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/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_1169_1491_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1169_1491_Open_Text.style.display='none'; Codehighlighter1_1169_1491_Closed_Image.style.display='inline'; Codehighlighter1_1169_1491_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1169_1491_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1169_1491_Closed_Text.style.display='none'; Codehighlighter1_1169_1491_Open_Image.style.display='inline'; Codehighlighter1_1169_1491_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">void</span>
						<span style="COLOR: #000000"> insertTree(BinaryTree root, </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> data) </span>
						<span id="Codehighlighter1_1169_1491_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_1169_1491_Open_Text">
								<span style="COLOR: #000000">{</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">插入节点</span>
								<span style="COLOR: #008000">
										<br />
										<img id="Codehighlighter1_1202_1343_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1202_1343_Open_Text.style.display='none'; Codehighlighter1_1202_1343_Closed_Image.style.display='inline'; Codehighlighter1_1202_1343_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_1202_1343_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1202_1343_Closed_Text.style.display='none'; Codehighlighter1_1202_1343_Open_Image.style.display='inline'; Codehighlighter1_1202_1343_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">  </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (data </span>
								<span style="COLOR: #000000">&gt;=</span>
								<span style="COLOR: #000000"> root.data) </span>
								<span id="Codehighlighter1_1202_1343_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_1202_1343_Open_Text">
										<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_1237_1287_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1237_1287_Open_Text.style.display='none'; Codehighlighter1_1237_1287_Closed_Image.style.display='inline'; Codehighlighter1_1237_1287_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1237_1287_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1237_1287_Closed_Text.style.display='none'; Codehighlighter1_1237_1287_Open_Image.style.display='inline'; Codehighlighter1_1237_1287_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"> (root.rightpoiter </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">null</span>
										<span style="COLOR: #000000">) </span>
										<span id="Codehighlighter1_1237_1287_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_1237_1287_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    root.rightpoiter </span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #000000"> </span>
												<span style="COLOR: #0000ff">new</span>
												<span style="COLOR: #000000"> BinaryTree(data);<br /><img id="Codehighlighter1_1294_1339_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1294_1339_Open_Text.style.display='none'; Codehighlighter1_1294_1339_Closed_Image.style.display='inline'; Codehighlighter1_1294_1339_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1294_1339_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1294_1339_Closed_Text.style.display='none'; Codehighlighter1_1294_1339_Open_Image.style.display='inline'; Codehighlighter1_1294_1339_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   }</span>
										</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">else</span>
										<span style="COLOR: #000000"> </span>
										<span id="Codehighlighter1_1294_1339_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_1294_1339_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    insertTree(root.rightpoiter, data);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span>
										</span>
										<span style="COLOR: #000000">
												<br />
												<img id="Codehighlighter1_1350_1488_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1350_1488_Open_Text.style.display='none'; Codehighlighter1_1350_1488_Closed_Image.style.display='inline'; Codehighlighter1_1350_1488_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_1350_1488_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1350_1488_Closed_Text.style.display='none'; Codehighlighter1_1350_1488_Open_Image.style.display='inline'; Codehighlighter1_1350_1488_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span id="Codehighlighter1_1350_1488_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_1350_1488_Open_Text">
										<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_1384_1433_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1384_1433_Open_Text.style.display='none'; Codehighlighter1_1384_1433_Closed_Image.style.display='inline'; Codehighlighter1_1384_1433_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1384_1433_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1384_1433_Closed_Text.style.display='none'; Codehighlighter1_1384_1433_Open_Image.style.display='inline'; Codehighlighter1_1384_1433_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"> (root.leftpoiter </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">null</span>
										<span style="COLOR: #000000">) </span>
										<span id="Codehighlighter1_1384_1433_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_1384_1433_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    root.leftpoiter </span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #000000"> </span>
												<span style="COLOR: #0000ff">new</span>
												<span style="COLOR: #000000"> BinaryTree(data);<br /><img id="Codehighlighter1_1440_1484_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1440_1484_Open_Text.style.display='none'; Codehighlighter1_1440_1484_Closed_Image.style.display='inline'; Codehighlighter1_1440_1484_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1440_1484_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1440_1484_Closed_Text.style.display='none'; Codehighlighter1_1440_1484_Open_Image.style.display='inline'; Codehighlighter1_1440_1484_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   }</span>
										</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">else</span>
										<span style="COLOR: #000000"> </span>
										<span id="Codehighlighter1_1440_1484_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_1440_1484_Open_Text">
												<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    insertTree(root.leftpoiter, data);<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/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>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> end</span>
		</div>
		<p>讲解：一个寻找关键字－－searchkey <br />另一个是插入一个结点：insertTree <br />另外这是一个完全的先序遍历二叉树的语法。先根结点，再左结点，如无再右结点，如些加归至搜索完毕。  </p>
<img src ="http://www.blogjava.net/renyangok/aggbug/100901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-02-27 11:41 <a href="http://www.blogjava.net/renyangok/archive/2007/02/27/100901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何求素数</title><link>http://www.blogjava.net/renyangok/archive/2006/11/20/82278.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Mon, 20 Nov 2006 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/11/20/82278.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/82278.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/11/20/82278.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/82278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/82278.html</trackback:ping><description><![CDATA[<p>1。自然数是0，1，2&#8230;&#8230;<br />
2。素数是2，3，5&#8230;&#8230;（不包括1的只能背1和它本身整除的自然数）<br />
<br />
import java.util.Scanner;<br />
<br />
public class Prime {</p>
<p>&nbsp;&nbsp;&nbsp; //最基本的做法<br />
</p>
<p>&nbsp;&nbsp;&nbsp; private int prime1(int num) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i = 0, s = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; label1: for (int n = 2; n &lt;= num; n++) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int m = 2; m * m &lt;= n; m++) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (n % m == 0)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue label1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //System.out.println("第" + i + "个素数是：" + n);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return s;<br />
&nbsp;&nbsp;&nbsp; }<br />
</p>
<p>&nbsp;&nbsp;&nbsp; //<strong><font size="4"><font color="blue">6N&#177;1法</font></font></strong></p>
<p>&nbsp;&nbsp;&nbsp; private int prime2(int num){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i = 0, s = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int n = 2; n &lt;=3; n ++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //System.out.println("第" + i + "个素数是：" + n);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; label1: for(int n = 1; ; n++) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; label2: for (int m = 0; m &lt;= 1; m++) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int tmp = 2 * (3 * n + m) - 1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (tmp &gt; num)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break label1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int k = 2; k * k &lt;= tmp; k++)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (tmp % k == 0)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (m == 0)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue label2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue label1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //System.out.println("第" + i + "个素数是：" + tmp);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return s;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Scanner in = new Scanner(System.in);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int num = in.nextInt();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; long start = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int sum = new Prime().prime1(num);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; long end = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("方法一共" + sum + "个素数");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("用时：" + (end - start));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; start = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sum = new Prime().prime2(num);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; end = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("方法二共" + sum + "个素数");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("用时：" + (end - start));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</p>
<p>输入：1000000</p>
<p>运行结果：</p>
<p><strong><font color="#0000ff" size="4">方法一共78498个素数<br />
用时：3434<br />
方法二共78498个素数<br />
用时：3453</font></strong></p>
<p>（看来基本方法比<strong><font size="4"><font color="blue">6N&#177;1法</font></font></strong>还要更快些，奇怪了，我的程序写的没什么问题阿）<br />
</p>
<p><strong><font color="#0000ff" size="4"><br />
</font></strong></p>
<p><strong><font color="#0000ff" size="4">【1】求10000以内的所有素数。<br />
</font></strong>素数是除了1和它本身之外再不能被其他数整除的自然数。由于找不到一个通项公式来表示所有的素数，所以对于数学家来说，素数一直是一个未解之谜。像著名的 哥德巴赫猜想、孪生素数猜想，几百年来不知吸引了世界上多少优秀的数学家。尽管他们苦心钻研，呕心沥血，但至今仍然未见分晓。<br />
自从有了计算机之后，人们借助于计算机的威力，已经找到了2<sup>216091</sup>以内的所有素数。<br />
求素数的方法有很多种，最简单的方法是根据素数的定义来求。对于一个自然数N，用大于1小于N的各个自然数都去除一下N，如果都除不尽，则N为素数，否则N为合数。<br />
但是，如果用素数定义的方法来编制计算机程序，它的效率一定是非常低的，其中有许多地方都值得改进。<br />
第一，对于一个自然数N，只要能被一个非1非自身的数整除，它就肯定不是素数，所以不<br />
必再用其他的数去除。<br />
第二，对于N来说，只需用小于N的素数去除就可以了。例如，如果N能被15整除，实际<br />
上就能被3和5整除，如果N不能被3和5整除，那么N也决不会被15整除。<br />
第三，对于N来说，不必用从2到N一1的所有素数去除，只需用小于等于&#8730;N(根号N)的所有素数去除就可以了。这一点可以用反证法来证明：<br />
如果N是合数，则一定存在大于1小于N的整数d1和d2，使得N=d1&#215;d2。<br />
如果d1和d2均大于&#8730;N，则有：N＝d1&#215;d2&gt;&#8730;N&#215;&#8730;N＝N。<br />
而这是不可能的，所以，d1和d2中必有一个小于或等于&#8730;N。<br />
基于上述分析，设计算法如下：<br />
(1)用2，3，5，7逐个试除N的方法求出100以内的所有素数。<br />
(2)用100以内的所有素数逐个试除的方法求出10000以内的素数。<br />
首先，将2，3，5，7分别存放在a[1]、a[2]、a[3]、a[4]中，以后每求出一个素数，只要不大于100，就依次存放在A数组中的一个单元 中。当我们求100—10000之间的素数时，可依次用a[1]－a[2]的素数去试除N，这个范围内的素数可以不保存，直接打印。<br />
<br />
<font size="4"><strong><font color="blue">【2】用筛法求素数。</font></strong></font><br />
简单介绍一下厄拉多塞筛法。厄拉多塞是一位古希腊数学家，他在寻找素数时，采用了一种与众不同的方法：先将2－N的各数写在纸上：<br />
<img src="http://www.ywhs.net/yzren/pic/noip/prime_01.png"  alt="" /><br />
在2的上面画一个圆圈，然后划去2的其他倍数；第一个既未画圈又没有被划去的数是3，将它画圈，再划去3的其他倍数；现在既未画圈又没有被划去的第一个数 是5，将它画圈，并划去5的其他倍数&#8230;&#8230;依次类推，一直到所有小于或等于N的各数都画了圈或划去为止。这时，表中画了圈的以及未划去的那些数正好就是小于 N的素数。<br />
<img src="http://www.ywhs.net/yzren/pic/noip/prime_02.png"  alt="" /><br />
这很像一面筛子，把满足条件的数留下来，把不满足条件的数筛掉。由于这种方法是厄拉多塞首先发明的，所以，后人就把这种方法称作厄拉多塞筛法。<br />
在计算机中，筛法可以用给数组单元置零的方法来实现。具体来说就是：首先开一个数组：a[i]，i=1，2，3，&#8230;，同时，令所有的数组元素都等于下标 值，即a[i]=i，当i不是素数时，令a[i]=0 。当输出结果时，只要判断a[i]是否等于零即可，如果a[i]=0，则令i=i+1，检查下一个a[i]。<br />
筛法是计算机程序设计中常用的算法之一。<br />
<br />
<strong><font size="4"><font color="blue">【3】用6N&#177;1法求素数。</font></font></strong><br />
任何一个自然数，总可以表示成为如下的形式之一：<br />
6N，6N+1，6N+2，6N+3，6N+4，6N+5 (N=0，1，2，&#8230;)<br />
显然，当N&#8805;1时，6N，6N+2，6N+3，6N+4都不是素数，只有形如6N+1和6N+5的自然数有可能是素数。所以，除了2和3之外，所有的素数都可以表示成6N&#177;1的形式(N为自然数)。<br />
根据上述分析，我们可以构造另一面筛子，只对形如6 N&#177;1的自然数进行筛选，这样就可以大大减少筛选的次数，从而进一步提高程序的运行效率和速度。<br />
<img src="http://www.ywhs.net/yzren/pic/noip/prime_03.png"  alt="" /><br />
在程序上，我们可以用一个二重循环实现这一点，外循环i按3的倍数递增，内循环j为0－1的循环，则2(i+j)-1恰好就是形如6N&#177;1的自然数。</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/82278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-11-20 15:28 <a href="http://www.blogjava.net/renyangok/archive/2006/11/20/82278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各种排序算法java实现</title><link>http://www.blogjava.net/renyangok/archive/2006/11/20/82277.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Mon, 20 Nov 2006 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/11/20/82277.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/82277.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/11/20/82277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/82277.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/82277.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent"> 
<p>插入排序:</p><p>package org.rut.util.algorithm.support;</p><p>import org.rut.util.algorithm.SortUtil;<br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class InsertSort implements SortUtil.Sort{</p><p>    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int temp;<br />        for(int i=1;i&lt;data.length;i++){<br />            for(int j=i;(j&gt;0)&amp;&amp;(data[j]&lt;data[j-1]);j--){<br />                SortUtil.swap(data,j,j-1);<br />            }<br />        }        <br />    }</p><p>}<br />冒泡排序:</p><p>package org.rut.util.algorithm.support;</p><p>import org.rut.util.algorithm.SortUtil;</p><p>/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class BubbleSort implements SortUtil.Sort{</p><p>    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int temp;<br />        for(int i=0;i&lt;data.length;i++){<br />            for(int j=data.length-1;j&gt;i;j--){<br />                if(data[j]&lt;data[j-1]){<br />                    SortUtil.swap(data,j,j-1);<br />                }<br />            }<br />        }<br />    }</p><p>}</p><p>选择排序:</p><p>package org.rut.util.algorithm.support;</p><p>import org.rut.util.algorithm.SortUtil;</p><p>/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class SelectionSort implements SortUtil.Sort {</p><p>    /*<br />     * (non-Javadoc)<br />     * <br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int temp;<br />        for (int i = 0; i &lt; data.length; i++) {<br />            int lowIndex = i;<br />            for (int j = data.length - 1; j &gt; i; j--) {<br />                if (data[j] &lt; data[lowIndex]) {<br />                    lowIndex = j;<br />                }<br />            }<br />            SortUtil.swap(data,i,lowIndex);<br />        }<br />    }</p><p>}</p><p>Shell排序:</p><p>package org.rut.util.algorithm.support;</p><p>import org.rut.util.algorithm.SortUtil;</p><p>/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class ShellSort implements SortUtil.Sort{</p><p>    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        for(int i=data.length/2;i&gt;2;i/=2){<br />            for(int j=0;j&lt;i;j++){<br />                insertSort(data,j,i);<br />            }<br />        }<br />        insertSort(data,0,1);<br />    }</p><p>    /**<br />     * @param data<br />     * @param j<br />     * @param i<br />     */<br />    private void insertSort(int[] data, int start, int inc) {<br />        int temp;<br />        for(int i=start+inc;i&lt;data.length;i+=inc){<br />            for(int j=i;(j&gt;=inc)&amp;&amp;(data[j]&lt;data[j-inc]);j-=inc){<br />                SortUtil.swap(data,j,j-inc);<br />            }<br />        }<br />    }</p><p>}</p><p>快速排序:</p><p>package org.rut.util.algorithm.support;</p><p>import org.rut.util.algorithm.SortUtil;</p><p>/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class QuickSort implements SortUtil.Sort{</p><p>    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        quickSort(data,0,data.length-1);        <br />    }<br />    private void quickSort(int[] data,int i,int j){<br />        int pivotIndex=(i+j)/2;<br />        //swap<br />        SortUtil.swap(data,pivotIndex,j);<br />        <br />        int k=partition(data,i-1,j,data[j]);<br />        SortUtil.swap(data,k,j);<br />        if((k-i)&gt;1) quickSort(data,i,k-1);<br />        if((j-k)&gt;1) quickSort(data,k+1,j);<br />        <br />    }<br />    /**<br />     * @param data<br />     * @param i<br />     * @param j<br />     * @return<br />     */<br />    private int partition(int[] data, int l, int r,int pivot) {<br />        do{<br />           while(data[++l]&lt;pivot);<br />           while((r!=0)&amp;&amp;data[--r]&gt;pivot);<br />           SortUtil.swap(data,l,r);<br />        }<br />        while(l&lt;r);<br />        SortUtil.swap(data,l,r);        <br />        return l;<br />    }</p><p>}<br />改进后的快速排序:</p><p>package org.rut.util.algorithm.support;</p><p>import org.rut.util.algorithm.SortUtil;</p><p>/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class ImprovedQuickSort implements SortUtil.Sort {</p><p>    private static int MAX_STACK_SIZE=4096;<br />    private static int THRESHOLD=10;<br />    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int[] stack=new int[MAX_STACK_SIZE];<br />        <br />        int top=-1;<br />        int pivot;<br />        int pivotIndex,l,r;<br />        <br />        stack[++top]=0;<br />        stack[++top]=data.length-1;<br />        <br />        while(top&gt;0){<br />            int j=stack[top--];<br />            int i=stack[top--];<br />            <br />            pivotIndex=(i+j)/2;<br />            pivot=data[pivotIndex];<br />            <br />            SortUtil.swap(data,pivotIndex,j);<br />            <br />            //partition<br />            l=i-1;<br />            r=j;<br />            do{<br />                while(data[++l]&lt;pivot);<br />                while((r!=0)&amp;&amp;(data[--r]&gt;pivot));<br />                SortUtil.swap(data,l,r);<br />            }<br />            while(l&lt;r);<br />            SortUtil.swap(data,l,r);<br />            SortUtil.swap(data,l,j);<br />            <br />            if((l-i)&gt;THRESHOLD){<br />                stack[++top]=i;<br />                stack[++top]=l-1;<br />            }<br />            if((j-l)&gt;THRESHOLD){<br />                stack[++top]=l+1;<br />                stack[++top]=j;<br />            }<br />            <br />        }<br />        //new InsertSort().sort(data);<br />        insertSort(data);<br />    }<br />    /**<br />     * @param data<br />     */<br />    private void insertSort(int[] data) {<br />        int temp;<br />        for(int i=1;i&lt;data.length;i++){<br />            for(int j=i;(j&gt;0)&amp;&amp;(data[j]&lt;data[j-1]);j--){<br />                SortUtil.swap(data,j,j-1);<br />            }<br />        }       <br />    }</p><p>}</p><p>归并排序:</p><p>package org.rut.util.algorithm.support;</p><p>import org.rut.util.algorithm.SortUtil;</p><p>/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class MergeSort implements SortUtil.Sort{</p><p>    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int[] temp=new int[data.length];<br />        mergeSort(data,temp,0,data.length-1);<br />    }<br />    <br />    private void mergeSort(int[] data,int[] temp,int l,int r){<br />        int mid=(l+r)/2;<br />        if(l==r) return ;<br />        mergeSort(data,temp,l,mid);<br />        mergeSort(data,temp,mid+1,r);<br />        for(int i=l;i&lt;=r;i++){<br />            temp[i]=data[i];<br />        }<br />        int i1=l;<br />        int i2=mid+1;<br />        for(int cur=l;cur&lt;=r;cur++){<br />            if(i1==mid+1)<br />                data[cur]=temp[i2++];<br />            else if(i2&gt;r)<br />                data[cur]=temp[i1++];<br />            else if(temp[i1]&lt;temp[i2])<br />                data[cur]=temp[i1++];<br />            else<br />                data[cur]=temp[i2++];            <br />        }<br />    }</p><p>}</p><p>改进后的归并排序:</p><p>package org.rut.util.algorithm.support;</p><p>import org.rut.util.algorithm.SortUtil;</p><p>/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class ImprovedMergeSort implements SortUtil.Sort {</p><p>    private static final int THRESHOLD = 10;</p><p>    /*<br />     * (non-Javadoc)<br />     * <br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int[] temp=new int[data.length];<br />        mergeSort(data,temp,0,data.length-1);<br />    }</p><p>    private void mergeSort(int[] data, int[] temp, int l, int r) {<br />        int i, j, k;<br />        int mid = (l + r) / 2;<br />        if (l == r)<br />            return;<br />        if ((mid - l) &gt;= THRESHOLD)<br />            mergeSort(data, temp, l, mid);<br />        else<br />            insertSort(data, l, mid - l + 1);<br />        if ((r - mid) &gt; THRESHOLD)<br />            mergeSort(data, temp, mid + 1, r);<br />        else<br />            insertSort(data, mid + 1, r - mid);</p><p>        for (i = l; i &lt;= mid; i++) {<br />            temp[i] = data[i];<br />        }<br />        for (j = 1; j &lt;= r - mid; j++) {<br />            temp[r - j + 1] = data[j + mid];<br />        }<br />        int a = temp[l];<br />        int b = temp[r];<br />        for (i = l, j = r, k = l; k &lt;= r; k++) {<br />            if (a &lt; b) {<br />                data[k] = temp[i++];<br />                a = temp[i];<br />            } else {<br />                data[k] = temp[j--];<br />                b = temp[j];<br />            }<br />        }<br />    }</p><p>    /**<br />     * @param data<br />     * @param l<br />     * @param i<br />     */<br />    private void insertSort(int[] data, int start, int len) {<br />        for(int i=start+1;i&lt;start+len;i++){<br />            for(int j=i;(j&gt;start) &amp;&amp; data[j]&lt;data[j-1];j--){<br />                SortUtil.swap(data,j,j-1);<br />            }<br />        }<br />    }</p><p>}<br />堆排序:</p><p>package org.rut.util.algorithm.support;</p><p>import org.rut.util.algorithm.SortUtil;</p><p>/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class HeapSort implements SortUtil.Sort{</p><p>    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        MaxHeap h=new MaxHeap();<br />        h.init(data);<br />        for(int i=0;i&lt;data.length;i++)<br />            h.remove();<br />        System.arraycopy(h.queue,1,data,0,data.length);<br />    }</p><p><br />     private static class MaxHeap{<br />         <br />        <br />        void init(int[] data){<br />            this.queue=new int[data.length+1];<br />            for(int i=0;i&lt;data.length;i++){<br />                queue[++size]=data[i];<br />                fixUp(size);<br />            }<br />        }<br />         <br />        private int size=0;</p><p>        private int[] queue;<br />                <br />        public int get() {<br />            return queue[1];<br />        }</p><p>        public void remove() {<br />            SortUtil.swap(queue,1,size--);<br />            fixDown(1);<br />        }<br />        //fixdown<br />        private void fixDown(int k) {<br />            int j;<br />            while ((j = k &lt;&lt; 1) &lt;= size) {<br />                if (j &lt; size &amp;&amp; queue[j]&lt;queue[j+1])<br />                    j++; <br />                if (queue[k]&gt;queue[j]) //不用交换<br />                    break;<br />                SortUtil.swap(queue,j,k);<br />                k = j;<br />            }<br />        }<br />        private void fixUp(int k) {<br />            while (k &gt; 1) {<br />                int j = k &gt;&gt; 1;<br />                if (queue[j]&gt;queue[k])<br />                    break;<br />                SortUtil.swap(queue,j,k);<br />                k = j;<br />            }<br />        }</p><p>    }</p><p>}</p><p> </p><p>SortUtil:</p><p>package org.rut.util.algorithm;</p><p>import org.rut.util.algorithm.support.BubbleSort;<br />import org.rut.util.algorithm.support.HeapSort;<br />import org.rut.util.algorithm.support.ImprovedMergeSort;<br />import org.rut.util.algorithm.support.ImprovedQuickSort;<br />import org.rut.util.algorithm.support.InsertSort;<br />import org.rut.util.algorithm.support.MergeSort;<br />import org.rut.util.algorithm.support.QuickSort;<br />import org.rut.util.algorithm.support.SelectionSort;<br />import org.rut.util.algorithm.support.ShellSort;</p><p>/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class SortUtil {<br />    public final static int INSERT = 1;</p><p>    public final static int BUBBLE = 2;</p><p>    public final static int SELECTION = 3;</p><p>    public final static int SHELL = 4;</p><p>    public final static int QUICK = 5;</p><p>    public final static int IMPROVED_QUICK = 6;</p><p>    public final static int MERGE = 7;</p><p>    public final static int IMPROVED_MERGE = 8;</p><p>    public final static int HEAP = 9;</p><p>    public static void sort(int[] data) {<br />        sort(data, IMPROVED_QUICK);<br />    }<br />    private static String[] name={<br />            "insert","bubble","selection","shell","quick","improved_quick","merge","improved_merge","heap"<br />    };<br />    <br />    private static Sort[] impl=new Sort[]{<br />            new InsertSort(),<br />            new BubbleSort(),<br />            new SelectionSort(),<br />            new ShellSort(),<br />            new QuickSort(),<br />            new ImprovedQuickSort(),<br />            new MergeSort(),<br />            new ImprovedMergeSort(),<br />            new HeapSort()<br />    };</p><p>    public static String toString(int algorithm){<br />        return name[algorithm-1];<br />    }<br />    <br />    public static void sort(int[] data, int algorithm) {<br />        impl[algorithm-1].sort(data);<br />    }</p><p>    public static interface Sort {<br />        public void sort(int[] data);<br />    }</p><p>    public static void swap(int[] data, int i, int j) {<br />        int temp = data[i];<br />        data[i] = data[j];<br />        data[j] = temp;<br />    }<br />}</p></span>
<img src ="http://www.blogjava.net/renyangok/aggbug/82277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-11-20 15:27 <a href="http://www.blogjava.net/renyangok/archive/2006/11/20/82277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>