??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美日韩中文久久,久久91精品国产91久久麻豆,亚洲精品综合久久http://www.shnenglu.com/mmdengwo/category/16457.htmlzh-cnFri, 29 Apr 2011 15:58:20 GMTFri, 29 Apr 2011 15:58:20 GMT60判断?wi)?f)另一?wi)的子结?/title><link>http://www.shnenglu.com/mmdengwo/archive/2011/04/29/145321.html</link><dc:creator>沛沛</dc:creator><author>沛沛</author><pubDate>Fri, 29 Apr 2011 06:03:00 GMT</pubDate><guid>http://www.shnenglu.com/mmdengwo/archive/2011/04/29/145321.html</guid><wfw:comment>http://www.shnenglu.com/mmdengwo/comments/145321.html</wfw:comment><comments>http://www.shnenglu.com/mmdengwo/archive/2011/04/29/145321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mmdengwo/comments/commentRss/145321.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mmdengwo/services/trackbacks/145321.html</trackback:ping><description><![CDATA[<span id="guckikk" class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; TEXT-ALIGN: center; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span id="aewcwgs" class=Apple-style-span style="FONT-SIZE: 14px; LINE-HEIGHT: 22px; FONT-FAMILY: Arial, Helvetica, simsun, u5b8bu4f53; TEXT-ALIGN: left"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" size=3><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">题目Q二叉树(wi)的结点定义如下:(x)</span></font></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; COLOR: blue; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>struct</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span id="uqkyyqs" class=Apple-converted-space> </span>TreeNode</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>{</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="egacaiw" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">int</span><span id="uwosuci" class=Apple-converted-space> </span>m_nValue;</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="cuosmuc" class=Apple-converted-space> </span></span>TreeNode* m_pLeft;</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="ysceqwm" class=Apple-converted-space> </span></span>TreeNode* m_pRight;</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>};</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" size=3><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">输入两棵二叉?/span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">?/span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">Q判断树(wi)</span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">是不?/span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">的子l构?/span></font></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" size=3><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">例如Q下图中的两|(wi)</span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">?/span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">Q由?/span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">中有一部分子树(wi)的结构和</span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">是一L(fng)Q因?/span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">是</span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">的子l构?/span></font></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 22px; PADDING-TOP: 0px; TEXT-ALIGN: center" align=center><span style="LINE-HEIGHT: 22px"></span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" size=3><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体"></span></font>                 1                                                   8<br style="LINE-HEIGHT: 22px">               /    \                                               /    \<br style="LINE-HEIGHT: 22px">              8    7                                             9    2<br style="LINE-HEIGHT: 22px">            /    \<br style="LINE-HEIGHT: 22px">           9    2<br style="LINE-HEIGHT: 22px">                /  \<br style="LINE-HEIGHT: 22px">               4  7</p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" size=3><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">分析Q这?/span><font style="LINE-HEIGHT: 25px" face=Calibri>2010</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">q微软校园招聘时的一道题目。二叉树(wi)一直是微Y面试题中l常出现的数据结构。对微Y有兴的读者一定要重点x二叉?wi)?/span></font></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" size=3><span style="LINE-HEIGHT: 25px"><font style="LINE-HEIGHT: 25px" face=Calibri>               <span id="cuoiccm" class=Apple-converted-space> </span></font></span><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">回到q个题目的本w。要查找?/span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">中是否存在和?/span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">l构一L(fng)子树(wi)Q我们可以分Z步:(x)W一步在?/span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">中找到和</span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">的根l点的gL(fng)l点</span><font style="LINE-HEIGHT: 25px" face=Calibri>N</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">Q第二步再判断树(wi)</span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">中以</span><font style="LINE-HEIGHT: 25px" face=Calibri>N</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">为根l点的子?wi)是不是包括和?wi)</span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">一L(fng)l构?/span></font></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" size=3><span style="LINE-HEIGHT: 25px"><font style="LINE-HEIGHT: 25px" face=Calibri>               <span id="wiuwygw" class=Apple-converted-space> </span></font></span><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">W一步在?/span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">中查找与根结点的gL(fng)l点。这实际上就是树(wi)的遍历。对二叉?wi)这U数据结构熟(zhn)的读者自然知道我们可以用递归的方法去遍历Q也可以用@环的Ҏ(gu)去遍历。由于递归的代码实现比较简z,面试时如果没有特别要求,我们通常都会(x)采用递归的方式。下面是参考代码:(x)</span></font></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; COLOR: blue; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>bool</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span id="eqiuwoe" class=Apple-converted-space> </span>HasSubtree(TreeNode* pTreeHead1, TreeNode* pTreeHead2)</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>{</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="kuqkeuk" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">if</span>((pTreeHead1 == NULL && pTreeHead2 != NULL) ||</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">               <span id="kcegwwm" class=Apple-converted-space> </span></span>(pTreeHead1 != NULL && pTreeHead2 == NULL))</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">               <span id="skoissq" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">return</span><span id="gkcysgy" class=Apple-converted-space> </span><span style="COLOR: blue; LINE-HEIGHT: 19px">false</span>;</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?> </span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="ceqimui" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">if</span>(pTreeHead1 == NULL && pTreeHead2 == NULL)</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">               <span id="ayswgem" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">return</span><span id="gqmmige" class=Apple-converted-space> </span><span style="COLOR: blue; LINE-HEIGHT: 19px">true</span>;</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?> </span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="aqumywo" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">return</span><span id="ueyswuk" class=Apple-converted-space> </span>HasSubtreeCore(pTreeHead1, pTreeHead2);</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>}</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; COLOR: blue; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>bool</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span id="aawguka" class=Apple-converted-space> </span>HasSubtreeCore(TreeNode* pTreeHead1, TreeNode* pTreeHead2)</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>{</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="gaumioo" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">bool</span><span id="moimwoc" class=Apple-converted-space> </span>result =<span id="ceqkuca" class=Apple-converted-space> </span><span style="COLOR: blue; LINE-HEIGHT: 19px">false</span>;</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="oicegew" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">if</span>(pTreeHead1->m_nValue == pTreeHead2->m_nValue)</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="wicuqee" class=Apple-converted-space> </span></span>{</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">               <span id="gqkmqyo" class=Apple-converted-space> </span></span>result = DoesTree1HaveAllNodesOfTree2(pTreeHead1, pTreeHead2);</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="mcqiuaq" class=Apple-converted-space> </span></span>}</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?> </span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="icoicsq" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">if</span>(!result && pTreeHead1->m_pLeft != NULL)</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">               <span id="cmgamcc" class=Apple-converted-space> </span></span>result = HasSubtreeCore(pTreeHead1->m_pLeft, pTreeHead2);</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?> </span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="yqmgygg" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">if</span>(!result && pTreeHead1->m_pRight != NULL)</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">               <span id="amwqski" class=Apple-converted-space> </span></span>result = HasSubtreeCore(pTreeHead1->m_pRight, pTreeHead2);</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?> </span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="woimgec" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">return</span><span id="aauycii" class=Apple-converted-space> </span>result;</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>}</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" size=3><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">在上qC码中Q我们递归调用</span><font style="LINE-HEIGHT: 25px" face=Calibri>hasSubtreeCore</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">遍历二叉?/span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">。如果发现某一l点的值和?/span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">的头l点的值相同,则调?/span><font style="LINE-HEIGHT: 25px" face=Calibri>DoesTree1HaveAllNodeOfTree2</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">Q做W二步判断?/span></font></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" size=3><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">在面试的时候,我们一定要注意边界条g的检查,x查空指针。当?/span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">或树(wi)</span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">为空的时候,定义相应的输出。如果没有检查ƈ做相应的处理Q程序非常容易崩溃,q是面试旉常忌讳的事情。由于没有必要在每一ơ递归中做边界查(每一ơ递归都做查,增加了不必要的时间开销Q,上述代码只在</span><font style="LINE-HEIGHT: 25px" face=Calibri>HasSubtree</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">中作了边界检查后Q在</span><font style="LINE-HEIGHT: 25px" face=Calibri>HasSubtreeCore</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">中作递归遍历?/span></font></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" size=3><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">接下来考虑W二步,判断以树(wi)</span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">中以</span><font style="LINE-HEIGHT: 25px" face=Calibri>N</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">为根l点的子?wi)是不是和?wi)</span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">h相同的结构。同P我们也可以用递归的思\来考虑Q如果结?/span><font style="LINE-HEIGHT: 25px" face=Calibri>N</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">的值和?/span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">的根l点不相同,则以</span><font style="LINE-HEIGHT: 25px" face=Calibri>N</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">为根l点的子?wi)和?/span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">肯定不具有相同的l点Q如果他们的值相同,则递归地判断他们的各自的左右结点的值是不是相同。递归的终止条件是我们到达了树(wi)</span><font style="LINE-HEIGHT: 25px" face=Calibri>A</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">或者树(wi)</span><font style="LINE-HEIGHT: 25px" face=Calibri>B</font><span lang=ZH-CN style="LINE-HEIGHT: 25px; FONT-FAMILY: 宋体">的叶l点。参考代码如下:(x)</span></font></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; COLOR: blue; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>bool</span><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span id="moamiom" class=Apple-converted-space> </span>DoesTree1HaveAllNodesOfTree2(TreeNode* pTreeHead1, TreeNode* pTreeHead2)</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>{</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="keoimkc" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">if</span>(pTreeHead2 == NULL)</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">               <span id="ykmquia" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">return</span><span id="wyqkeeu" class=Apple-converted-space> </span><span style="COLOR: blue; LINE-HEIGHT: 19px">true</span>;</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?> </span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="oqkmqyo" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">if</span>(pTreeHead1 == NULL)</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">               <span id="eqkuoom" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">return</span><span id="qacyigo" class=Apple-converted-space> </span><span style="COLOR: blue; LINE-HEIGHT: 19px">false</span>;</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?> </span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="sceyusi" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">if</span>(pTreeHead1->m_nValue != pTreeHead2->m_nValue)</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">               <span id="oyseyew" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">return</span><span id="qcwycqy" class=Apple-converted-space> </span><span style="COLOR: blue; LINE-HEIGHT: 19px">false</span>;</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?> </span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">       <span id="ugquewc" class=Apple-converted-space> </span></span><span style="COLOR: blue; LINE-HEIGHT: 19px">return</span><span id="seyswmk" class=Apple-converted-space> </span>DoesTree1HaveAllNodesOfTree2(pTreeHead1->m_pLeft, pTreeHead2->m_pLeft) &&</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?><span style="LINE-HEIGHT: 19px">               <span id="qceyssg" class=Apple-converted-space> </span></span>DoesTree1HaveAllNodesOfTree2(pTreeHead1->m_pRight, pTreeHead2->m_pRight);</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal; PADDING-TOP: 0px"><span style="FONT-SIZE: 9pt; LINE-HEIGHT: 19px; FONT-FAMILY: 新宋?>}</span></p> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" face=Calibri size=3> </font></p> <wbr style="LINE-HEIGHT: 22px"> <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0in 0in 10pt; LINE-HEIGHT: 22px; PADDING-TOP: 0px"><font style="LINE-HEIGHT: 25px" face=Calibri size=3></font> <span style="LINE-HEIGHT: 22px; WHITE-SPACE: pre"> </span><span lang=ZH-CN style="LINE-HEIGHT: 22px; FONT-FAMILY: 宋体"><font style="LINE-HEIGHT: 25px" size=3>博主何v涛对本博客文章n有版权。网l{载请注明出处</font></span><a style="COLOR: rgb(153,0,0); LINE-HEIGHT: 22px; TEXT-DECORATION: none" ><font style="LINE-HEIGHT: 25px" face=Calibri color=#990000 size=3>http://zhedahht.blog.163.com/</font></a><span lang=ZH-CN style="LINE-HEIGHT: 22px; FONT-FAMILY: 宋体"><font style="LINE-HEIGHT: 25px" size=3>?/font></span></p> </span></span> <img src ="http://www.shnenglu.com/mmdengwo/aggbug/145321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mmdengwo/" target="_blank">沛沛</a> 2011-04-29 14:03 <a href="http://www.shnenglu.com/mmdengwo/archive/2011/04/29/145321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>遗传法入门http://www.shnenglu.com/mmdengwo/archive/2011/04/14/144254.html沛沛沛沛Thu, 14 Apr 2011 14:27:00 GMThttp://www.shnenglu.com/mmdengwo/archive/2011/04/14/144254.htmlhttp://www.shnenglu.com/mmdengwo/comments/144254.htmlhttp://www.shnenglu.com/mmdengwo/archive/2011/04/14/144254.html#Feedback0http://www.shnenglu.com/mmdengwo/comments/commentRss/144254.htmlhttp://www.shnenglu.com/mmdengwo/services/trackbacks/144254.html遗传法

遗传法QGenetic Algorithm, GAQ是q几q发展v来的一U崭新的全局优化法?962q霍兰d(Holland)教授首次提出了GA法的思想Q它借用了仿真生物遗传学和自焉择机理Q通过自然选择、遗传、变异等作用机制Q实现各个个体的适应性的提高。从某种E度上说遗传法是对生物q化q程q行的数学方式仿真?/p>

q一点体C自然界中"物竞天择、适者生?q化q程。与自然界相|遗传法Ҏ(gu)解问题的本n一无所知,它所需要的仅是对算法所产生的每个染色体q行评h(hun),把问题的解表C成染色体,q基于适应值来选择染色体,佉K应性好的染色体有更多的J殖Z(x)。在法中也x以二q制~码的串。ƈ且,在执行遗传算法之前,l出一染色体Q也x假设解。然后,把这些假设解|于问题?#8220;环境”中,也即一个适应度函C来评仗ƈ按适者生存的原则Q从中选择适应环境的染色体q行复制, 淘汰低适应度的个体Q再通过交叉Q变异过E生更适应环境的新一代染色体。对q个新种进行下一轮进化,臛_最适合环境的倹{?/p>

遗传法已用于求解带有应用前景的一些问题,例如遗传E序设计、函C化、排序问题、h工神l网l、分cȝl、计机囑փ处理和机器hq动规划{?/p>

术语说明

׃遗传法是由q化论和遗传学机理而生的搜烦法Q所以在q个法中会(x)用到很多生物遗传学知识,下面是我们将?x)用来的一些术语说明:(x)

一、染色体(Chronmosome)

染色体又可以叫做基因型个?individuals),一定数量的个体l成了群?population),体中个体的数量叫做体大小?/p>

二、基?Gene)

基因是串中的元素Q基因用于表CZ体的特征。例如有一个串SQ?011Q则其中?Q?Q?Q?q?个元素分别称为基因。它们的值称为等位基?Alletes)?/p>

三、基因地?Locus)

基因地点在算法中表示一个基因在串中的位|称为基因位|?Gene Position)Q有时也U基因位。基因位|由串的左向双,例如在串 SQ?101 中,0的基因位|是3?/p>

四、基因特征?Gene Feature)

在用串表C整数时Q基因的特征g二进制数的权一_(d)例如在串 S=1011 中,基因位置3中的1Q它的基因特征gؓ(f)2Q基因位|?中的1Q它的基因特征gؓ(f)8?/p>

五、适应?Fitness)

各个个体对环境的适应E度叫做适应?fitness)。ؓ(f)了体现染色体的适应能力Q引入了寚w题中的每一个染色体都能q行度量的函敎ͼ叫适应度函? q个函数是计个体在体中被使用的概率?/p>

操作法

霍兰?Holland)教授最初提出的法也叫单遗传算法,单遗传算法的遗传操作主要有三U:(x)选择(selection)、交?crossover)、变?mutation)q也是遗传算法中最常用的三U算法:(x)

1Q选择(selection)

选择操作也叫复制操作Q从体中按个体的适应度函数值选择适应环境的个体。一般地_(d)选择适应度高的个体繁D下一代的数目较多Q而适应度较?yu)的个体Q繁D下一代的数目较少,甚至被淘汰。最通常的实现方法是轮盘?roulette wheel)模型。o(h)Σfi表示体的适应度gdQfi表示U群中第i个染色体的适应度|它被选择的概率正好ؓ(f)光应度值所占䆾额fiQ?#931;fi。如下图表中的数据适应值dΣfi=6650,适应度ؓ(f)2200变选择的可能ؓ(f)fiQ?#931;fi=2200/6650=0.394.


?. 轮盘赌模?/font>
 
Fitness |(x) 2200 1800 1200 950 400 100
选择概率Q?/td> 3331 0.271 0.18 0.143 0.06 0.015
 

2Q交?Crossover)

交叉子被选中的两个个体的基因链按一定概率pcq行交叉Q从而生成两个新的个体,交叉位置pc是随机的。其中Pc是一个系l参数。根据问题的不同Q交叉又Z单点交叉子QSingle Point CrossoverQ、双点交叉算子(Two Point CrossoverQ、均匀交叉子 (Uniform Crossover)Q在此我们只讨论单点交叉的情c(din)?/p>

单点交叉操作的简单方式是被选择出的两个个体S1和S2作ؓ(f)父母个体Q将两者的部分基因码D行交换。假讑֦下两?位的个体Q?/p>
S1 1000  1111 S2 1110  1100

产生一个在1?之间的随机数cQ假如现在生的?Q将S1和S2的低二位交换QS1的高六位与S2的低六位l成C10001100Q这是S1和S2 的一个后代P1个体QS2的高六位与S1的低二位l成C11101111Q这是S1和S2的一个后代P2个体。其交换q程如下图所C:(x)

Crossover 11110000 Crossover 11110000
S1 1000 1111 S2 1110 1100
P1 1000 1100 P2 1110 1111

3Q变?Mutation)

q是在选中的个体中Q将C体的基因铄各位按概率pmq行异向转化Q最单方式是改变串上某个位置数倹{对二进制编码来说将0?互换Q?变异?Q?变异??/p>

如下8位二q制~码Q?/p>
1 1 1 0 1 1 0 0

随机产生一??之间的数iQ假如现在k=6Q对从右往左的W?位进行变异操作,原来的1变ؓ(f)0Q得到如下串Q?/p>
1 1 0 0 1 1 0 0

整个交叉变异q程如下图:(x)


?. 交叉变异q程

 

4Q精׃?QElitismQ?/strong>

仅仅从生的子代中选择基因L造新的种可能会(x)丢失掉上一代种中的很多信息。也是说当利用交叉和变异生新的一代时Q我们有很大的可能把在某个中间步骤中得到的最优解丢失。在此我们用精׃义(ElitismQ方法,在每一ơ生新的一代时Q我们首先把当前最优解原封不动的复制到新的一代中Q其他步骤不变。这样Q何时M生的一个最优解都可以存?gu)zd遗传法l束?/p>

上述各种子的实现是多种多样的,而且许多新的子正在不断地提出,以改qGA某些性能。比如选择法q有分均衡选择{等?/p>

遗传法的所需参数

说简单点遗传法是遍历搜烦I间或连接池Q从中找出最优的解。搜索空间中全部都是个体Q而群体ؓ(f)搜烦I间的一个子集。ƈ不是所有被选择了的染色体都要进行交叉操作和变异操作Q而是以一定的概率q行Q一般在E序设计中交叉发生的概率要比变异发生的概率选取得大若干个数量。大部分遗传法的步骤都很类|怋用如下参敎ͼ(x)

Fitness函数Q见上文介绍?/p>

FitnessthresholdQ适应度阀|Q适合度中的设定的阀|当最优个体的适应度达到给定的阀|或者最优个体的适应度和体适应度不再上升时(变化率ؓ(f)?Q则法的P代过E收敛、算法结束。否则,用经q选择、交叉、变异所得到的新一代群体取代上一代群体,q返回到选择操作处l@环执行?/p>

PQ种的染色体L叫种规模,它对法的效率有明显的媄响,光度等于它包含的个体数量。太时难以求出最优解Q太大则增长收敛旉DE序q行旉ѝ对不同的问题可能有各自适合的种规模,通常U群规模?30 ?160?/p>

pcQ在循环中进行交叉操作所用到的概率。交叉概率(PcQ一般取0.6?.95之间的|Pc太小旉以向前搜索,太大则容易破坏高适应值的l构?/p>

PmQ变异概率,从个体群中生变异的概率Q变异概率一般取0.01?.03之间的值变异概率Pm太小旉以生新的基因结构,太大佉K传算法成了单U的随机搜烦?/p>

另一个系l参数是个体的长度,有定长和变长两种。它对算法的性能也有影响。由于GA是一个概率过E,所以每ơP代的情况是不一L(fng),pȝ参数不同QP代情况也不同?/p>

遗传步骤

了解了上面的基本参数Q下面我们来看看遗传法的基本步骤?/p>

基本q程为:(x)

  1. 对待解决问题q行~码,我们问题结构变换ؓ(f)位串形式~码表示的过E叫~码Q而相反将位串形式~码表示变换为原问题l构的过E叫译码?
  2. 随机初始化群体P(yng)(0)Q?(p1, p2, … pn)Q?
  3. 计算体上每个个体的适应度?Fitness)
  4. 评估适应?对当前群体P(yng)(t)中每个个体P(yng)i计算光应度F(Pi)Q适应度表CZ该个体的性能好坏
  5. 按由个体适应度值所军_的某个规则应用选择子产生中间代Pr(t)
  6. 依照Pc选择个体q行交叉操作
  7. 仿照Pm对繁D个体进行变异操?
  8. 没有满某种停止条gQ则转第3步,否则q入9
  9. 输出U群中适应度值最优的个体

E序的停止条件最单的有如下二U:(x)完成了预先给定的q化代数则停止;U群中的最优个体在q箋若干代没有改q或q_适应度在q箋若干代基本没有改q时停止?/p>

Ҏ(gu)遗传法思想可以d如右图所C的单遗传算法框图:(x)


?. 单遗传算法框?/font>
 

下面伪代码简单说明了遗传法操作q程Q?/p>
choose an intial population
For each h in population,compute Fitness(h)
While(max Fitness(h) < Fitnessthreshold)
do selection
do crossover
do mutation
update population
For each h in population,compute Fitness(h)
Return best Fitness

Robocode 说明

能有效实现遗传算法的应用例子有很多,像西z双陆棋、国际名模等{都是遗传程序设计学?fn)的工具Q但?Robocode 有着其他几个无可比拟的优势:(x)

  1. 它是Z面向对象语言 Java 开发,而遗传算法本w的思想也是存在l承{面向对象概念;
  2. Robocode 是一U基于游戏与~程语言之间的^収ͼ有一个充满竞技与乐的坦克战斗q_Q你能很快的通过与其他坦克机器比赛而测试自q遗传法Q?
  3. Robocode C?4000 个左叛_U策略的例子机器人可供你选择Q这些机器h以让我们模拟真实的遗传环境。而且很多代码可直接开放源代码供我们借鉴 Q?
  4. Robocode 是一个开源YӞ你可直接上Robocode控制器上加入自己的遗传特点,而加快遗传过E的收敛旉Q?
  5. Robocoe 是一个很Ҏ(gu)使用的机器h战斗仿真器,(zhn)在此^C创徏自己的坦克机器hQƈ与其它开发者开发的机器人竞技。以得分排名的方式判定优胜者。每?Robocode 参加者都要利?Java 语言元素创徏他或她的机器人,q样׃从初学者到高黑客的广大开发者都可以参与q一׃zd。如果?zhn)对Robocode不是很了解,请参?developerWorks |站 Java 技术专区文章:(x)“重锤痛击 Robocode”Q?

?Robocode 中其实有很多U遗传算法方法来实现q化机器人,从全世界?Robocode 派中也发展几种比较成熟的方法,比如预设{略遗传、自开发解释语a遗传、遗传移动我们就q几U方法分别加以介l。由于遗传算法操作过E都cMQ所以前面二部分都是一些方法的介绍和部分例子讲解,后面部分?x)给Z用了遗传法的移动机器hZ子。在附录中,也提供了机器Z库中有关遗传法机器人的下蝲Q大家可参考?/p>






预设{略q化机器?/font>

Robocode 坦克机器人所有行为都M开如移动、射凅R扫描等基本操作。所以在此把q些基本操作所用到的策略分别进化如下编码:(x)Ud{略move-strategy (MS), 子弹能量bullet-power-strategy (BPS), 雯扫描radar-strategy (RS), 和瞄准选择{略target- strategy (TS)。由于Robocode爱好者社的发展Q每一U基本操作都发展了很多比较成熟的{略Q所有在此我们直接在下面预先定义的这些策略如下表Q?/p>
MS BPS RS TS
random distance-based always-turn HeadOn
Linear light-fast target-focus Linear
circular Powerful-slow target-scope-focus Circular
Perpendicular Medium   nearest robot
arbitary hit-rate based   Log
anti gravity     Statistic
Stop     Angular
Bullet avoid     wave
wall avoid      
track      
Oscillators      

下面是基本移动策略的说明Q?/p>

  • RandomQ随机移动主要用来؜乱敌人的预测Q其最大的一个缺Ҏ(gu)有可能撞d其他机器?
  • LinearQ直U移?机器人做单一的直U行?
  • circularQ圆周移动,q种Ud是以某一点ؓ(f)圆心Q不停的l圈
  • PerpendicularQ正Ҏ(gu)人移动,q是很多人采用的一U移动方式,q在敌h双Q?以随时调整与敌h的相对角
  • ArbitraryQQ意移?
  • AntiGravityQ假讑֜地有很多力点的反重力UdQ本Ҏ(gu)是模拟在重力Z用下Q物体Lq离重力劉K的点Q滑向重力势低的点,开始战场是一个^面然后生成一些势炚w力势大的势点的作用就像是一个山(h斥作用)Q其衰减pL与山的坡度对应。重力势的势点的作用就像是一个低P起吸引作用)Q其衰减pL与谷的坡度对应。这样本来的^面变得不q了Q从来物体沿着最陡的方向向下滑动
  • TrackQ跟t敌人,敌hUd到哪Q机器h也移动到哪,但是M敌h保持一定最佌避子弹距d角度
  • OscillatorsQ重复做一振荡Ud
  • Bullet avoidQ每当雷达觉察到敌h时有所动作。机器h保持与敌人成30度們֐角。自w成 90 度角静止q渐接近目标。如果机器h觉察到能量下降介?0.1 ?3.0 之间Q火力范_(d)Q那么机器hq卛_换方向,向左或向右移动?
  • wall avoidQ这是一U自己的机器h不会(x)被困在角落里或者不?x)撞墙的Ud方式

瞄准{略说明如下Q?/p>

  • HeadonQ正对瞄?
  • LinearQ直U瞄?
  • circularQ圆周瞄?
  • nearest robotQ接q机器h瞄准
  • LogQ保存每ơ开火记?
  • StatisticQ统计学瞄准Q分析所有打中及(qing)未打中的ơ数Q以其中扑և最高打中敌人的概率为准?
  • AngularQ找到最佌度瞄?
  • WaveQL形瞄准,子弹以L的方式进行探?

Robocode 行ؓ(f)事g

坦克的主要都定义在一个主循环中,我们在程序中定义Z面四个策略定义四U战略如Move,Radar,Power,TargetQ当某一事g发生Q基于这个事件而定的行为就?x)触发。而每个战略中都有不同的行为处理方式。这些行为通过遗传法触发Q遗传算法将调用q些基本动作q搜索这些策略的最佳组合。基于这些基本动作将?224 (=4*11*4*3*8)U可能发生。在Robocode AdvancedRobot cM有如下的Ud函数Q?/p>

  • setAhead和aheadQ让机器人向前移动一定距?
  • setBack和backQ让机器人向后移动一定距?
  • setMaxTurnRateQ设|机器h最大的旋{速度
  • setMaxVelocityQ设|机器h最大的q动速度
  • setStop和stopQ停止移动或暂停机器人,q记住停止的位置
  • setResume和resumeQ重新开始移动停止的机器?
  • setTurnLeft和turnLeftQ向左旋转机器h
  • setTurnRight和turnRightQ向x转机器h

下面?doMove UdҎ(gu)中用部分程序代码:(x)

RandomQ?/p>
switch(Math.random()*2) {
case 0Q?setTurnRight(Math.random()*90);
break;
case 1Q?setTurnLeft(Math.random()*90);
break; }
execute();

LinearQ?/p>
ahead(200);
setBack(200);

CircularQ?/p>
setTurnRight(1000);
setMaxVelocity(4);
ahead(1000);

anti gravityQ?/p>
 double forceX = 0;
double forceY = 0;
for (int i=0; i

q里我们用遗传算法来控制机器人移动位|。这些策略是Z下面几点Q机器hq位置、速度和方?Ҏ(gu)的位|(x,y坐标Q、速度、方位以?qing)相对?所有机器h和子弹位|,方位?qing)速度;场地大小{参数?/p>

当上面的信息在下一回移动中使用ӞZ对坐标|Ҏ(gu)q对坐标在Robocodep得到距离和角度。要惌Ud实现遗传必须要让它实现在U学?fn)?x)所以我们的代码必须做下面几件事Q要有一个函数收集适应度|在Robocodeq行q程中要q用到遗传操作,遗传后代要在Robocodeq行中生,而不是事后由手写入代码?/p>

遗传操作

本例中遗传算法ؓ(f)实现Ud用到两个cGA和MovePattern。此处的GA比较单主要完成数据和体的定义,以及(qing)q些定义的读写文件操作。基中包括如下参敎ͼ(x)体大小、交叉概率、变异概率、精英概率(既告诉从当前体C一代中有多移动不需要改变)、方E式中用的加权pL大小Q它通过一个主循环完成MovePattern的封装。MovePatterncM实现交叉、变异方法等Ҏ(gu)Q完成移动模式操作。而所有的输出保存在一个vector函数当中。Vector函数拥有一对实数数l,一个用于计x坐标Q另一个用于计y坐标。通过对x,y坐标的计,从而得到距R角度等|q生相在Ud{略。如下,MovePattern包含三个参数Qgrad表示vector函数排列序Qinput卌C算法给出的输入~号Qrang是加权的范围?/p>
public class MovePatteren implements Comparable {
private int grad, input;
private double range;
protected double fitness=0;
protected double[] weightsX, weightsY;
… }

交叉操作Q每一个交叉操作执行如下步骤,先在交叉操作中生一个特征码。这个特征码是个0?之间的变量数l。有关交叉的基本原理可参考上面部分。最后通过遍历vector函数Q把相应的加权D行交叉操作?/p>
protected MovePatteren crossOver(MovePatteren mate, boolean[] maskx, boolean[] masky) {
double[] wx= new double[weightsX.length];
double[] wy= new double[weightsX.length];
for(int mask=0; mask <="" pre="" mask++)="" for(int="" g="0;" g

q里的变异操作比较简单。把加权范围内的随机数值去代替0到数l长之间的随机数q保存到Ud模式中。则完成整个数组的变异过E:(x)

protected void mutate() {
weightsX[(int)(Math.random()*weightsX.length)]=Math.random()*range*2-range;
weightsY[(int)(Math.random()*weightsX.length)]=Math.random()*range*2-range;
}

从上面的例子我们知道了遗传算法的大概实现Q但q没有告诉我们这些组件是如何一起工作的。当Robocode开始时Q如果文件中没有数据Q所以系l会(x)依照输入的策略随机生成一个移动模式,如果文g中有数据Q则加蝲q些数据。每一个移动模式在开始都?x)给Z一个适应度倹{当所有的Ud模式都接收到适应度|q完成各自的~号后,下面的操作将开始执行:(x)

  1. Ҏ(gu)有的Ud模式依据它们的适应度D行分U处?
  2. 执行_英操作
  3. 执行交叉操作
  4. 应用变异操作
  5. 保存加权
  6. 法重新开?

适应度值在q行q算q程中由机器人程序不断调_(d)以找到最优适应度?/p>

限于副其他的一些策略本文不与详l说明,上面所有提到的{略和行为程序都可在|上或IBM的开发杂志上扑ֈ成熟的讲解和例子机器人。有兴趣的朋友可以把q些{略都加入到自己的遗传算法中来。我们取体大小?0Q选择概率?.7Q交叉概率ؓ(f)0.6Q变异概率ؓ(f)0.3Q与Robocode部分例子机器人测试,l过150代后你会(x)发现pȝ产生了很多有的{略。比如撞ȝ略,q些{略都不在我们定义的{略之中?/p>






中间解释E序q化机器?/font>

遗传法可被看做L基因l字W串。但是你必须军_q些字符所代表的意义,也就是说如何解释每一个基因组。最单的Ҏ(gu)是把每一个基因组视ؓ(f)java代码Q编译ƈq行它们。但是这些程序编译都很困难,所以也有可能不能工作。Jacob Eisenstein设计了一U机器翻译语aTableRex来解册个问题。在java中,TableRex被用于进化和解释动行时的Robocode 机器人。通过试Q只要我把TableRex解释E序作ؓ(f)文g攑օRobocode控制器目录中Q这些控制器׃(x)d文gq开始战斗。TableRex是一些最适合遗传法的二q制~程。只要符合TableRexE序文法Q每个程序都能被解释?/p>

~码

下表中显CZTableRex~码l构Q它׃个行动作函数Q二个输入和一个输出组成。如?的?Q这是个布尔型的表达?#8220;?line4 于 90”Q这个结果会(x)在最后一行输出布?yu)(dng)?f)1的倹{?/p>
Function Input 1 Input 2 Output
1. Random ignore ignore 0,87
2. Divide Const_1 Const_2 0,5
3. Greater Than Line 1 Line 2 1
4. Normalize Angle Enemy bearing ignore -50
5. Absolute Value Line 4 ignore 50
6. Less Than Line 4 Const_90 1
7. And Line 6 Line 3 1
8. Multiply Const_10 Const_10 100
9. Less Than Enemy distance Line 8 0
10. And Line 9 Line 7 0
11. Multiply Line 10 Line 4 0
12 Output Turn gun left Line 11 0


沛沛 2011-04-14 22:27 发表评论
]]>
不用库函数Q编写函数int strcmp(char *source, char *dest) 相等q回0Q不{返?1http://www.shnenglu.com/mmdengwo/archive/2011/04/14/144253.html沛沛沛沛Thu, 14 Apr 2011 14:26:00 GMThttp://www.shnenglu.com/mmdengwo/archive/2011/04/14/144253.htmlhttp://www.shnenglu.com/mmdengwo/comments/144253.htmlhttp://www.shnenglu.com/mmdengwo/archive/2011/04/14/144253.html#Feedback0http://www.shnenglu.com/mmdengwo/comments/commentRss/144253.htmlhttp://www.shnenglu.com/mmdengwo/services/trackbacks/144253.html#include <stdio.h>
#include 
<stdlib.h>

int strcmp(char *source, char *dest)
{
while(*source == *dest && *source != '\0' && *dest != '\0')
{
  source
++;
  dest
++;
}

if (*source =='\0' && *dest == '\0')
  
return 0;
else
  
return -1;


}

int main()
{
char *str1 = "abcde";
char *str2 = "abcde";
printf(
"ret = %d", mystrcmp(str1, str2));

return 0;
}


沛沛 2011-04-14 22:26 发表评论
]]>
八大排序法ȝ http://www.shnenglu.com/mmdengwo/archive/2011/04/14/144250.html沛沛沛沛Thu, 14 Apr 2011 14:18:00 GMThttp://www.shnenglu.com/mmdengwo/archive/2011/04/14/144250.htmlhttp://www.shnenglu.com/mmdengwo/comments/144250.htmlhttp://www.shnenglu.com/mmdengwo/archive/2011/04/14/144250.html#Feedback0http://www.shnenglu.com/mmdengwo/comments/commentRss/144250.htmlhttp://www.shnenglu.com/mmdengwo/services/trackbacks/144250.html 

插入排序

1.直接插入排序

原理Q将数组分ؓ(f)无序区和有序Z个区Q然后不断将无序区的W一个元素按大小序插入到有序区中去Q最l将所有无序区元素都移动到有序区完成排序?/span>

要点Q设立哨兵,作ؓ(f)临时存储和判断数l边界之用?/span>

实现Q?/span>

Void InsertSort(Node L[],int length)

{

Int i,j;//分别为有序区和无序区指针

for(i=1;i<length;i++)//逐步扩大有序?/span>

{

j=i+1;

if(L[j]<L[i])

{

L[0]=L[j];//存储待排序元?/span>

While(L[0]<L[i])//查找在有序区中的插入位置Q同时移动元?/span>

{

L[i+1]=L[i];//Ud

i--;//查找

}

L[i+1]=L[0];//元素插?/span>

}

i=j-1;//q原有序区指?/span>

}

}

2.希尔排序

原理Q又U增量羃?yu)排序。先序列按增量划分为元素个数相同的若干l,使用直接插入排序法进行排序,然后不断~小增量直至?span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">1Q最后用直接插入排序完成排序?/span>

要点Q增量的选择以及(qing)排序最l以1为增量进行排序结束?/span>

实现Q?/span>

Void shellSort(Node L[],int d)

{

While(d>=1)//直到增量~小?

{

Shell(L,d);

d=d/2;//~小增量

}

}

Void Shell(Node L[],int d)

{

Int i,j;

For(i=d+1;i<length;i++)

{

if(L[i]<L[i-d])

{

L[0]=L[i];

j=i-d;

While(j>0&&L[j]>L[0])

{

L[j+d]=L[j];//Ud

j=j-d;//查找

}

L[j+d]=L[0];

}

}

}

交换排序

1.冒排序

原理Q将序列划分为无序和有序区,不断通过交换较大元素x序区֮成排序?/span>

要点Q设计交换判断条Ӟ提前l束以排好序的序列@环?/span>

实现Q?/span>

Void BubbleSort(Node L[])

{

Int i ,j;

Bool ischanged;//设计跛_条g

For(j=n;j<0;j--)

{

ischanged =false;

For(i=0;i<j;i++)

{

If(L[i]>L[i+1])//如果发现较重元素向后移?/span>

{

Int temp=L[i];

L[i]=L[i+1];

L[i+1]=temp;

Ischanged =true;

}

}

If(!ischanged)//若没有移动则说明序列已经有序Q直接蟩?/span>

Break;

}

}

2.快速排?/span>

原理Q不断寻找一个序列的中点Q然后对中点左右的序列递归的进行排序,直至全部序列排序完成Q用了分治的思想?/span>

要点Q递归、分?/span>

实现Q?/span>


选择排序

1.直接选择排序

原理Q将序列划分为无序和有序区,L无序Z的最值和无序区的首元素交换,有序区扩大一个,循环最l完成全部排序?/span>

要点Q?/span>

实现Q?/span>

Void SelectSort(Node L[])

{

Int i,j,k;//分别为有序区Q无序区Q无序区最元素指?/span>

For(i=0;i<length;i++)

{

k=i;

For(j=i+1;j<length;j++)

{

If(L[j]<L[k])

k=j;

}

If(k!=i)//若发现最元素,则移动到有序?/span>

{

Int temp=L[k];

L[k]=L[i];

L[i]=L[temp];

}

 

}

}

2.堆排?/span>

原理Q利用大根堆或小根堆思想Q首先徏立堆Q然后将堆首与堆交换,堆尾之后为有序区?/span>

要点Q徏堆、交换、调整堆

实现Q?/span>

Void HeapSort(Node L[])

{

BuildingHeap(L);//建堆Q大根堆Q?/span>

For(int i=n;i>0;i--)//交换

{

Int temp=L[i];

L[i]=L[0];

L[0]=temp;

Heapify(L,0,i);//调整?/span>

}

}


Void BuildingHeap(Node L[])

{ For(i=length/2 -1;i>0;i--)

Heapify(L,i,length);

}

归ƈ排序

原理Q将原序列划分ؓ(f)有序的两个序列,然后利用归ƈ法q行合ƈQ合q之后即为有序序列?/span>

要点Q归q、分?/span>

实现Q?/span>

Void MergeSort(Node L[],int m,int n)

{

Int k;

If(m<n)

{

K=(m+n)/2;

MergeSort(L,m,k);

MergeSort(L,k+1,n);

Merge(L,m,k,n);

}

}


基数排序

原理Q将数字按位数划分出n个关键字Q每ơ针对一个关键字q行排序Q然后针Ҏ(gu)序后的序列进行下一个关键字的排序,循环x有关键字都用过则排序完成?/span>

要点Q对关键字的选取Q元素分配收集?/span>

实现Q?/span>

Void RadixSort(Node L[],length,maxradix)

{

Int m,n,k,lsp;

k=1;m=1;

Int temp[10][length-1];

Empty(temp); //清空临时I间

While(k<maxradix) //遍历所有关键字

{

For(int i=0;i<length;i++) //分配q程

{

If(L[i]<m)

Temp[0][n]=L[i];

Else

Lsp=(L[i]/m)%10; //定关键?/span>

Temp[lsp][n]=L[i];

n++;

}

CollectElement(L,Temp); //

n=0;

m=m*10;

k++;

}

}



沛沛 2011-04-14 22:18 发表评论
]]>
Ը߳þþþþþþþ| þùƷ99þþþþ| ɫۺϾþ| þþþƷsmվ| þۺϾþۺ| ĻۺϾþ2| þþþӰԺŮ | Ⱦþվȡ| 97Ʒ˾þþô߽| þþž޾Ʒ| 91þþþþۺ| þþþùһëƬ| ճˮþ޾Ʒtv| ھƷ˾þþþӰԺ԰| ޹˾þһҳ| þþþþ޾Ʒ| Ƭѹۿþ| Ļ˾þ| ޾Ʒþþwww| 2021þþƷ99Ʒ| ݺݾþۺ| ޾ƷŮþþþ99С˵| þþþþAVר| һƷþ| ޹Ʒþ66| þù׽| ϼþùƷӰԺ| Ļþþ| þþSS鶹ŷպ| þĻһ| þۺƵվ| պ޾Ʒþ| þþƷվ| ɫþþۺľþav| þþ뾫Ʒҹ| ˬݾþþۺ鶹| þù㽶һƷ| þþƷ2020| þۺɫ99žak| avԾþþþa| ٸŮþۺɫ|