??xml version="1.0" encoding="utf-8" standalone="yes"?>av不卡在线播放,欧美日韩综合一区,蝌蚪视频在线播放http://www.aygfsteel.com/renyangok/category/17011.htmlzh-cnSat, 15 Dec 2007 10:28:01 GMTSat, 15 Dec 2007 10:28:01 GMT60求两个数或多个数的最大公U数法及其实现http://www.aygfsteel.com/renyangok/archive/2007/12/15/167956.html保尔?/dc:creator>保尔?/author>Sat, 15 Dec 2007 07:40:00 GMThttp://www.aygfsteel.com/renyangok/archive/2007/12/15/167956.htmlhttp://www.aygfsteel.com/renyangok/comments/167956.htmlhttp://www.aygfsteel.com/renyangok/archive/2007/12/15/167956.html#Feedback0http://www.aygfsteel.com/renyangok/comments/commentRss/167956.htmlhttp://www.aygfsteel.com/renyangok/services/trackbacks/167956.html
1、欧几里L?


Ƨ几里d法又称辗{盔R法,用于计算两个整数a,b的最大公U数。其计算原理依赖于下面的定理Q?

定理Qgcd(a,b) = gcd(b,a mod b)

证明Qa可以表示成a = kb + rQ则r = a mod b
假设d是a,b的一个公U数Q则?
d|a, d|bQ而r = a - kbQ因此d|r
因此d?b,a mod b)的公U数

假设d ?b,a mod b)的公U数Q则
d | b , d |r Q但是a = kb +r
因此d也是(a,b)的公U数

因此(a,b)?b,a mod b)的公U数是一LQ其最大公U数也必然相{,得证

Ƨ几里d法是Ҏq个原理来做的,其算法用C++语言描述为:

void swap(int & a, int & b){
     int c = a;
       a = b;
       b = c;
}

int gcd(int a,int b){
     if(0 == a ){
         return b;
     }
     if( 0 == b){
         return a;
     }
     if(a > b){
         swap(a,b);
     }
     int c;
     for(c = a % b ; c > 0 ; c = a % b){
           a = b;
           b = c;
     }
     return b;
}

2、Stein法
Ƨ几里d法是计两个数最大公U数的传l算法,它无Z理论q是从效率上都是很好的。但是有一个致命的~陷Q这个缺陷只有在大素数时才会昄出来?

考虑现在的硬件^収ͼ一般整数最多也是64位,对于q样的整敎ͼ计算两个C间的模是很简单的。对于字长ؓ32位的q_Q计两个不过32位的整数? 模,只需要一个指令周期,而计?4位以下的整数模,也不q几个周期而已。但是对于更大的素数Q这L计算q程׃得不qh设计Qؓ了计两个超q? 64位的整数的模Q用户也怸得不采用cM于多位数除法手算q程中的试商法,q个q程不但复杂Q而且消耗了很多CPU旉。对于现代密码算法,要求计算 128位以上的素数的情冉|比皆是,设计q样的程序迫切希望能够抛弃除法和取模?

Stein法由J. Stein 1961q提出,q个Ҏ也是计算两个数的最大公U数。和Ƨ几里d法 法不同的是QStein法只有整数的移位和加减法,q对于程序设计者是一个福韟?

Z说明Stein法的正性,首先必须注意C下结论:

gcd(a,a) = aQ也是一个数和它自n的公U数是其自n
gcd(ka,kb) = k gcd(a,b)Q也是最大公U数q算和倍乘q算可以交换Q特D的Q当k=2Ӟ说明两个偶数的最大公U数必然能被2整除

C++/java 实现
// c++/java stein 法
int gcd(int a,int b){
     if(a<b){
//arrange so that a>b
         int temp = a;
           a = b;
           b=temp;
     }
     if(0==b)
//the base case
        return a;
     if(a%2==0 && b%2 ==0)
//a and b are even
         return 2*gcd(a/2,b/2);
     if ( a%2 == 0)
// only a is even
         return gcd(a/2,b);
     if ( b%2==0 )
// only b is even
         return gcd(a,b/2);
     return gcd((a+b)/2,(a-b)/2);
// a and b are odd
}

二,多个数的最大公U数Q?python实现Q取出数la中最的Q从2到最的循环Q找出其中最大的能被数组中所有数整除的那个数Q就是最大公U数)
def gcd(a):
    a.sort()
    min = a[0]
    result = 1
    for i in range(2, min+1):
        flag = True
        for j in a:
            if j % i != 0:
                flag = False
        if flag == True:
            result = i
    return result


]]>
l合数学QCatalan?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/renyangok/archive/2007/11/16/161089.html</guid><wfw:comment>http://www.aygfsteel.com/renyangok/comments/161089.html</wfw:comment><comments>http://www.aygfsteel.com/renyangok/archive/2007/11/16/161089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/renyangok/comments/commentRss/161089.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/renyangok/services/trackbacks/161089.html</trackback:ping><description><![CDATA[Catalan敎ͼ(for http://acm.pku.edu.cn/JudgeOnline/problem?id=2084)<br /> <br /> C_n = ΣC_i*C_(n-i)Q其?≤i<nQ?br /> C_n = C(2n,n) / (n+1)Q?其中C(2n, n) 表示l合敎ͼ公式为:C(n, k) = n! / (k!(n-k)!)<br /> C_n=C_(n-1)*(4n-2)/(n+1)?br /> <br /> 它的意义有很多,例如Qn+1边Ş用对角线划分? 三角形的Ҏ敎ͼn?1和n?1满所有部分和不小于零的排列数Q具有n个节点的二叉树的数量……<br /> <br /> Q详l说明参考:http://hi.baidu.com/kikoqiu/blog/item/81d792015ab13e01738da51d.htmlQ?br /> <img src ="http://www.aygfsteel.com/renyangok/aggbug/161089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/renyangok/" target="_blank">保尔?/a> 2007-11-16 18:07 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/renyangok/archive/2007/03/06/102213.html</guid><wfw:comment>http://www.aygfsteel.com/renyangok/comments/102213.html</wfw:comment><comments>http://www.aygfsteel.com/renyangok/archive/2007/03/06/102213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/renyangok/comments/commentRss/102213.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> * 题目Q?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> * ~写一个截取字W串的函敎ͼ输入Z个字W串和字节数Q输Zؓ按字节截取的字符丌Ӏ 但是要保证汉字不被截半个,如“我ABC?Q应该截为“我AB”,输入“我ABC汉DEF”,6Q应该输Zؓ“我ABC”而不是“我ABC+汉的半个”。?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> * <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> * 解释Q?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> * 此处的编码方式应该是操作pȝ默认的GB~码Q即汉字?个字节且W一个字节的最高位?Q?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> * 如果理解为有W号数的话,是负数Q而英文占1个字节,W合ASC2码?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span> <span style="COLOR: #008000">*/</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_251_822_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #000000"> String str;<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_367_411_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_439_820_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.println(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Length of this String ===></span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000">bt.length);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(byteNum</span> <span style="COLOR: #000000">>=</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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_551_760_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />   </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(bt[byteNum]</span> <span style="COLOR: #000000"><</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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_577_662_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    System.out.println(substrx);<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_671_756_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    System.out.println(substrex);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_768_817_Open_Text"> <span style="COLOR: #000000">{ <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />   System.out.println(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">输入错误Q!Q请输入大于零的整数Q?/span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_854_1009_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_897_1007_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />  sptstr.splitIt();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <img src ="http://www.aygfsteel.com/renyangok/aggbug/102213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/renyangok/" target="_blank">保尔?/a> 2007-03-06 17:17 <a href="http://www.aygfsteel.com/renyangok/archive/2007/03/06/102213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java两个字符串的最大公p?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/renyangok/archive/2007/03/05/101934.html</guid><wfw:comment>http://www.aygfsteel.com/renyangok/comments/101934.html</wfw:comment><comments>http://www.aygfsteel.com/renyangok/archive/2007/03/05/101934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/renyangok/comments/commentRss/101934.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> 求两个字W串的最大公共子?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> String s1 = "abcdefghigj";<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> String s2 = "xyzabcdeigj";<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> 则输出abcde<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span> <span style="COLOR: #008000">*/</span> </span> <span style="COLOR: #000000"> <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_106_627_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_154_432_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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"><</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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_216_412_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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"><=</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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_266_408_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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">&&</span> <span style="COLOR: #000000"> sub.length() </span> <span style="COLOR: #000000">></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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_375_402_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        max </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> sub;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span> </span> <span style="COLOR: #000000">  <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> max;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_480_625_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    System.out.println(output);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <img src ="http://www.aygfsteel.com/renyangok/aggbug/101934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/renyangok/" target="_blank">保尔?/a> 2007-03-05 15:50 <a href="http://www.aygfsteel.com/renyangok/archive/2007/03/05/101934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串匹?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/renyangok/archive/2007/03/05/101927.html</guid><wfw:comment>http://www.aygfsteel.com/renyangok/comments/101927.html</wfw:comment><comments>http://www.aygfsteel.com/renyangok/archive/2007/03/05/101927.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/renyangok/comments/commentRss/101927.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/renyangok/services/trackbacks/101927.html</trackback:ping><description><![CDATA[ <h1>1 术语定义</h1> <p>在字W串匚w问题中,我们期待察看串T中是否含有串P?br />其中串T被称为目标串Q串S被称为模式串?/p> <h1>2 朴素匚w法</h1> <p>q行字符串匹配,最单的一个想法是Q?/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_81_424_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span> <span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">(i </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000"> tl </span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000"> pl </span> <span style="COLOR: #000000">&&</span> <span style="COLOR: #000000"> j </span> <span style="COLOR: #000000"><</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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_216_365_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_305_357_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />              i</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />          }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />          </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> i;<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_469_605_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />      System.out.println(sm.StringMatch(t, p));<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <p>可以看见Q这个算法(假定m>>nQ的复杂度是O(mn)Q其中m是T的长度,n是P的长度。这U算法的~陷是匹配过E中带有回溯——准地说是T串存在回溯,也就是当匚w不成功的时候,之前q行的匹配完全变为无用功Q所有的比较需要重新开始?/p> <h1>3 KMP法</h1> <p>KMP法是D.E.Knuth、J.H.Morris和V.R.Pratt提出的无回溯的字W串匚w法Q算法的核心思想是设法在匹配失败的时候,量利用之前的匹配结果,消除T串的回溯问题。那么如何消除回溯呢Q请看下面的例子Q?/p> <p>假设P=abacdQ如果T=abax...Q当从头开始匹配到字符cӞ若c=xQ显Ӟ匚wq程l箋Q当c≠xӞ按照朴素的匹配算法,T串会发生回溯Q之后T串会从第2个字Wb开始重新匹配,而不是从匚wp|的字Wx开始l。但是显Ӟ对于上述的匹配过E,T串不需要从b开始重新匹配,它只需要从x开始和P的b字符l箋匚w卛_。如下:<br />匚wq程Q?br />P=abacd<br />T=abax....<br />     ^----比较到此处时发生匚wp|<br />朴素匚w法Q?br />P= abacd<br />T=abax...<br />   ^----回溯到bQ重新开始和P的匹?br />KMP法Q?br />P=  abacd<br />T=abax...<br />     ^----T串不回溯Q从x处l匹?/p> <p>现在的问题是Q按照KMP法Q匹配失败的时候,P串需要重新调整位|,但是调整的依据是什么?Knuth{h发现QP调整位置的依据和P的构造有养I和T无关。具体来_定义失效函数Qf(j)=kQ其?<=k<=jQ且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>成立的最大整数。徏立失效函数的法如下Q?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 > 1)<br />  array[0] = 0;<br /> for(i = 1; i < 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>匚wq程如下Q?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 < token_length && pattern_index < 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 支持通配W??的KMP法</h1> <p>KMP法虽然能够q行字符串匹配,但是Q在实践中字W串匚w往往q要支持通配W,MSpȝ中最常见的通配W是??。其中,?可以代表一个字W(不能没有Q,*可以代表L多个字符Q可以ؓI)。经典的KMP法针对通配W是无能为力的,但是l过单的攚w,KMP法也可以识别通配W?/p> <p>首先?Q根?的功能,?表示L字符Q也是说在匚wq程中,?永远匚w成功。因此对匚w函数的修改十分简单:<br />...<br /> while(target_index < token_length && pattern_index < pattern_length) {<br />  if(target[target_index] == pattern[pattern_index]|| pattern[pattern_index] == '?') {<br />   target_index++;<br />   pattern_index++;<br />  } else {<br />...<br />建立失效函数的过E和匚wq程cMQ修改如下:<br />...<br /> for(i = 1; i < 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>本质上,?q没有修改算法,而仅仅修改了匚w规则——遇?则一定匹配。然?与此不同Q?的作用是匚wL多个字符Q显然我们不能简单的修改匚wq程而满求。如果我们重新思?的作用,我们会发?的另一个作用就是分割PԌ卛_果P=P<sub>1</sub>*P<sub>2</sub>Q那么与其说*代表匚wL多个字符Q不如说P的匹配条件是在匹配P<sub>1</sub>子串后再匚wP<sub>2</sub>子串?/p> <p>现在回顾失效函数的作用,如果当匹配到P的j+1位时匚wp|Q那么重新开始匹配的时候,P串的位置调整到f(j)位,直到P串的位置调整?Q则匚w重新开始。但当P=P<sub>1</sub>*P<sub>2</sub>Q假如P<sub>1</sub>已经匚w成功Q而在P<sub>2</sub>中发生匹配失败,那么P串要需要调整位|,但P串无论如何调_此时也不应该调整?Q最多调整到P<sub>2</sub>的开始处Q因为P<sub>1</sub>已经匚wQ只需匚wP<sub>2</sub>卛_。假如P=abcab*abcabQ失效函数应该是Q注意之前提?的作用)Q?br />a b c a b * a b c a b<br />0 0 0 1 2 - 6 6 6 7 8</p> <p>因此Q要惌KMP支持*Q那么关键是要重新设计失效函数的建立法Q如下:<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 > 1)<br />  array[0] = 0;<br /> int begin = 0;<br /> for(i = 1; i < 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表示每段字符串的开始位|。此外,匚wq程也应该进行相应的修改Q因为字W?对于匚w没有M帮助Q它属于占位W,因此需要蟩q,匚w法如下Q?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 < token_length && pattern_index < 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>一个数字逻辑的问题:设计一个识?1011的电路,解这个问题的关键是设计个电路的DFAQ如下:<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>500){this.resized=true;this.style.width=500;}" /></p> <p>仔细看看q个状态机Q是不是和KMP的算法有几分cM呢?qƈ不是巧合Q因为KMP法中的失效函数d以等L转化Z个DFA。当然KMP的DFAq比识别11011的DFA要复杂,原因在于KMP接受的输入是全体字符集合Q识?1011的DFA只接??q两个输入。我们知道,一个正则语a和一个DFA是等LQ而KMP计算失效函数的算法,实际上等价于求DFA的过E,f(j)的值实际上表明状态j+1接受C正确的字W时应该回溯到的状态(注意此时输入ƈ没有前进Q。普通的字符串都能看成是一个正则语aQ含有通配W??的字W串也可以等L转换Z个正则表辑ּ。但是,正则语言的集合远比KMP法所能支持的模式集合的更大,期间原因q是刚才提过的输入问题。试想P=p<sub>1</sub>p<sub>2</sub>...p<sub>n</sub>Q当匚w到p<sub>j</sub>的时候,如果下一个输入字W正是p<sub>j</sub>Q那么状态机q入下一个状态,如果不是p<sub>j</sub>Q那么状态机按照实效函数的指C{Ud状态f(j-1)Q也是说KMP状态机的每个状态只能根据输入是否ؓp<sub>j</sub>来进行{UR而正则表辑ּ所对应的状态机则有所不同Q如果正则语aL=l<sub>1</sub>l<sub>2</sub>...l<sub>n</sub>Q假设这些都是字母,当匹配到l<sub>j</sub>位的时候,如果下一个输入字W正是l<sub>j</sub>Q那么状态机q入下一个状态,否则它还可以Ҏ输入的D行{U,例如l<sub>j</sub>=c<sub>1</sub>时{换到状态xQl<sub>j</sub>=c<sub>2</sub>时状态{换到y{等?/p> <h1>6 l语</h1> <p>字符串匹配问题是老问题了Qƈ没有太多新意可言Q只不过虽然KMP法十分单,但它的内在含义还是十分深ȝ。横向比较KMP、DFA和正则语a、正则表辑ּ我们会发玎ͼ它们之间存在很多的关联,而这U比较也有利于我们更好的理解q些法Q或者改q这些算法。最后说一句,试图利用目前的框架得KMP法支持全部U类的通配W(对应于正则表辑ּ是x?、x*、x+、{m,n}{等Q是不可能,而我们也不需要这么做Q因为我们还有正则表辑ּ嘛?/p> <img src ="http://www.aygfsteel.com/renyangok/aggbug/101927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/renyangok/" target="_blank">保尔?/a> 2007-03-05 15:29 <a href="http://www.aygfsteel.com/renyangok/archive/2007/03/05/101927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java整型数组q点算?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/renyangok/archive/2007/03/05/101848.html</guid><wfw:comment>http://www.aygfsteel.com/renyangok/comments/101848.html</wfw:comment><comments>http://www.aygfsteel.com/renyangok/archive/2007/03/05/101848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/renyangok/comments/commentRss/101848.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> * 整Ş数组q炚w题:qҎ左边的整数和{于双的整数和Q?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> * 求出q点位|,要求输入的数l可能是GBU?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> * <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> * 本题要求扑և整型数组的一个^衡点Q如果要扑և所有^衡点的话Q按此方法需要把每一个^衡点都存hQ?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span> <span style="COLOR: #008000">*/</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_140_665_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_199_217_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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"><</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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_291_311_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            sum </span> <span style="COLOR: #000000">+=</span> <span style="COLOR: #000000"> a[i];<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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"><</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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_386_405_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_410_435_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                subSum </span> <span style="COLOR: #000000">+=</span> <span style="COLOR: #000000"> a[i];<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_499_663_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">试用例Q^衡点?位,为n-1位,Z间位Qa的每个ؓ存了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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(t.findBalanceableNod(a));<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <img src ="http://www.aygfsteel.com/renyangok/aggbug/101848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/renyangok/" target="_blank">保尔?/a> 2007-03-05 10:40 <a href="http://www.aygfsteel.com/renyangok/archive/2007/03/05/101848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java字符串全排列问题Q经典)http://www.aygfsteel.com/renyangok/archive/2007/03/02/101515.html保尔?/dc:creator>保尔?/author>Fri, 02 Mar 2007 09:37:00 GMThttp://www.aygfsteel.com/renyangok/archive/2007/03/02/101515.htmlhttp://www.aygfsteel.com/renyangok/comments/101515.htmlhttp://www.aygfsteel.com/renyangok/archive/2007/03/02/101515.html#Feedback0http://www.aygfsteel.com/renyangok/comments/commentRss/101515.htmlhttp://www.aygfsteel.com/renyangok/services/trackbacks/101515.html /*
 * 原题如下Q用1?????q六个数字,用java写一个main函数Q打印出所有不同的排列Q?br /> * 如:612234?12346{,要求Q?4"不能在第三位Q?3"?6"不能相连. 
 * 
 * 1 把问题归lؓ囄构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向q通图Q对于每一个结Ҏq个囑Ş的遍历\径,
 * 所有结点的遍历路径是最后对q?个数字的排列l合l果集。?br /> * 2 昄q个l果集还未达到题目的要求。从以下几个斚w考虑Q?br /> * 1. 3Q?不能相连Q实际要求这个连通图的结?Q?之间不能q? 可在构造图l构时就满ҎӞ然后再遍历图。?br /> * 2. 不能有重? 考虑到有两个2Q明显会存在重复l果Q可以把l果集放在TreeSet中过滤重复结果?br /> * 3. 4不能在第三位: 仍旧在结果集中去除满x条g的结果?br /> 
*/


import  java.util.Iterator;
import  java.util.TreeSet;

public   class  Test  {

 
private  String[] b  =   new  String[]  " 1 " " 2 " " 2 " " 3 " " 4 " " 6 "  } ;

 
private   int  n  =  b.length;

 
private   boolean [] visited  =   new   boolean [n];

 
private   int [][] a  =   new   int [n][n];

 
private  String result  =   "" ;

 
private  TreeSet set  =   new  TreeSet();

 
public   static   void  main(String[] args)  {
  
new  Test().start();
 }


 
private   void  start()  {

  
//  Initial the map a[][]
   for  ( int  i  =   0 ; i  <  n; i ++ {
   
for  ( int  j  =   0 ; j  <  n; j ++ {
    
if  (i  ==  j)  {
     a[i][j] 
=   0 ;
    }
  else   {
     a[i][j] 
=   1 ;
    }

   }

  }


  
//  3 and 5 can not be the neighbor.
  a[ 3 ][ 5 =   0 ;
  a[
5 ][ 3 =   0 ;

  
//  Begin to depth search.
   for  ( int  i  =   0 ; i  <  n; i ++ {
   
this .depthFirstSearch(i);
  }


  
//  Print result treeset.
  Iterator it  =  set.iterator();
  
while  (it.hasNext())  {
   String string 
=  (String) it.next();
   System.out.println(string);
  }

 }


 
private   void  depthFirstSearch( int  startIndex)  {
  visited[startIndex] 
=   true ;
  result 
=  result  +  b[startIndex];
  
if  (result.length()  ==  n)  {
//    "4" can not be the third position.
    if  (result.indexOf( " 4 " !=   2 {
//     Filt the duplicate value.
    set.add(result);
   }

  }

  
for  ( int  j  =   0 ; j  <  n; j ++ {
   
if  (a[startIndex][j]  ==   1   &&  visited[j]  ==   false {
    depthFirstSearch(j);
   }

  }


  
//  restore the result value and visited value after listing a node.
  result  =  result.substring( 0 , result.length()  -   1 );
  visited[startIndex] 
=   false ;
 }

}


只要q样定义图,Ҏ不用在代码中写IF ELSE语句?
实际上基于图的算法好处在于,只要你能定义好满题目要求的囄构,遍历的结果就是你要的l果Q不用Q何对遍历l果做Q何处理。包括本题中的:4不能在第三位|,3Q?不能相连Q唯一性要求,其实都可以在体现在构造的囑Şl构里,然后直接遍历囑֏得自p的结果。而不用再ơ处理结果集。只是说q里实际上对其它要求要体现在囄构里有困难(理论上是可以的)Q但L3Q?不能相接是很好构造的Q就是上面的代码D|解释的?/p>

关于囑Ş数据l构先看看数据结构的书,主要是将如何利用二维数组描述囄构,再看看图的深度遍历实现原理。最后再应用到这个问题上来,自然׃难明白了?/p>

]]>
动态规划算?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/renyangok/archive/2007/02/27/100957.html</guid><wfw:comment>http://www.aygfsteel.com/renyangok/comments/100957.html</wfw:comment><comments>http://www.aygfsteel.com/renyangok/archive/2007/02/27/100957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/renyangok/comments/commentRss/100957.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/renyangok/services/trackbacks/100957.html</trackback:ping><description><![CDATA[ <p>Q{自:<a >http://chinavery.100steps.net/chengxuyuan/4759.html</a>Q?br />动态规划是本书介绍的五U算法设计方法中隑ֺ最大的一U,它徏立在最优原则的基础上。采用动态规划方法,可以优雅而高效地解决许多用贪婪算法或分而治之算法无法解决的问题。在介绍动态规划的原理之后Q本章将分别考察动态规划方法在解决背包问题、图象压~、矩阵乘法链、最短\径、无交叉子集和元件折叠等斚w的应用?/p> <p>3.1 法思想</p> <p>和贪婪算法一P在动态规划中Q可一个问题的解决Ҏ视ؓ一pd决策的结果。不同的是,在贪婪算法中Q每采用一ơ贪婪准则便做出一个不可撤回的决策Q而在动态规划中Q还要考察每个最优决{序列中是否包含一个最优子序列?/p> <p>?-1 [最短\l] 考察? 2 - 2中的有向图。假设要L一条从源节点s= 1到目的节点d= 5的最短\径,即选择此\径所l过的各个节炏V第一步可选择节点2Q??。假N择了节?Q则此时所要求解的问题变成Q选择一条从3?的最短\径。如??的\径不是最短的Q则?开始经q??的\径也不会是最短的。例如,若选择的子路径Q非最短\径)?Q?Q? (耗费? )Q则1?的\径ؓ1Q?Q?Q? (耗费?1 )Q这比选择最短子路径3Q?Q?而得到的1?的\?Q?Q?Q? (耗费?) 耗费更大?/p> <p>所以在最短\径问题中Q假如在的第一ơ决{时到达了某个节点vQ那么不v 是怎样定的,此后选择从v 到d 的\径时Q都必须采用最优策略?/p> <p>?-2 [0/1背包问题] 考察1 3 . 4节的0 / 1背包问题。如前所qͼ在该问题中需要决定x1 .. xn的倹{假设按i = 1Q?Q?Qn 的次序来定xi 的倹{如果置x1 = 0Q则问题转变为相对于其余物品Q即物品2Q?Q?QnQ,背包定w仍ؓc 的背包问题。若|x1 = 1Q问题就变ؓ关于最大背包容量ؓc-w1 的问题。现设r?{cQc-w1 } 为剩余的背包定w?/p> <p>在第一ơ决{之后,剩下的问题便是考虑背包定w为r 时的决策。不x1 ?或是1Q[x2 Q?Qxn ] 必须是第一ơ决{之后的一个最优方案,如果不是Q则会有一个更好的Ҏ[y2Q?Qyn ]Q因而[x1Qy2Q?Qyn ]是一个更好的Ҏ?/p> <p>假设n=3, w=[100,14,10], p=[20,18,15], c= 11 6。若设x1 = 1Q则在本ơ决{之后,可用的背包容量ؓr= 116-100=16 。[x2Qx3 ]=[0,1] W合定w限制的条Ӟ所得gؓ1 5Q但因ؓ[x2Qx3 ]= [1Q?] 同样W合定w条g且所得gؓ1 8Q因此[x2Qx3 ] = [ 0Q?] q最优策略。即x= [ 1Q?Q?] 可改qؓx= [ 1Q?Q? ]。若设x1 = 0Q则对于剩下的两U物品而言Q容量限制条件ؓ11 6。MQ如果子问题的结果[x2Qx3 ]不是剩余情况下的一个最优解Q则[x1Qx2Qx3 ]也不会是M的最优解?/p> <p>?-3 [航费] 某航UhD为:从亚特兰大到U约或芝加哥Q或从洛杉矶C特兰大的费用? 1 0 0Q从芝加哥到U约h$ 2 0Q而对于\l亚特兰大的旅客Q从亚特兰大到芝加哥的费用仅? 2 0。从z杉矶到U约的航U涉及到对中转机场的选择。如果问题状态的形式为(LQ终点)Q那么在选择从洛杉矶C特兰大后Q问题的状态变为(亚特兰大Q纽U)。从亚特兰大到纽U的最便宜航线是从亚特兰大直飞U约Q票? 1 0 0。而用直飞方式时Q从z杉矶到U约的花费ؓ$ 2 0 0。不q,从洛杉矶到纽U的最便宜航线为洛杉矶-亚特兰大-芝加?U约Q其总花费ؓ$ 1 4 0Q在处理局部最优\径亚特兰大到U约q程中选择了最低花费的路径Q亚特兰?芝加?U约Q?/p> <p>如果用三l数l(t a gQv点,l点Q表C问题状态,其中t a g?表示转飞Q?t a g?表示其他情ŞQ那么在到达亚特兰大后,状态的三维数组变为( 0Q亚特兰大,U约Q,它对应的最优\径是l由芝加哥的那条路径?/p> <p>当最优决{序列中包含最优决{子序列Ӟ可徏立动态规划递归方程Q?d y n a m i c -programming recurrence equationQ,它可以帮助我们高效地解决问题?/p> <p>?-4 [0/1背包] 在例3 - 2? / 1背包问题中,最优决{序列由最优决{子序列l成。假设f (i,y) 表示? 5 - 2中剩余容量ؓyQ剩余物品ؓiQi + 1Q?Qn 时的最优解的|卻I和利用最优序列由最优子序列构成的结论,可得到f 的递归式。f ( 1 ,c) 是初始时背包问题的最优解。可使用Q?1 5 - 2Q式通过递归或P代来求解f ( 1 ,c)。从f (n, * )开始P式, f (n, * )由(1 5 - 1Q式得出Q然后由Q?1 5 - 2Q式递归计算f (i,*) ( i=n- 1Qn- 2Q?Q?2 )Q最后由Q?1 5 - 2Q式得出f ( 1 ,c)?/p> <p>对于? 5 - 2Q若0≤yQ? 0Q则f ( 3 ,y) = 0Q若y? 0Qf ( 3 ,y) = 1 5。利用递归式(1 5 - 2Q,可得f (2, y) = 0 ( 0≤yQ?0 )QfQ?QyQ? 1 5Q? 0≤yQ? 4Q;fQ?QyQ? 1 8Q? 4≤yQ? 4Q和fQ?QyQ? 3 3Qy? 4Q。因此最优解f ( 1 , 11 6 ) = m a x {fQ?Q?1 6Q,fQ?Q?1 6 - w1Q? p1} = m a x {fQ?Q?1 6Q,fQ?Q? 6Q? 2 0 } = m a x { 3 3Q? 8 } = 3 8?/p> <p>现在计算xi |步骤如下Q若f ( 1 ,c) =f ( 2 ,c)Q则x1 = 0Q否则x1 = 1。接下来需从剩余容量c-w1中寻求最优解Q用f (2, c-w1) 表示最优解。依此类推,可得到所有的xi (i= 1.n) 倹{?/p> <p>在该例中Q可得出f ( 2 , 11 6 ) = 3 3≠f ( 1 , 11 6 )Q所以x1 = 1。接着利用q回? 8 -p1=18 计算x2 及x3Q此时r = 11 6 -w1 = 1 6Q又由f ( 2 , 1 6 ) = 1 8Q得f ( 3 , 1 6 ) = 1 4≠f ( 2 , 1 6 )Q因此x2 = 1Q此时r= 1 6 -w2 = 2Q所以f (3,2) =0Q即得x3 = 0?/p> <p>动态规划方法采用最优原则( principle of optimalityQ来建立用于计算最优解的递归式。所谓最优原则即不管前面的策略如何,此后的决{必LZ当前状态(׃一ơ决{生)的最优决{。由于对于有些问题的某些递归式来说ƈ不一定能保证最优原则,因此在求解问题时有必要对它进行验证。若不能保持最优原则,则不可应用动态规划方法。在得到最优解的递归式之后,需要执行回溯(t r a c e b a c kQ以构造最优解?/p> <p>~写一个简单的递归E序来求解动态规划递归方程是一件很׃h的事。然而,正如我们在下文看到的,如果不努力地去避免重复计,递归E序的复杂性将非常可观。如果在递归E序设计中解决了重复计算问题Ӟ复杂性将急剧下降。动态规划递归方程也可用P代方式来求解Q这时很自然地避免了重复计算。尽P代程序与避免重复计算的递归E序有相同的复杂性,但P代程序不需要附加的递归栈空_因此比避免重复计算的递归E序更快?/p> <p> <br />3.2 应用 </p> <p>3.2.1 0/1背包问题 </p> <p>1. 递归{略</p> <p>在例3 - 4中已建立了背包问题的动态规划递归方程Q求解递归式( 1 5 - 2Q的一个很自然的方法便是用程? 5 - 1中的递归法。该模块假设p、w 和n 入,且p 为整型,F(1,c) q回f ( 1 ,c) 倹{?/p> <p>E序15-1 背包问题的递归函数</p> <p>int F(int i, int y)</p> <p>{// q回f ( i , y ) .</p> <p>if (i == n) return (y < w[n]) ? 0 : p[n];</p> <p>if (y < 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>E序1 5 - 1的时间复杂性t (n)满Qt ( 1 ) =aQtQnQ≤2tQn- 1Q?bQnQ?Q,其中a、b 为常数。通过求解可得t (n) =O( 2n)?/p> <p>?-5 设n= 5Qp= [ 6 , 3 , 5 , 4 , 6 ]Qw=[2,2,6,5,4] 且c= 1 0 ,求f ( 1 , 1 0 )。ؓ了确定f ( 1 , 1 0 )Q调用函数F ( 1 , 1 0 )。递归调用的关pd? 5 - 1的树型结构所C。每个节点用y值来标记。对于第j层的节点有i=jQ因此根节点表示F ( 1 , 1 0 )Q而它有左孩子和右孩子Q分别对应F ( 2 , 1 0 )和F ( 2 , 8 )。d执行? 8ơ递归调用。但我们注意刎ͼ其中可能含有重复前面工作的节点,如f ( 3 , 8 )计算q两ơ,相同情况的还有f ( 4 , 8 )、f ( 4 , 6 )、f ( 4 , 2 )、f ( 5 , 8 )、f ( 5 , 6 )、f ( 5 , 3 )、f (5,2) 和f ( 5 , 1 )。如果保留以前的计算l果Q则可将节点数减? 9Q因为可以丢弃图中的阴媄节点?/p> <p>正如在例3 - 5中所看到的,E序1 5 - 1做了一些不必要的工作。ؓ了避免f (i,y)的重复计,必须定义一个用于保留已被计出的f (i,y)值的表格LQ该表格的元素是三元l?i,y,f (i,y) )。在计算每一个f (i,y)之前Q应查表L中是否已包含一个三元组(i,y, * )Q其?表示L倹{如果已包含Q则从该表中取出f (i,y)的|否则Q对f (i,y)q行计算q将计算所得的三元l?i,y,f (i,y) )加入表L。L既可以用散列Q见7 . 4节)的Ş式存储,也可用二叉搜索树(?1?的Ş式存储?/p> <p>2. 权ؓ整数的P代方?/p> <p>当权为整数时Q可设计一个相当简单的法Q见E序1 5 - 2Q来求解f ( 1 ,c)。该法Z? - 4所l出的策略,因此每个f (i,y) 只计一ơ。程? 5 - 2用二l数lf [ ][ ]来保存各f 的倹{而回溯函数Tr a c e b a c k用于定q? 5 - 2所产生的xi 倹{函数K n a p s a c k的复杂性ؓ( n cQ,而Tr a c e b a c k的复杂性ؓ( n )?/p> <p>E序15-2 f 和x 的P代计?/p> <p>template<class T></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 <= yMax; y++)</p> <p>f[n][y] = 0;</p> <p>for (int y = w[n]; y <= c; y++)</p> <p>f[n][y] = p[n];</p> <p>// 计算剩下的f</p> <p>for (int i = n - 1; i > 1; i--) {</p> <p>for (int y = 0; y <= yMax; y++)</p> <p>f[i][y] = f[i+1][y];</p> <p>for (int y = w[i]; y <= 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 >= w[1])</p> <p>f[1][c] = max(f[1][c], f[2][c-w[1]] + p[1]);</p> <p>}</p> <p>template<class T></p> <p>void Traceback(T **f, int w[], int c, int n, int x[])</p> <p>{// 计算x</p> <p>for (int i = 1; i < 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. 元组ҎQ?选读Q?/p> <p>E序1 5 - 2有两个缺点:1) 要求权ؓ整数Q?) 当背包容量c 很大ӞE序1 5 - 2的速度慢于E序1 5 - 1。一般情况下Q若cQ?nQ程? 5 - 2的复杂性ؓW (n2n )。可利用元组的方法来克服上述两个~点。在元组Ҏ中,对于每个iQf (i, y) 都以数对(y, f (i, y)) 的Ş式按y的递增ơ序存储于表P(i)中。同Ӟ׃f (i, y) 是y 的非递减函数Q因此P(i) 中各数对(y, f (i, y)) 也是按f (i, y) 的递增ơ序排列的?/p> <p>?-6 条g同例3 - 5。对f 的计如? 5 - 2所C。当i= 5Ӟf 由数寚w合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 )Q利用式Q? 5 - 2Q得f ( 1 , 1 0 ) = m a x{f ( 2 , 1 0 )Qf ( 2 , 8 ) + p 1}。由P( 2 )得f ( 2 , 1 0 ) = 11、f (2,8)=9 (f ( 2 , 8 ) = 9来自数对( 6Q? ) )Q因此f ( 1 , 1 0 ) = m a x?1 , 1 5? 1 5。现在来求xi 的|因ؓf ( 1 , 1 0 ) =f ( 2 , 6 ) +p1Q所以x1 = 1Q由f ( 2 , 6 ) =f ( 3 , 6 - w 2 ) +p2 =f ( 3 , 4 ) +p2Q得x2 = 1Q由f ( 3 , 4 ) =f ( 4 , 4 ) =f ( 5 , 4 )得x3=x4 = 0Q最后,因f ( 5 , 4 )?得x5= 1?/p> <p>查每个P(i) 中的数对Q可以发现每?y,f (i,y)) 对应于变量xi , ., xn ?/1 赋值的不同l合。设Qa,bQ和Qc,dQ是对应于两l不同xi , ., xn ? / 1赋|若a≥c且bQdQ则(a, b) ?b, c) 支配。被支配者不必加入P(i)中。若在相同的数对中有两个或更多的赋|则只有一个放入P(i)。假设wn≤CQP(n)=[(0,0), (wn , pn ) ]QPQnQ中对应于xn 的两个数对分别等??。对于每个iQP(i)可由P(i+ 1 )得出。首先,要计数对的有序集合QQ得当且仅当wi≤s≤c?s-wi , t-pi )为P(i+1) 中的一个数ҎQ(s,tQؓQ中的一个数寏V现在Q中包含xi = 1时的数对集,而P(i+ 1 )对应于xi = 0的数寚w。接下来Q合qQ和P(i+ 1 )q删除受支配者和重复值即可得到P(i)?/p> <p>?-7 各数据同? 5 - 6。P(5)=[(0,0),(4,6)], 因此Q= [ ( 5 , 4 ) , ( 9 , 1 0 ) ]。现在要P( 5 )和Q合ƈ得到P( 4 )。因( 5 , 4 )? 4 , 6 )支配Q可删除( 5 , 4 )Q所以PQ?Q?[(0,0), (4,6), (9,10)]。接着计算P( 3 )Q首先由P( 4 )得Q=[(6,5), (10,11 ) ]Q然后又由合q方法得P(3)=[(0,0), (4,6), (9,10), (10,11 ) ]。最后计P( 2 )Q由P( 3 )得Q= [ ( 2 , 3 )Q? 6 , 9 ) ]QP( 3 )与Q合ƈ得P(2)=[(0,0), (2,3), (4,6), (6,9), (9,10). (10,11 ) ]。因为每个P(i) 中的数对对应于xi , ., xn 的不? / 1赋|因此P(i) 中的数对不会过2n-i+ 1个。计P(i) Ӟ计算Q需消? |P(i+ 1 ) |Q的旉Q合qP(i+1) 和Q同样需? |P(i+ 1 ) | )的时间。计所有P(i) 时所需要的L间ؓQ?(n ?i=2|P(i + 1)|= O ( 2n )。当权ؓ整数Ӟ|P(i) |≤c+1, 此时复杂性ؓO ( m i n {n c, 2n } )?/p> <p>? . 4 . 3节定义的Q数字化囑փ是m×m的像素阵列。假定每个像素有一? ~ 2 5 5的灰度倹{因此存储一个像素至多需8位。若每个像素存储都用最大位8位,则ȝ存储I间?m2 位。ؓ了减存储空_我们采用变长模式( variable bit schemeQ,即不同像素用不同位数来存储。像素gؓ0?时只需1位存储空_??各需2位;?Q?Q??各需3位;以此cLQ用变长模式的步骤如下Q?/p> <p>1) 囑փU性化Ҏ?5-3a 中的折线m×ml图像{换ؓ1×m2 l矩c?/p> <p>2) 分段像素组分成若干个段Q分D原则是Q每D中的像素位数相同。每个段是相d素的集合且每D|多含2 5 6个像素,因此Q若相同位数的像素超q? 5 6个的话,则用两个以上的段表示?/p> <p>3) 创徏文g创徏三个文gQS e g m e n t L e n g t h, BitsPerPixel 和P i x e l s。第一个文件包含在2 )中所建的D늚长度(? )Q文件中各项均ؓ8位长。文件BitsPerPixel l出了各D中每个像素的存储位敎ͼ?Q,文g中各均?位。文件Pixels 则是以变长格式存储的像素的二q制丌Ӏ?/p> <p>4) 压羃文g压羃?) 中所建立的文Ӟ以减空间需求?/p> <p>上述压羃Ҏ的效率(用所得压~率表示Q很大程度上取决于长D늚出现频率?/p> <p>?-8 考察?5-3b ?×4囑փ。按照蛇形的行主ơ序Q灰度gơؓ1 0Q?Q? 2Q? 0Q? 0Q? 5Q? 5Q? 2Q?Q? 0Q?Q? 5Q?1Q? 3 0Q? 6 0? 4 0。各像素所需的位数分别ؓ4Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q?Q??Q按{长的条件将像素分段Q可以得?个段[ 1 0Q?Q? 2 ]、[ 4 0Q? 0Q? 5 ]、[15, 12, 8, 10, 9, 15, 11] 和E130, 160, 240Q。因此,文gSegmentLength ?Q?Q?Q?Q文件BitsPerSegment 的内容ؓ3Q?Q?Q?Q文件P i x e l s包含了按蛇Ş行主ơ序排列? 6个灰度|其中头三个各?位存储,接下来三个各?位,再接下来的七个各?位,最后三个各?位存储。因此存储单元中? 0位存储了前六个像素:</p> <p>1010 1001 1100 111000 110010 100011</p> <p>q三个文仉要的存储I间分别为:文gSegmentLength 需3 2位;BitsPerSegment 需1 2位;Pixels 需8 2位,共需1 2 6位。而如果每个像素都?位存储,则存储空间需8×1 6 = 1 2 8位,因而在本例囑փ中,节省?位的I间?/p> <p>假设?) 之后Q生了n 个段。段标题Qsegment headerQ用于存储段的长度以及该D中每个像素所占用的位数。每个段标题需11位。现假设li 和bi 分别表示Wi D늚D长和该D|个像素的长度Q则存储Wi D像素所需要的I间为li *bi 。在2) 中所得的三个文g的d储空间ؓ11 n+n ?i = 1li bi。可通过某些相L合ƈ的方式来减少I间消耗。如当段i 和i+ 1被合q时Q合q后的段长应为li +li + 1。此时每个像素的存储位数为m a x {biQbi +1 } 位。尽这U技术增加了文gP i x e l s的空间消耗,但同时也减少了一个段标题的空间?/p> <p>?-9 如果例1 5 - 8中的W?D和W?D合qӞ合ƈ后,文gS e g m e n t L e n g t h变ؓ5Q?Q?QBitsPerSegment 变ؓ5Q?Q?。而文件Pixels 的前3 6位存储的是合q后的第一D:001010 001001 001100 111000 110010 100011其余的像素(? 5 - 8W?D)没有改变。因为减了1个段标题Q文件S e g m e n t L e n g t h和BitsPerPixel 的空间消耗共减少?1位,而文件Pixels 的空间增?位,因此d节约的空间ؓ5位,I间L耗ؓ1 2 1位?/p> <p>我们希望能设计一U算法,使得在生n 个段之后Q能对相Lq行合ƈQ以便生一个具有最空间需求的新的D集合。在合ƈ盔RD之后,可利用诸如L Z W法(? . 5节)和霍夫曼~码Q见9 . 5 . 3节){其他技术来q一步压~这三个文g?/p> <p>令sq 为前q 个段的最优合q所需要的I间。定义s0 = 0。考虑Wi D?iQ? )Q假如在最优合qC中,Wi D与Wi- 1Qi- 2Q?Qi-r+1 D늛合ƈQ而不包括Wi-r Dc合qC所需要的I间消耗等于:W?D到Wi-r D|需I间+ 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>ljQbmax (a, b)= m a x {ba , ..., bb }。假如在C中第1D到Wi-r D늚合ƈ不是最优合qӞ那么需要对合ƈq行修改Q以使其h更小的空间需求。因此还必须Ҏ1到段i-r q行最优合qӞ也即保证最优原则得以维持。故C的空间消耗ؓQ?/p> <p>si = si-r +l s u mQi-r+1, iQ?b m a xQi-r+1, iQ? 11</p> <p>r 的g?到i 之间Q其中要求l s u m不超q? 5 6 (因ؓD长限制? 5 6之内)。尽我们不知道如何选择rQ但我们知道Q由于Ch最的I间需求,因此在所有选择中, r 必须产生最的I间需求?/p> <p>假定k a yi 表示取得最值时k 的|sn 为n D늚最优合q所需要的I间Q因而一个最优合q可用kay 的值构造出来?/p> <p>?-10 假定?) 中得C个段Q它们的长度为[ 6Q?Q? 0Q?Q? ]Q像素位Cؓ[ 1Q?Q?Q?Q? ]Q要用公式(1 5 - 3Q计snQ必d求出sn-1Q?Qs0 的倹{s0 ?Q现计算s1Qs1 =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>以此cLQ可得s1.s5 = [ 1 7Q? 9Q? 7Q? 3Q?2] Qk a y1.k a y5 = [ 1Q?Q?Q?Q? ]。因为s5 = 8 2Q所以最优空间合q8 2位的I间。可由k a y5 导出本合q的方式Q过E如下:因ؓk a y5 = 4Q所以s5 是由公式Q? 5 - 3Q在k=4 时取得的Q因而最优合q包括:D?到段( 5 - 4 ) = 1的最优合q以及段2Q?Q??的合q。最后仅剩下两个D:D?以及D?到段5的合q段?/p> <p>1. 递归Ҏ</p> <p>用递归式(1 5 - 3Q可以递归地算出si 和k a yi。程? 5 - 3为递归式的计算代码。lQbQ和k a y是一l的全局整型数组QL是段镉KӞ 2 5 6Q,h e a d e r为段标题所需的空? 11 )。调用S ( n )q回sn 的g同时得出k a y倹{调用Tr a c e b a c k ( k a y, n )可得到最优合q?/p> <p>现讨论程? 5 - 3的复杂性。t( 0 ) =cQc Z个常敎ͼQ?QnQ?Q,因此利用递归的方法可得t (n) = O ( 2n )。Tr a c e b a c k的复杂性ؓ(n)?/p> <p>E序15-3 递归计算s , k a y及最优合q?/p> <p>int S(int i)</p> <p>{ / /q回S ( i )q计k a y [ i ]</p> <p>if (i == 0 ) return 0;</p> <p>//k = 1? Ҏ公式Q?1 5 - 3Q计最?/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 <= i && lsum+l[i-k+1] <= L; k++) {</p> <p>lsum += l[i-k+1];</p> <p>if (bmax < b[i-k+1]) bmax = b[i-k+1];</p> <p>int t = S(i-k);</p> <p>if (s > 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>{// 合ƈD?/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 << "New segment begins at " << (n - kay[n] + 1) << endl;</p> <p>}</p> <p>2. 无重复计的递归Ҏ</p> <p>通过避免重复计算siQ可函数S的复杂性减到(n)。注意这里只有n个不同的si?/p> <p>? - 11 再考察? 5 - 1 0中五个段的例子。当计算s5 Ӟ先通过递归调用来计s4Q?Qs0。计s4 Ӟ通过递归调用计算s3Q?Qs0Q因此s4 只计了一ơ,而s3 计算了两ơ,每一ơ计s3要计一ơs2Q因此s2 p了四次Q而s1 重复计算? 6ơ!可利用一个数ls 来保存先前计过的si 以避免重复计。改q后的代码见E序1 5 - 4Q其中s为初gؓ0的全局整型数组?/p> <p>E序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] > 0) return s[i]; //已计完</p> <p>/ /计算s [ i ]</p> <p>/ /首先Ҏ公式Q? 5 - 3Q计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 <= i && lsum+l[i-k+1] <= L; k++) {</p> <p>lsum += l[i-k+1];</p> <p>if (bmax < b[i-k+1]) bmax = b[i-k+1];</p> <p>int t = S(i-k);</p> <p>if (s[i] > 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>Z定E序1 5 - 4的时间复杂性,我们用分期计模式( amortization schemeQ。在该模式中QL间被分解q个不同,通过计算各项的时间然后求和来获得L间。当计算si Ӟ若sj q未出Q则把调用S(j) 的消耗计入sj Q若sj 已算出,则把S(j) 的消耗计入si (q里sj依次把计新sq 的消耗{U至每个sq )。程? 5 - 4的其他消耗也被计入si。因为L? 5 6之内的常C每个li 臛_?Q所以程? 5 - 4的其他消耗ؓ( 1 )Q即计入每个si 的量是一个常敎ͼ且si 数目为nQ因而d作量?n)?/p> <p>3. q代Ҏ</p> <p>倘若用式Q? 5 - 3Q依序计s1 , ., snQ便可得C个复杂性ؓ(n)的P代方法。在该方法中Q在si 计算之前Q?sj 必须已计好。该Ҏ的代码见E序1 5 - 5Q其中仍利用函数Tr a c e b a c kQ见E序1 5 - 3Q来获得最优合q?/p> <p>E序15-5 q代计算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 - 3Q计s [ i ]</p> <p>for (int i = 1; i <= 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<= i && lsum+l[i-k+1]<= L; k++) {</p> <p>lsum += l[i-k+1];</p> <p>if (bmax < b[i-k+1]) bmax = b[i-k+1];</p> <p>if (s[i] > 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章练? 6Q。我们把m n p作ؓ两个矩阵怹所需旉的测量倹{现假定要计三个矩阵A、B和C的乘U,有两U方式计此乘积。在W一U方式中Q先用A乘以B得到矩阵DQ然后D乘以C得到最l结果,q种乘法的顺序可写ؓ(A*B) *C。第二种方式写ؓA* (B*C) ,道理同上。尽这两种不同的计顺序所得的l果相同Q但旉消耗会有很大的差距?/p> <p>?-12 假定A? 0 0×1矩阵QB?×1 0 0矩阵QC? 0 0×1矩阵Q则A*B的时间耗费?0 0 0 0Q得到的l果D? 0 0×1 0 0矩阵Q再与C怹所需的时间耗费? 000 000Q因此计?A*B) *C的L间ؓ1 010 000。B*C的时间耗费?0 000Q得到的中间矩阵?×1矩阵Q再与A怹的时间消耗ؓ1 0 0Q因而计A*QB*CQ的旉耗费竟只?0 100Q而且Q计( A*BQ?CӞq需10 000个单元来存储A*BQ而A*QB*CQ计过E中Q只需?个单元来存储B*C?/p> <p>下面举一个得益于选择合适秩序计A*B*C矩阵的实例:考虑两个3l图像的匚w。图像匹配问题的要求是,定一个图像需旋{、^Ud~放多少ơ才能D另一个图像。实现匹配的Ҏ之一便是执行U? 0 0ơP代计,每次q代需计算1 2×1个向量TQ?/p> <p>T=?A(x, y, z) *B(x, y, z)*C(x, y, z )</p> <p>其中AQB和C分别? 2×3Q?×3?×1矩阵?x , y, z) 为矩阵中向量的坐标。设t 表示计算A(x , y, z) *B(x , y, z) *C(x , y, z)的计量。假定此囑փ? 5 6×2 5 6×2 5 6个向量,在此条g中,q? 0 0个P代所需的总计量q似? 0 0 * 2 5 63 * t? . 7 * 1 09 t。若三个矩阵是按由左向右的顺序相乘的Q则t = 1 2 * 3 * 3 + 1 2 * 3 *1= 1 4 4Q但如果从右向左怹Q?t = 3 * 3 * 1 + 1 2 * 3 * 1 = 4 5。由左至双约需2 . 4 * 1 011个操作,而由双左计大概只需7 . 5 * 1 01 0个操作。假如用一个每U可执行1亿次操作的计机Q由左至右需4 0分钟Q而由双左只需1 2 . 5分钟?/p> <p>在计矩阵运A*B*CӞ仅有两种乘法序Q由左至x由右臛_Q,所以可以很Ҏ出每种序所需要的操作敎ͼq择操作数比较少的那U乘法顺序。但对于更多矩阵怹来说Q情况要复杂得多。如计算矩阵乘积M1×M2×.×MqQ其中Mi 是一个ri×ri + 1 矩阵( 1≤i≤q)。不妨考虑q=4 的情况,此时矩阵q算A*B*C*D可按以下方式Q顺序)计算Q?/p> <p>A* ( (B*C) *D) A* (B* (C*D)) (A*B) * (C*D) (A* (B*C) ) *D</p> <p>不难看出计算的方法数会随q 以指数增加。因此,对于很大的q 来说Q考虑每一U计顺序ƈ选择最优者已是不切实际的?/p> <p>现在要介l一U采用动态规划方法获得矩阵乘法次序的最优策略。这U方法可算法的旉消耗降?q3 )。用Mi j 表示链Mi×.×Mj Qi≤jQ的乘积。设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 的递归式可用递归或P代的Ҏ来求解。c( 1Qq) 为用最优法计算矩阵铄消耗,k a y( 1 ,q) 为最后一步的消耗。其余的乘积可由k a y值来定?/p> <p>1. 递归Ҏ</p> <p>与求? / 1背包及图像压~问题一P本递归Ҏ也须避免重复计算c (i, j) 和k a y(i, j)Q否则算法的复杂性将会非帔R?/p> <p>?-13 设q= 5和r =Q? 0 , 5 , 1 , 1 0 , 2 , 1 0Q,式中待求的c 中有四个c的s= 0?Q因此用动态规划方法可立即求得它们的| c( 1 , 1 ) =c( 5 , 5 ) = 0 ;c(1,2)=50; c( 4 , 5 ) = 2 0 0。现计算C( 2Q? )Qc( 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 } Q? 5 - 5Q其中c( 2 , 2 ) =c( 5 , 5 ) = 0Qc( 2 , 3 ) = 5 0Qc(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 ) = 4Qk ay( 2 , 4 ) = 2。现?计算c(2,5) 所需的所有中间值都已求得,它们代入式Q? 5 - 5Q得Q?/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 - 4Q计c( 1 , 5 )Q在此之前必ȝ出c( 3 , 5 )、c(1,3) 和c( 1 , 4 )。同上述q程Q亦可计出它们的值分别ؓ4 0? 5 0? 0Q相应的k a y 值分别ؓ4??。代入式Q? 5 - 4Q得Q?/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 0Q由k a y(1,5) 值可推出该算法的最后一步, k a y(1,5) {于2Q因此最后一步ؓM1 2×M3 5Q而M12 和M35 都是用最优法计算而来。由k a y( 1 , 2 ) = 1知M12 {于M11×M2 2Q同理由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) 的递归代码见程? 5 - 6。在函数C中,r 为全局一l数l变量, k a y是全局二维数组变量Q函数Cq回c(i j) 之g|k a y [a] [b] =k ay (a , b) (对于Ma , b)Q其中c(a , b)在计c(i,j) 时皆已算出。函数Traceback 利用函数C中已出的k a y值来推导出最优乘法算法的步骤?/p> <p>设t(q)为函数C的复杂性,其中q=j-i+ 1Q即Mij 是q个矩阵运的l果Q。当q??Ӟt(q) =dQ其中d Z常数Q而q> 2Ӟt (q)=2q-1?k = 1t (k ) +e qQ其中e 是一个常量。因此当qQ?Ӟt(q)Q?t (q- 1 ) +eQ所以t (q)= W ( 2q)。函数Traceback 的复杂性ؓ(q)?/p> <p>E序15-6 递归计算c (i, j) 和kay (i, j)</p> <p>int C(int i, int j)</p> <p>{ / /q回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 < 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 < 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 << "Multiply M" << i << ", "<< kay[i][j];</p> <p>cout << " and M " << (kay[i][j]+1) << ", " << j << end1;</p> <p>}</p> <p>2. 无重复计的递归Ҏ</p> <p>若避免再ơ计前面已l计过的cQ及相应的k a yQ,可将复杂性降低到Qq3Q。而ؓ了避免重复计,需用一个全局数组c[ ][ ]存储c(i, j) |该数l初始gؓ0。函数C的新代码见程? 5 - 7Q?/p> <p>E序15-7 无重复计的c (i, j) 计算Ҏ</p> <p>int C(int i,int j)</p> <p>{ / /q回c(i,j) q计k a y ( i , j ) = k a y [ I ] [ j ]</p> <p>/ /避免重复计算</p> <p>/ /查是否已计算q?/p> <p>if Qc[i][j] >Q?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<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<u) {// 比最D?/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>为分析改q后函数C 的复杂性,再次使用分期计算Ҏ。注意到调用C(1, q) 时每个c (i, j)Q?≤i≤j≤qQ仅被计一ơ。要计算未计算q的c(a,b)Q需附加的工作量s =j-iQ?。将s 计入W一ơ计c (a, b) 时的工作量中。在依次计算c(a, b) Ӟq个s 会{计到每个c (a, b) 的第一ơ计时间c 中,因此每个c (i, i) 均被计入s。对于每个sQ有q-s+ 1个c(i, j) 需要计,因此ȝ工作消耗ؓq-1 ?s=1(q-s+ 1) = (q3 )?/p> <p>3. q代Ҏ</p> <p>c 的动态规划递归式可用P代的Ҏ来求解。若按s = 2Q?Q?Qq-1 的顺序计c (i, i+s)Q每个c 和kay 仅需计算一ơ?/p> <p>?-14 考察? - 1 3中五个矩늚情况。先初始化c (i, i) (0≤i?) ?Q然后对于i=1, ., 4分别计算c (i, i+ 1 )。c (1, 2)= r1 r2 r3 = 5 0Qc (2, 3)= 5 0Qc ( 3,4)=20 和c (4, 5) = 2 0 0。相应的k ay 值分别ؓ1Q?Q???/p> <p>当s= 2Ӟ可得Q?/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 )分别? 0? 0Q相应k a y值分别ؓ2??/p> <p>当s= 3Ӟ需计算c(1,4) 和c( 2 , 5 )。计c(2,5) 所需要的所有中间值均已知(? 1 5 - 5 )?Q代入计公式后可得c( 2 , 5 ) = 9 0Qk a y( 2 , 5 ) = 2。c( 1 , 4 )可用同样的公式计。最后,当s= 4Ӟ可直接用Q? 5 - 4Q式来计c( 1 , 5 )Q因式右Ҏ有项都已知?</p> <p>计算c 和kay 的P代程序见函数M a t r i x C h a i nQ见E序1 5 - 8Q,该函数的复杂性ؓ(q3 )。计出kay 后同样可用程? 5 - 6中的Traceback 函数推算出相应的最优乘法计过E?/p> <p>E序15-8 c 和kay 的P代计?/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 < 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 < q; s++)</p> <p>for (int i = 1; i <= 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 < 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 < 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为有向图Q其中每条边都有一个长度(或耗费Q,图中每条有向路径的长度等于该路径中各边的长度之和。对于每寚w?i, j)Q在点i 与j 之间可能有多条\径,各\径的长度可能各不相同。我们定义从i 到j 的所有\径中Q具有最长度的路径Zi 到j 的最短\径?/p> <p>?-15 如图1 5 - 4所C。从点1到顶?的\径有</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>p囑֏?各\径相应的长度? 0? 8?? 7Q因而\?) 是该图中点1到顶?的最短\径?/p> <p>在所有点Ҏ短\径问题( a l l - p a i r sshorest-paths problemQ中Q要L有向图G中每寚w点之间的最短\径。也是_对于每对点(i, j)Q需要寻找从i到j 的最短\径及从j 到i 的最短\径。因此对于一个n 个顶点的图来_需Lp =n(n-1) 条最短\径。假定图G中不含有长度数的环\Q只有在q种假设下才可保证G中每寚w?i, j) 之间L一条不含环路的最短\径。当有向图中存在长度于0的环路时Q可能得到长度ؓQ∞的更短\径,因ؓ包含该环路的最短\径往往可无限多ơ地加上此负长度的环路?/p> <p>讑֛G中n 个顶点的~号?到n。oc (i, j, k)表示从i 到j 的最短\径的长度Q其中k 表示该\径中的最大顶炏V因此,如果G中包含边<i, j>Q则c(i, j, 0) =?lt;i, j> 的长度;若i= j Q则c(i,j, 0)=0Q如果G中不包含?lt;i, j>Q则c (i, j, 0)= +∞。c(i, j, n) 则是从i 到j 的最短\径的长度?/p> <p>?-16 考察? 5 - 4。若k=0, 1, 2, 3Q则c (1, 3, k)= ∞;c (1, 3, 4)= 2 8Q若k = 5, 6, 7Q则c (1, 3,k) = 1 0Q若k=8, 9, 10Q则c (1, 3, k) = 9。因??的最短\径长度ؓ9。对于Q意kQ?Q如何确定c (i, j, k) 呢?中间点不超qk 的i 到j 的最短\径有两种可能Q该路径含或不含中间点k。若不含Q则该\径长度应为c(i, j, k- 1 )Q否则长度ؓ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 ) }QkQ?</p> <p>以上的递归公式一个k U运{化ؓ多个k-1 U运,而多个k-1 U运应比一个k U运简单。如果用递归Ҏ求解上式Q则计算最l结果的复杂性将无法估量。ot (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 )。这可通过递归方式Q见E序1 5 - 7矩阵N题)或P代方式来实现。出q代法的伪代码如图1 5 - 5所C?/p> <p> </p> <p>/ /L最短\径的长度</p> <p>/ /初始化cQiQjQ?Q?/p> <p>for Qint i=1Q?i < = n ; i + +Q?/p> <p>for (int j=1; j<=n; j+ + )</p> <p>c ( i ,j, 0 ) = a ( i ,j); // a 是长度邻接矩?/p> <p>/ /计算c ( i ,j, k ) ( 0 < k < = n )</p> <p>for(int k=1;k<=n;k++)</p> <p>for (int i=1;i<=n;i++)</p> <p>for (int j= 1 ;j< = n ;j+ + )</p> <p>if (c(i,k,k-1)+c(k,j, k - 1 ) < 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>?5-5 最短\径算法的伪代?/p> <p> </p> <p>注意到对于Q意iQc(i,k,k) =c(i,k,k- 1 )且c(k,i,k) =c(k,i,k- 1 )Q因而,若用c(i,j)代替? 5 - 5的c(i,j,k)Q最后所得的c(i,j) 之值将{于c(i,j,n) 倹{此时图1 5 - 5可改写成E序1 5 - 9的C + +代码。程? 5 - 9中还利用了程? 2 - 1中定义的AdjacencyWDigraph cR函数AllPairs 在c 中返回最短\径的长度。若i 到j 无通\Q则c [i] [j]被赋gؓN o E d g e。函数AllPairs 同时计算了k a y [ i ] [ j ]Q其中kay[i][j] 表示从i 到j 的最短\径中最大的k 倹{在后面看到如何根据kay 值来推断Z一个顶点到另一点的最短\径(见程? 5 - 1 0中的函数O u t p u t P a t hQ?/p> <p>E序1 5 - 9的时间复杂性ؓ(n3 )Q其中输Z条最短\径的实际旉为O (n)?/p> <p>E序15-9 c 和kay 的计?/p> <p>template<class T></p> <p>void AdjacencyWDigraph<T>::Allpairs(T **c, int **kay)</p> <p>{ / /所有点对的最短\?/p> <p>/ /对于所有i和jQ计c [ i ] [ j ]和k a y [ i ] [ j ]</p> <p>/ /初始化c [ i ] [ j ] = cQiQjQ?Q?/p> <p>for (int i = 1; i <= n; i++)</p> <p>for (int j = 1; j <= n; j++) {</p> <p>c[i][j] = a[i][j];</p> <p>kay[i][j] = 0;</p> <p>}</p> <p>for (i = 1; i <= n; i++)</p> <p>c[i][i] = 0;</p> <p>// 计算c[i][j] = c(i,j,k)</p> <p>for (int k = 1; k <= n; k++)</p> <p>for (int i = 1; i <= n; i++)</p> <p>for (int j = 1; j <= 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 && t2 != NoEdge && (t3 == NoEdge || t1 + t2 < t3)) {</p> <p>c[i][j] = t1 + t2;</p> <p>kay[i][j] = k;}</p> <p>}</p> <p>}</p> <p>E序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 << j << ' ';</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<class T></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 << "There is no path from " << i << " to " << j << endl;</p> <p>r e t u r n ; }</p> <p>cout << "The path is" << endl;</p> <p>cout << i << ' ';</p> <p>o u t p u t P a t h ( k a y, i , j ) ;</p> <p>cout << endl;</p> <p>}</p> <p>?-17 ?5-6a l出某图的长度矩阵aQ?5-6b l出q? 5 - 9所计算出的c 矩阵Q?5-6c 为对应的k a y倹{根?5-6c 中的kay |可知??的最短\径是?到k a y [ 1 ] [ 5 ] = 4的最短\径再加上??的最短\径,因ؓk a y [ 4 ] [ 5 ] = 0Q所以从4?的最短\径无中间点。从1?的最短\径经qk a y [ 1 ] [ 4 ] = 3。重复以上过E,最后可??的最短\径ؓQ?Q?Q?Q?Q??/p> <p>3.2.5 |络的无交叉子集</p> <p>?1 . 5 . 3节的交叉分布问题中,l定一个每边带n 个针脚的布线通道和一个排列C。顶部的针脚i 与底部的针脚Ci 相连Q其?≤i≤nQ数?i, Ci ) UCؓ|组。d有n 个网l需q接或连通。假设有两个或更多的布线层,其中有一个ؓ优先层,在优先层中可以用更l的q线Q其电阻也可能比其他层要得多。布U时应尽可能在优先层中布设更多的|组。而剩下的其他|组布讑֜其他层。当且仅当两个网l之间不交叉Ӟ它们可布讑֜同一层。我们的d是寻找一个最大无交叉子集QMaximum Noncrossing Su b s e tQM N S )。在该集中,L两个|组都不交叉。因(i, Ci ) 完全由i 军_Q因此可用i 来指?i, Ci )?/p> <p>?-18 考察? 5 - 7Q对应于? 0 - 1 7Q? 1 , 8 )? 2 , 7 )Q也?Ll和2Ll)交叉Q因而不能布讑֜同一层中。? 1 , 8 )Q?7,9) ?9,10) 未交叉,因此可布讑֜同一层。但q?个网lƈ不能构成一个M N SQ因有更大的不交叉子集。图1 0 - 1 7中给出的例子中,集合?( 4 , 2 ) ,( 5 , 5 ) , ( 7 , 9 ) , ( 9 , 1 0 )}是一个含4个网l的M N S?/p> <p>设M N S(i, j) 代表一个M N SQ其中所有的(u, Cu ) 满u≤iQCu≤j。os i z e(i,j) 表示M N S(i,j)的大?即网l的数目)。显然M N S(n,n)是对应于l定输入的M N SQ而s i z e(n,n)是它的大?/p> <p>?-19 对于? 0 - 1 7中的例子QM N S( 1 0 , 1 0 )是我们要扄最l结果。如? - 1 8中所指出的,s i z e( 1 0 , 1 0 ) = 4Q因? 1 , 8 )Q? 2 , 7 )Q? 7 , 9 )Q? 8 , 3 )Q? 9 , 1 0 )? 1 0 , 6 )中要么顶部针脚编h7大,要么底部针脚~号?大,因此它们都不属于M N S( 7 , 6 )。因此只需考察剩下?个网l是否属于M N S( 7 , 6 )Q如? 5 - 8所C。子集{( 3 , 4 ) , ( 5 , 5 )}是大小?的无交叉子集。没有大ؓ3的无交叉子集Q因此s i z e( 7 , 6) = 2?/p> <p>当i= 1Ӟ( 1 ,C1) 是M N S( 1 ,j) 的唯一候选。仅当j≥C1 Ӟq个|组才会是M N S( 1 ,j) 的一个成? </p> <p>下一步,考虑iQ?时的情况。若jQCiQ则(i,Ci ) 不可能是M N S( i,j) 的成员,所有属于M N S(i,j) ?u, Cu ) 都需满uQi且CuQjQ因此:s i z e(i,j) =s i z e(i- 1 ,j), j<Ci Q? 5 - 7Q?/p> <p>若j≥CiQ则(i,Ci ) 可能在也可能不在M N S(i,j) 内。若(i,Ci ) 在M N S(i,j) 内,则在M N S(i,j)中不会有q样?u,Cu )QuQi且CuQCiQ因个网l必?i, Ci ) 怺。因此M N S(i,j) 中的其他所有成员都必须满条guQi且CuQCi。在M N S(i,j) 中这L|组共有Mi- 1 , Ci- 1 个。若(i,Ci ) 不在M N S(i,j)中,则M N S(i,j) 中的所?u, Cu ) 必须满uQiQ因此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 Q? 5 - 8Q?/p> <p>虽然从(1 5 - 6Q式刎ͼ 1 5 - 8Q式可用递归法求解,但从前面的例子可以看出,即避免了重复计,动态规划递归法的效率也不够高,因此只考虑q代Ҏ。在q代q程中先用式Q? 5 - 6Q计出s i ze ( 1 ,j)Q然后再用式Q? 5 - 7Q和Q? 5 - 8Q按i=2, 3, ., n 的顺序计s i ze (i,j)Q最后再用Traceback 来得到M N S(n, n) 中的所有网l?/p> <p>?-20 ? 5 - 9l出了图1 5 - 7对应的s i z e(i,j) 倹{因s i z e( 1 0 , 1 0) = 4Q可知M N S?个网l。ؓ求得q?个网l,先从s i ze ( 1 0 , 1 0 )入手。可用(1 5 - 8Q式出s i z e( 1 0 , 1 0 )。根据式Q? 5 - 8Q时的生原因可知s i ze ( 1 0 , 1 0)=s i z e( 9 , 1 0 )Q因此现在要求M NS ( 9 , 1 0 )。由于M NS ( 1 0 , 1 0 )≠s i z e( 8 , 1 0 )Q因此M NS (9,10) 中必包含9Ll。M N S(9,10) 中剩下的|组l成M NS ( 8 , C9- 1)=M N S( 8 , 9 )。由M N S( 8 , 9 ) =M NS (7,9) 知,8Ll可以被排除。接下来要求M N S( 7 , 9 )Q因为s i z e( 7 , 9 )≠s i z e( 6 , 9 )Q所以M N S中必?Ll。M NS (7,9) 中余下的|组l成M NS ( 6 , C7- 1 ) =M N S( 6 , 8 )。根据s i z e( 6 , 8 ) =s i z e( 5 , 8 )可排?Ll。按同样的方法, 5Ll,3Ll加入M N S中,?Ll等其他|组被排除。因此回溯过E所得到的大ؓ4的M N S为{ 3 , 5 , 7 , 9 }?/p> <p>注意到在回溯q程中未用到s i z e( 1 0 ,j) (j? 0 )Q因此不必计这些倹{?/p> <p>E序1 5 - 11l出了计s i z e ( i , j ) 的P代代码和输出M N S的代码。函数M N S用来计算s i ze (i,j) 的|计算l果用一个二l数lM N来存储。size[i][j] 表示s i z e(i,j)Q其中i=j= n ?≤iQnQ?≤j≤nQ计过E的旉复杂性ؓ(n2 )。函数Traceback 在N etQ? : m - 1Q中输出所得到的M N SQ其旉复杂性ؓ(n)。因此求解M M S问题的动态规划算法的ȝ旉复杂?/p> <p>?n2 )?/p> <p>E序1 5 - 11 L最大无交叉子集</p> <p>void MNS(int C[], int n, int **size)</p> <p>{ / /对于所有的i 和jQ计s i z e [ i ] [ j ]</p> <p>/ /初始化s i z e [ 1 ] [ * ]</p> <p>for (int j = 0; j < C[1]; j++)</p> <p>size[1][j] = 0;</p> <p>for (j = C[1]; j <= n; j++)</p> <p>size[1][j] = 1;</p> <p>// 计算size[i][*], 1 < i < n</p> <p>for (int i = 2; i < n; i++) {</p> <p>for (int j = 0; j < C[i]; j++)</p> <p>size[i][j] = size[i-1][j];</p> <p>for (j = C[i]; j <= 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& 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 > 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>// 1Ll在M N S?</p> <p>if (j >= C[1])</p> <p>Net[m++] = 1; // 在M N S?/p> <p>}</p> <p>3.2.6 元g折叠</p> <p>在设计电路的q程中,工程师们会采取多U不同的设计风格。其中的两种ZQ片设计Qbit-slice designQ和标准单元设计Qstandard-cell designQ。在前一U方法中Q电路首先被设计Z个元件栈Q如?5-10a 所C)。每个元件Ci 宽ؓwi Q高为hi Q而元件宽度用片数来表C。图15-10a l出了一个四片的设计。线路是按片来连接各元g的,卌U可能连接元件Ci 的第j片到元gCi+1 的第j 片。如果某些元件的宽度不j 片,则这些元件之间不存在片j 的连Uѝ当? 5 -10a 的位Q片设计作ؓ某一大系l的一部分Ӟ则在V L SI ( Very Large Scale Integrated) 芯片上ؓ它分配一定数量的I间单元。分配是按空间宽度或高度的限制来完成的。现在的问题便是如何元件栈折叠到分配空间中去,以便量减小未受限制的尺度(如,若高度限制ؓHӞ必须折叠栈以量减小宽度WQ。由于其他尺度不变,因此~小一个尺度(如WQ等价于~小面积。可用折U方式来折叠元g栈,在每一折叠点,元g旋{1 8 0。在?5-10b 的例子中Q一? 2元g的栈折叠成四个垂直栈Q折叠点为C6 , C9 和C1 0。折叠栈的宽度是宽度最大的元g所需的片数。在?5-10b 中,栈宽各ؓ4Q?Q??。折叠栈的高度等于各栈所有元仉度之和的最大倹{在?5-10b 中栈1的元仉度之和最大,该栈的高度决定了包围所有栈的矩形高度?/p> <p>实际上,在元件折叠问题中Q还需考虑q接两个栈的U\所需的附加空间。如Q在? 5 -10b 中C5 和C6 间的U\因C6 为折叠点而弯曌Ӏ这些线路要求在C5 和C6 之下留有垂直I间Q以便能从栈1q到?。ori 为Ci 是折叠点时所需的高度。栈1所需的高度ؓ5 ?i =1hi +r6Q栈2所需高度? ?i=6hi +r6+r9?/p> <p>在标准单元设计中Q电路首先被设计成ؓh相同高度的符合线性顺序的元g排列。假设此U性顺序中的元件ؓC1Q?QCnQ下一步元件被折叠成如? 5 - 11所C的相同宽度的行。在此图中, 1 2个标准单元折叠成四个{宽行。折叠点是C4QC6 和C11。在盔R标准单元行之_使用布线通道来连接不同的行。折叠点军_了所需布线通道的高度。设li 表示当Ci 为折叠点时所需的通道高度。在? 5 - 11的例子中Q布UK道1的高度ؓl4Q通道2的高度ؓl6Q通道3的高度ؓl11。位Q片栈折叠和标准单元折叠都会引出一pd的问题,q些问题可用动态规划方法来解决?/p> <p>1. {宽位-片元件折?/p> <p>定义r1 = rn+1 =0。由元gCi 至Cj 构成的栈的高度要求ؓj ?k= ilk+ ri+ rj + 1。设一个位Q片设计中所有元件有相同宽度W。首先考察在折叠矩形的高度Hl定的情况下Q如何羃其宽度。设Wi</p> <p>为将元gCi 到Cn 折叠到高为H的矩形时的最宽度。若折叠不能实现Q如当ri +hiQHӞQ取Wi =∞。注意到W1 可能是所有n 个元件的最x叠宽度?/p> <p>当折叠Ci 到Cn Ӟ需要确定折叠点。现假定折叠Ҏ按栈左到栈右的顺序来取定的。若W一点定为Ck+ 1Q则Ci 到Ck 在第一个栈中。ؓ了得到最宽度,从Ck+1 到Cn 的折叠必ȝ最优化ҎQ因此又用到最优原理,可用动态规划方法来解决此问题。当W一个折叠点k+ 1已知Ӟ可得C下公式:</p> <p>Wi =w+ Wk + 1 Q? 5 - 9Q?/p> <p>׃不知道第一个折叠点Q因此需要尝试所有可行的折叠点,q择满Q?1 5 - 9Q式的折叠点。oh s u m(i,k)=k ?j = ihj。因k+ 1是一个可行的折叠点,因此h s u m(i, k) +ri +rk+1 一定不会超qH?/p> <p>Ҏ上述分析Q可得到以下动态规划递归式:</p> <p>q里Wn+1 =0Q且在无最优折叠点k+ 1时Wi 为∞。利用递归式(1 5 - 1 0Q,可通过递归计算Wn , Wn- 1., W2 , W1 来计Wi。Wi 的计需要至多检查n-i+ 1个Wk+ 1Q耗时为O (n-k)。因此计所有Wi 的时间ؓO (n2 )。通过保留式(1 5 - 1 0Q每ơ所得的k |可回溯地计算出各个最优的折叠点,其时间耗费为O (n)?/p> <p>现在来考察另外一个有关等宽元件的折叠问题Q折叠后矩Ş的宽度W已知Q需要尽量减其高度。因每个折叠矩Ş宽ؓwQ因此折叠后栈的最大数量ؓs=W / w。oHi, j 为Ci , ., Cn 折叠成一宽度为jw 的矩形后的最高度, H1, s 则是所有元件折叠后的最高度。当j= 1Ӟ不允怓Q何折叠,因此QHi,1 =h s u m(i,n) +ri , 1≤i≤n</p> <p>另外Q当i=n Ӟ仅有一个元Ӟ也不可能折叠Q因此:Hn ,j=hn+rn , 1≤j≤s</p> <p>在其他情况下Q都可以q行元g折叠。如果第一个折叠点为k+ 1Q则W一个栈的高度ؓ</p> <p>h s u m(i,k) +ri +rk+ 1。其他元件必M臛_(j- 1 ) *w 的宽度折叠。ؓ保证该折叠的最优性,其他元g也需以最高度进行折?</p> <p>因ؓW一个折叠点未知Q因此必d试所有可能的折叠点,然后从中扑և一个式(1 5 - 11Q的右侧取最值的点,该点成ؓW一个折叠点?/p> <p>可用q代法来求解Hi, j ( 1≤i≤n, 1≤j≤s)Q求解的序为:先计j=2 时的H i, jQ再j= 3Q?Q以此类推。对应每个j 的Hi, j 的计时间ؓO (n2 )Q所以计所有H i, j 的时间ؓO(s n2 )。通过保存由( 1 5 - 1 2Q式计算出的每个k |可以采用复杂性ؓO (n) 的回溯过E来定各个最优的折叠炏V?/p> <p>2. 变宽位-片元件的折叠</p> <p>首先考察折叠矩Ş的高度H已定Q欲求最的折叠宽度的情coWi 如式Q? 5 - 1 0Q所C,按照与(1 5 - 1 0Q式相同的推DE,可得Q?/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} Q? 5 - 1 3Q?/p> <p>其中Wn+1=0且w m i n(i,k)= m ini≤j≤k{wj }。可用与Q? 5 - 1 0Q式一LҎ求解Q? 5 - 1 3Q式Q所需旉为O(n2 )?/p> <p>当折叠宽度Wl定Ӟ最高度折叠可用折半搜索方法对过O(n2 )个可能D行搜索来实现Q可能的高度gؓh(i,j)+ri +rj + 1。在每个高度时Q也可用Q?1 5 - 1 3Q式来确定该折叠的宽度是否小于等于W。这U情况下ȝ旉消耗ؓO (n2 l o gn)?/p> <p>3. 标准单元折叠</p> <p>用wi 定义单元Ci 的宽度。每个单元的高度为h。当标准单元行的宽度W 固定不变Ӟ通过减少折叠高度Q可以相应地减少折叠面积。考察Ci 到Cn 的最高度折叠。设W一个折叠点是Cs+ 1。从元gCs+1 到Cn 的折叠必M用最高度,否则Q可使用更小的高度来折叠Cs+1 到CnQ从而得到更的折叠高度。所以这里仍可用最优原理和动态规划方法?/p> <p>令Hi , s 为Ci 到Cn 折叠成宽为W的矩形时的最高度,其中W一个折叠点为Cs+ 1。ow s u m(i, s)=s ?j = iwj。可假定没有宽度过W的元Ӟ否则不可能进行折叠。对于Hn,n 因ؓ只有一个元Ӟ不存在连UK题,因此Hn, n =h。对于H i, sQ?≤iQs≤nQ注意到如果w s u m(i, s )QWQ不可能实现折叠。若w s u m(i,s)≤WQ元件Ci 和C j + 1 在相同的标准单元行中Q该行下方布UK道的高度ؓls+ 1Q定义ln+1 = 0Q。因而:Hi, s = Hi+1, k Q? 5 - 1 4Q?/p> <p>当i=sQn ӞW一个标准单元行只包含Ci 。该行的高度为h 且该行下方布UK道的高度ؓli+ 1。因Ci+ 1 到Cn 单元的折叠是最优的.</p> <p>ZL最高度折叠,首先使用式( 1 5 - 1 4Q和Q? 5 - 1 5Q来定Hi, s Q?≤i≤s≤nQ。最高度折叠的高度为m in{H1 , s}。可以用回溯过E来定最高度折叠中的折叠点?/p> <img src ="http://www.aygfsteel.com/renyangok/aggbug/100957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/renyangok/" target="_blank">保尔?/a> 2007-02-27 17:10 <a href="http://www.aygfsteel.com/renyangok/archive/2007/02/27/100957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/renyangok/archive/2007/02/27/100901.html</guid><wfw:comment>http://www.aygfsteel.com/renyangok/comments/100901.html</wfw:comment><comments>http://www.aygfsteel.com/renyangok/archive/2007/02/27/100901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/renyangok/comments/commentRss/100901.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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">L?/span> <span style="COLOR: #008000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />  System.out.print(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">二叉树的中的数据Q  </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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"><</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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_324_403_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />   root.insertTree(root, data[i]);<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_522_563_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_570_612_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />   System.out.println(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">没有扑ֈQ?/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_718_751_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_780_812_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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">>=</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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_841_889_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> BinaryTree leftpoiter;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> BinaryTree rightpoiter;<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1049_1115_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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">>=</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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1237_1287_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1294_1339_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    insertTree(root.rightpoiter, data);<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1384_1433_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1440_1484_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    insertTree(root.leftpoiter, data);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> end</span> </div> <p>讲解Q一个寻扑օ键字Q-searchkey <br />另一个是插入一个结点:insertTree <br />另外q是一个完全的先序遍历二叉树的语法。先根结点,再左l点Q如无再右结点,如些加归x索完毕。 ?/p> <img src ="http://www.aygfsteel.com/renyangok/aggbug/100901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/renyangok/" target="_blank">保尔?/a> 2007-02-27 11:41 <a href="http://www.aygfsteel.com/renyangok/archive/2007/02/27/100901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何求素?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/renyangok/archive/2006/11/20/82278.html</guid><wfw:comment>http://www.aygfsteel.com/renyangok/comments/82278.html</wfw:comment><comments>http://www.aygfsteel.com/renyangok/archive/2006/11/20/82278.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/renyangok/comments/commentRss/82278.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/renyangok/services/trackbacks/82278.html</trackback:ping><description><![CDATA[<p>1。自然数?Q?Q?……<br /> 2。素数是2Q?Q?……Q不包括1的只能背1和它本n整除的自然数Q?br /> <br /> import java.util.Scanner;<br /> <br /> public class Prime {</p> <p>    //最基本的做?br /> </p> <p>    private int prime1(int num) {<br />         int i = 0, s = 0;<br />         label1: for (int n = 2; n <= num; n++) {<br />             for (int m = 2; m * m <= n; m++) {<br />                 if (n % m == 0)<br />                     continue label1;<br />             }<br />             s++;<br />             i++;<br />             //System.out.println("W? + i + "个素数是Q? + n);<br />         }<br />         return s;<br />     }<br /> </p> <p>    //<strong><font size="4"><font color="blue">6N±1?/font></font></strong></p> <p>    private int prime2(int num){<br />         int i = 0, s = 0;<br />         for(int n = 2; n <=3; n ++){<br />             s++;<br />             i++;<br />             //System.out.println("W? + i + "个素数是Q? + n);<br />         }<br />         label1: for(int n = 1; ; n++) {<br />             label2: for (int m = 0; m <= 1; m++) {<br />                 int tmp = 2 * (3 * n + m) - 1;<br />                 if (tmp > num)<br />                     break label1;<br />                 for(int k = 2; k * k <= tmp; k++)<br />                     if (tmp % k == 0)<br />                         if (m == 0)<br />                             continue label2;<br />                         else<br />                             continue label1;<br />                 s++;<br />                 i++;<br />                 //System.out.println("W? + i + "个素数是Q? + tmp);<br />             }<br />         }<br />         return s;<br />     }<br /> <br />     public static void main(String args[]) {<br />         Scanner in = new Scanner(System.in);<br />         int num = in.nextInt();<br />         long start = System.currentTimeMillis();<br />         int sum = new Prime().prime1(num);<br />         long end = System.currentTimeMillis();<br />         System.out.println("Ҏ一? + sum + "个素?);<br />         System.out.println("用时Q? + (end - start));<br />         start = System.currentTimeMillis();<br />         sum = new Prime().prime2(num);<br />         end = System.currentTimeMillis();<br />         System.out.println("Ҏ二共" + sum + "个素?);<br />         System.out.println("用时Q? + (end - start));<br />         <br />     }<br /> }<br /> </p> <p>输入Q?000000</p> <p>q行l果Q?/p> <p><strong><font color="#0000ff" size="4">Ҏ一?8498个素?br /> 用时Q?434<br /> Ҏ二共78498个素?br /> 用时Q?453</font></strong></p> <p>Q看来基本方法比<strong><font size="4"><font color="blue">6N±1?/font></font></strong>q要更快些,奇怪了Q我的程序写的没什么问题阿Q?br /> </p> <p><strong><font color="#0000ff" size="4"><br /> </font></strong></p> <p><strong><font color="#0000ff" size="4">?】求10000以内的所有素数?br /> </font></strong>素数是除?和它本n之外再不能被其他数整除的自然数。由于找不到一个通项公式来表C所有的素数Q所以对于数学家来说Q素C直是一个未解之谜。像著名?哥d巴赫猜想、孪生素数猜惻I几百q来不知吸引了世界上多少优秀的数学家。尽他们苦心钻研,呕心沥血Q但至今仍然未见分晓?br /> 自从有了计算Z后,Z借助于计机的威力,已经扑ֈ?<sup>216091</sup>以内的所有素数?br /> 求素数的Ҏ有很多种Q最单的Ҏ是根据素数的定义来求。对于一个自然数NQ用大于1于N的各个自然数都去除一下NQ如果都除不,则N为素敎ͼ否则N为合数?br /> 但是Q如果用素数定义的方法来~制计算机程序,它的效率一定是非常低的Q其中有许多地方都值得改进?br /> W一Q对于一个自然数NQ只要能被一个非1非自w的数整除,它就肯定不是素数Q所以不<br /> 必再用其他的数去除?br /> W二Q对于N来说Q只需用小于N的素数去除就可以了。例如,如果N能被15整除Q实?br /> 上就能被3?整除Q如果N不能??整除Q那么N也决不会?5整除?br /> W三Q对于N来说Q不必用?到N一1的所有素数去除,只需用小于等?#8730;N(根号N)的所有素数去除就可以了。这一点可以用反证法来证明Q?br /> 如果N是合敎ͼ则一定存在大?于N的整数d1和d2Q得N=d1×d2?br /> 如果d1和d2均大?#8730;NQ则有:NQd1×d2>√N×√NQN?br /> 而这是不可能的,所以,d1和d2中必有一个小于或{于√N?br /> Z上述分析Q设计算法如下:<br /> (1)?Q?Q?Q?逐个试除N的方法求?00以内的所有素数?br /> (2)?00以内的所有素数逐个试除的方法求?0000以内的素数?br /> 首先Q将2Q?Q?Q?分别存放在a[1]、a[2]、a[3]、a[4]中,以后每求Z个素敎ͼ只要不大?00Q就依次存放在A数组中的一个单?中。当我们?00?0000之间的素数时Q可依次用a[1]Qa[2]的素数去试除NQ这个范围内的素数可以不保存Q直接打印?br /> <br /> <font size="4"><strong><font color="blue">?】用{法求素数?/font></strong></font><br /> 单介l一下厄拉多塞筛法。厄拉多塞是一位古希腊数学Ӟ他在L素数Ӟ采用了一U与众不同的ҎQ先?QN的各数写在纸上:<br /> <img src="http://www.ywhs.net/yzren/pic/noip/prime_01.png" alt="" /><br /> ?的上面画一个圆圈,然后划去2的其他倍数Q第一个既未画圈又没有被划ȝ数是3Q将它画圈,再划?的其他倍数Q现在既未画圈又没有被划ȝW一个数 ?Q将它画圈,q划?的其他倍数……依次cLQ一直到所有小于或{于N的各数都M圈或划去为止。这Ӟ表中M圈的以及未划ȝ那些数正好就是小?N的素数?br /> <img src="http://www.ywhs.net/yzren/pic/noip/prime_02.png" alt="" /><br /> q很像一面筛子,把满x件的数留下来Q把不满x件的数筛掉。由于这U方法是厄拉多塞首先发明的,所以,后h把q种ҎUC厄拉多塞{法?br /> 在计机中,{法可以用给数组单元|零的方法来实现。具体来说就是:首先开一个数l:a[i]Qi=1Q?Q?Q?#8230;Q同Ӟ令所有的数组元素都等于下?|即a[i]=iQ当i不是素数Ӟ令a[i]=0 。当输出l果Ӟ只要判断a[i]是否{于零即可,如果a[i]=0Q则令i=i+1Q检查下一个a[i]?br /> {法是计机E序设计中常用的法之一?br /> <br /> <strong><font size="4"><font color="blue">?】用6N±1法求素数?/font></font></strong><br /> M一个自然数Qd以表C成为如下的形式之一Q?br /> 6NQ?N+1Q?N+2Q?N+3Q?N+4Q?N+5 (N=0Q?Q?Q?#8230;)<br /> 昄Q当N≥1Ӟ6NQ?N+2Q?N+3Q?N+4都不是素敎ͼ只有形如6N+1?N+5的自然数有可能是素数。所以,除了2?之外Q所有的素数都可以表C成6N±1的Ş?N然数)?br /> Ҏ上述分析Q我们可以构造另一面筛子,只对形如6 N±1的自然数q行{选,q样可以大大减筛选的ơ数Q从而进一步提高程序的q行效率和速度?br /> <img src="http://www.ywhs.net/yzren/pic/noip/prime_03.png" alt="" /><br /> 在程序上Q我们可以用一个二重@环实现这一点,外@环i?的倍数递增Q内循环j?Q?的@环,?(i+j)-1恰好是形如6N±1的自然数?/p> <img src ="http://www.aygfsteel.com/renyangok/aggbug/82278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/renyangok/" target="_blank">保尔?/a> 2006-11-20 15:28 <a href="http://www.aygfsteel.com/renyangok/archive/2006/11/20/82278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各种排序法java实现http://www.aygfsteel.com/renyangok/archive/2006/11/20/82277.html保尔?/dc:creator>保尔?/author>Mon, 20 Nov 2006 07:27:00 GMThttp://www.aygfsteel.com/renyangok/archive/2006/11/20/82277.htmlhttp://www.aygfsteel.com/renyangok/comments/82277.htmlhttp://www.aygfsteel.com/renyangok/archive/2006/11/20/82277.html#Feedback0http://www.aygfsteel.com/renyangok/comments/commentRss/82277.htmlhttp://www.aygfsteel.com/renyangok/services/trackbacks/82277.html 

插入排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;
/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class InsertSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int temp;
        for(int i=1;i<data.length;i++){
            for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
                SortUtil.swap(data,j,j-1);
            }
        }       
    }

}
冒排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class BubbleSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int temp;
        for(int i=0;i<data.length;i++){
            for(int j=data.length-1;j>i;j--){
                if(data[j]<data[j-1]){
                    SortUtil.swap(data,j,j-1);
                }
            }
        }
    }

}

选择排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class SelectionSort implements SortUtil.Sort {

    /*
     * (non-Javadoc)
     *
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int temp;
        for (int i = 0; i < data.length; i++) {
            int lowIndex = i;
            for (int j = data.length - 1; j > i; j--) {
                if (data[j] < data[lowIndex]) {
                    lowIndex = j;
                }
            }
            SortUtil.swap(data,i,lowIndex);
        }
    }

}

Shell排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class ShellSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        for(int i=data.length/2;i>2;i/=2){
            for(int j=0;j<i;j++){
                insertSort(data,j,i);
            }
        }
        insertSort(data,0,1);
    }

    /**
     * @param data
     * @param j
     * @param i
     */
    private void insertSort(int[] data, int start, int inc) {
        int temp;
        for(int i=start+inc;i<data.length;i+=inc){
            for(int j=i;(j>=inc)&&(data[j]<data[j-inc]);j-=inc){
                SortUtil.swap(data,j,j-inc);
            }
        }
    }

}

快速排?

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class QuickSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        quickSort(data,0,data.length-1);       
    }
    private void quickSort(int[] data,int i,int j){
        int pivotIndex=(i+j)/2;
        //swap
        SortUtil.swap(data,pivotIndex,j);
       
        int k=partition(data,i-1,j,data[j]);
        SortUtil.swap(data,k,j);
        if((k-i)>1) quickSort(data,i,k-1);
        if((j-k)>1) quickSort(data,k+1,j);
       
    }
    /**
     * @param data
     * @param i
     * @param j
     * @return
     */
    private int partition(int[] data, int l, int r,int pivot) {
        do{
           while(data[++l]<pivot);
           while((r!=0)&&data[--r]>pivot);
           SortUtil.swap(data,l,r);
        }
        while(l<r);
        SortUtil.swap(data,l,r);       
        return l;
    }

}
改进后的快速排?

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class ImprovedQuickSort implements SortUtil.Sort {

    private static int MAX_STACK_SIZE=4096;
    private static int THRESHOLD=10;
    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int[] stack=new int[MAX_STACK_SIZE];
       
        int top=-1;
        int pivot;
        int pivotIndex,l,r;
       
        stack[++top]=0;
        stack[++top]=data.length-1;
       
        while(top>0){
            int j=stack[top--];
            int i=stack[top--];
           
            pivotIndex=(i+j)/2;
            pivot=data[pivotIndex];
           
            SortUtil.swap(data,pivotIndex,j);
           
            //partition
            l=i-1;
            r=j;
            do{
                while(data[++l]<pivot);
                while((r!=0)&&(data[--r]>pivot));
                SortUtil.swap(data,l,r);
            }
            while(l<r);
            SortUtil.swap(data,l,r);
            SortUtil.swap(data,l,j);
           
            if((l-i)>THRESHOLD){
                stack[++top]=i;
                stack[++top]=l-1;
            }
            if((j-l)>THRESHOLD){
                stack[++top]=l+1;
                stack[++top]=j;
            }
           
        }
        //new InsertSort().sort(data);
        insertSort(data);
    }
    /**
     * @param data
     */
    private void insertSort(int[] data) {
        int temp;
        for(int i=1;i<data.length;i++){
            for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
                SortUtil.swap(data,j,j-1);
            }
        }      
    }

}

归ƈ排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class MergeSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int[] temp=new int[data.length];
        mergeSort(data,temp,0,data.length-1);
    }
   
    private void mergeSort(int[] data,int[] temp,int l,int r){
        int mid=(l+r)/2;
        if(l==r) return ;
        mergeSort(data,temp,l,mid);
        mergeSort(data,temp,mid+1,r);
        for(int i=l;i<=r;i++){
            temp[i]=data[i];
        }
        int i1=l;
        int i2=mid+1;
        for(int cur=l;cur<=r;cur++){
            if(i1==mid+1)
                data[cur]=temp[i2++];
            else if(i2>r)
                data[cur]=temp[i1++];
            else if(temp[i1]<temp[i2])
                data[cur]=temp[i1++];
            else
                data[cur]=temp[i2++];           
        }
    }

}

改进后的归ƈ排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class ImprovedMergeSort implements SortUtil.Sort {

    private static final int THRESHOLD = 10;

    /*
     * (non-Javadoc)
     *
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        int[] temp=new int[data.length];
        mergeSort(data,temp,0,data.length-1);
    }

    private void mergeSort(int[] data, int[] temp, int l, int r) {
        int i, j, k;
        int mid = (l + r) / 2;
        if (l == r)
            return;
        if ((mid - l) >= THRESHOLD)
            mergeSort(data, temp, l, mid);
        else
            insertSort(data, l, mid - l + 1);
        if ((r - mid) > THRESHOLD)
            mergeSort(data, temp, mid + 1, r);
        else
            insertSort(data, mid + 1, r - mid);

        for (i = l; i <= mid; i++) {
            temp[i] = data[i];
        }
        for (j = 1; j <= r - mid; j++) {
            temp[r - j + 1] = data[j + mid];
        }
        int a = temp[l];
        int b = temp[r];
        for (i = l, j = r, k = l; k <= r; k++) {
            if (a < b) {
                data[k] = temp[i++];
                a = temp[i];
            } else {
                data[k] = temp[j--];
                b = temp[j];
            }
        }
    }

    /**
     * @param data
     * @param l
     * @param i
     */
    private void insertSort(int[] data, int start, int len) {
        for(int i=start+1;i<start+len;i++){
            for(int j=i;(j>start) && data[j]<data[j-1];j--){
                SortUtil.swap(data,j,j-1);
            }
        }
    }

}
堆排?

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class HeapSort implements SortUtil.Sort{

    /* (non-Javadoc)
     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
     */
    public void sort(int[] data) {
        MaxHeap h=new MaxHeap();
        h.init(data);
        for(int i=0;i<data.length;i++)
            h.remove();
        System.arraycopy(h.queue,1,data,0,data.length);
    }


     private static class MaxHeap{
        
       
        void init(int[] data){
            this.queue=new int[data.length+1];
            for(int i=0;i<data.length;i++){
                queue[++size]=data[i];
                fixUp(size);
            }
        }
        
        private int size=0;

        private int[] queue;
               
        public int get() {
            return queue[1];
        }

        public void remove() {
            SortUtil.swap(queue,1,size--);
            fixDown(1);
        }
        //fixdown
        private void fixDown(int k) {
            int j;
            while ((j = k << 1) <= size) {
                if (j < size && queue[j]<queue[j+1])
                    j++;
                if (queue[k]>queue[j]) //不用交换
                    break;
                SortUtil.swap(queue,j,k);
                k = j;
            }
        }
        private void fixUp(int k) {
            while (k > 1) {
                int j = k >> 1;
                if (queue[j]>queue[k])
                    break;
                SortUtil.swap(queue,j,k);
                k = j;
            }
        }

    }

}

 

SortUtil:

package org.rut.util.algorithm;

import org.rut.util.algorithm.support.BubbleSort;
import org.rut.util.algorithm.support.HeapSort;
import org.rut.util.algorithm.support.ImprovedMergeSort;
import org.rut.util.algorithm.support.ImprovedQuickSort;
import org.rut.util.algorithm.support.InsertSort;
import org.rut.util.algorithm.support.MergeSort;
import org.rut.util.algorithm.support.QuickSort;
import org.rut.util.algorithm.support.SelectionSort;
import org.rut.util.algorithm.support.ShellSort;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class SortUtil {
    public final static int INSERT = 1;

    public final static int BUBBLE = 2;

    public final static int SELECTION = 3;

    public final static int SHELL = 4;

    public final static int QUICK = 5;

    public final static int IMPROVED_QUICK = 6;

    public final static int MERGE = 7;

    public final static int IMPROVED_MERGE = 8;

    public final static int HEAP = 9;

    public static void sort(int[] data) {
        sort(data, IMPROVED_QUICK);
    }
    private static String[] name={
            "insert","bubble","selection","shell","quick","improved_quick","merge","improved_merge","heap"
    };
   
    private static Sort[] impl=new Sort[]{
            new InsertSort(),
            new BubbleSort(),
            new SelectionSort(),
            new ShellSort(),
            new QuickSort(),
            new ImprovedQuickSort(),
            new MergeSort(),
            new ImprovedMergeSort(),
            new HeapSort()
    };

    public static String toString(int algorithm){
        return name[algorithm-1];
    }
   
    public static void sort(int[] data, int algorithm) {
        impl[algorithm-1].sort(data);
    }

    public static interface Sort {
        public void sort(int[] data);
    }

    public static void swap(int[] data, int i, int j) {
        int temp = data[i];
        data[i] = data[j];
        data[j] = temp;
    }
}



]]>
վ֩ģ壺 ɽ| | ̨| | Ӽ| ̫| | Ϫ| ƽ| Ҷ| Ǩ| | | Ȫ| Դ| ȫ| | | | | | ʡ| | | | | Դ| | | ߮| ˳| | ȷ| ָɽ| Ѯ| | | | ԭ| | ȫ|