﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-michael-随笔分类-Algorithm</title><link>http://www.cppblog.com/michaelgao/category/7308.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 19 May 2012 18:15:24 GMT</lastBuildDate><pubDate>Sat, 19 May 2012 18:15:24 GMT</pubDate><ttl>60</ttl><item><title>dynamic programming</title><link>http://www.cppblog.com/michaelgao/archive/2012/05/17/175176.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Thu, 17 May 2012 01:54:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2012/05/17/175176.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/175176.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2012/05/17/175176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/175176.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/175176.html</trackback:ping><description><![CDATA[<h2><span style="font-size: 14pt; "><span style="font-weight: normal;">感觉动态规划中最难的部分是在寻找 从状态j到状态i的递归式，就像证明归纳法一样，你得找出具体的式子来。<br /></span>top bottom<br />bottom up<br />1. Longest Increasing Subsequence:<br /><span style="font-weight: normal;">L[i] = max(1+L(j))(j&lt;l &amp;&amp; a[j]&lt;a[i])</span><br /><span style="font-weight: normal;">//if not exist any a[j]&lt;a[i]</span><br /><span style="font-weight: normal;">L[i] = 1;</span><br /><br /><span style="font-weight: normal;">getmaxvalueof array a[]</span><br /><br /><br /></span><span style="font-size: 14pt; ">2. Maximum Sum Increasing Subsequence<br /><span style="font-weight: normal;">almost same with above</span><br /><br />3. Maximum continous sum<br /><br />4. rod cutting</span></h2><img src ="http://www.cppblog.com/michaelgao/aggbug/175176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2012-05-17 09:54 <a href="http://www.cppblog.com/michaelgao/archive/2012/05/17/175176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>贪心算法与动态规划</title><link>http://www.cppblog.com/michaelgao/archive/2008/11/18/67196.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Tue, 18 Nov 2008 03:20:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/11/18/67196.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/67196.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/11/18/67196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/67196.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/67196.html</trackback:ping><description><![CDATA[贪心法的基本思路： &nbsp; <br> &nbsp;  &nbsp; <br> &nbsp; 从问题的某一个初始解出发逐步逼近给定的目标，以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时，算法停止。 &nbsp; <br> &nbsp; 该算法存在问题： &nbsp; <br> &nbsp; 1. &nbsp; 不能保证求得的最后解是最佳的； &nbsp; <br> &nbsp; 2. &nbsp; 不能用来求最大或最小解问题； &nbsp; <br> &nbsp; 3. &nbsp; 只能求满足某些约束条件的可行解的范围。
实现该算法的过程： &nbsp; <br> &nbsp; 从问题的某一初始解出发；<br>&nbsp;&nbsp; <br> &nbsp; while &nbsp; 能朝给定总目标前进一步 &nbsp; do &nbsp; <br> &nbsp; 求出可行解的一个解元素； &nbsp; <br> &nbsp; 由所有解元素组合成问题的一个可行解
<br><br>贪心算法最经典的例子，给钱问题。 &nbsp; <br> &nbsp; 比如中国的货币，只看元，有1元2元5元10元20、50、100 &nbsp; <br> &nbsp;  &nbsp; <br> &nbsp; 如果我要16元，可以拿16个1元，8个2元，但是怎么最少呢？ &nbsp; <br> &nbsp; 如果用贪心算，就是我每一次拿那张可能拿的最大的。 &nbsp; <br> &nbsp; 比如16，我第一次拿20拿不起，拿10元，OK，剩下6元，再拿个5元，剩下1元 &nbsp; <br> &nbsp; 也就是3张 &nbsp; 10、5、1。 &nbsp; <br> &nbsp;  &nbsp; <br> &nbsp; 每次拿能拿的最大的，就是贪心。 &nbsp; <br> &nbsp;  &nbsp; <br> &nbsp; 但是一定注意，贪心得到的并不是最优解，也就是说用贪心不一定是拿的最少的张数 &nbsp; <br> &nbsp; 贪心只能得到一个比较好的解，而且贪心算法很好想得到。 &nbsp; <br> &nbsp; 再注意，为什么我们的钱可以用贪心呢？因为我们国家的钱的大小设计，正好可以使得贪心算法算出来的是最优解（一般是个国家的钱币都应该这么设计）。如果设计成别的样子情况就不同了 &nbsp; <br> &nbsp; 比如某国的钱币分为 &nbsp; 1元3元4元 &nbsp; <br> &nbsp; 如果要拿6元钱 &nbsp; 怎么拿？贪心的话 &nbsp; 先拿4 &nbsp; 再拿两个1 &nbsp;  &nbsp; 一共3张钱 &nbsp; <br> &nbsp; 实际最优呢？ &nbsp; 两张3元就够了 &nbsp;
<br><br><br>
<div>求最优解的问题，从根本上说是一种对解空间的遍历。最直接的暴力分析容易得到，最优解的解空间通常都是以指数阶增长，因此暴力穷举都是不可行的。</div>
<div>最优解问题大部分都可以拆分成一个个的子问题，把解空间的遍历视作对子问题树的遍历，则以某种形式对树整个的遍历一遍就可以求出最优解，如上面的分析，这是不可行的。</div>
<div>贪心和动态规划本质上是对子问题树的一种修剪。两种算法要求问题都具有的一个性质就是&#8220;子问题最优性&#8221;。即，组成最优解的每一个子问题的解，对
于这个子问题本身肯定也是最优的。如果以自顶向下的方向看问题树（原问题作根），则，我们每次只需要向下遍历代表最优解的子树就可以保证会得到整体的最优
解。形象一点说，可以简单的用一个值（最优值）代表整个子树，而不用去求出这个子树所可能代表的所有值。</div>
<div>动态规划方法代表了这一类问题的一般解法。我们自底向上（从叶子向根）构造子问题的解，对每一个子树的根，求出下面每一个叶子的值，并且以其中
的最优值作为自身的值，其它的值舍弃。动态规划的代价就取决于可选择的数目（树的叉数）和子问题的的数目（树的节点数，或者是树的高度？）。</div>
<div>贪心算法是动态规划方法的一个特例。贪心特在，可以证明，每一个子树的根的值不取决于下面叶子的值，而只取决于当前问题的状况。换句话说，不需
要知道一个节点所有子树的情况，就可以求出这个节点的值。通常这个值都是对于当前的问题情况下，显而易见的&#8220;最优&#8221;情况。因此用&#8220;贪心&#8221;来描述这个算法的
本质。由于贪心算法的这个特性，它对解空间树的遍历不需要自底向上，而只需要自根开始，选择最优的路，一直走到底就可以了。这样，与动态规划相比，它的代
价只取决于子问题的数目，而选择数目总为1。</div>
<br><br><img src ="http://www.cppblog.com/michaelgao/aggbug/67196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-11-18 11:20 <a href="http://www.cppblog.com/michaelgao/archive/2008/11/18/67196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Merge sort的实现</title><link>http://www.cppblog.com/michaelgao/archive/2008/10/08/63463.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Wed, 08 Oct 2008 07:01:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/10/08/63463.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/63463.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/10/08/63463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/63463.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/63463.html</trackback:ping><description><![CDATA[#include&nbsp; &lt;iostream&gt;<br>using namespace std;<br>#include &lt;assert.h&gt;<br>int MergeSort(int A[],int p,int q,int r)<br>{<br>&nbsp;&nbsp;&nbsp; int n1 = q-p+2;<br>&nbsp;&nbsp;&nbsp; int n2 = r-q+1;<br>&nbsp;&nbsp;&nbsp; int *parray1 = new int[n1];<br>&nbsp;&nbsp;&nbsp; int *parray2 = new int[n2];<br>&nbsp;&nbsp;&nbsp; assert(parray1);<br>&nbsp;&nbsp;&nbsp; assert(parray2);<br>&nbsp;&nbsp;&nbsp; for(int i = 0;i&lt;n1-1;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parray1[i] = A[p+i];<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; parray1[n1-1] = 0xffff;<br>&nbsp;&nbsp;&nbsp; for(int i = 0;i&lt;n2-1;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parray2[i] = A[q+i+1];<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; parray2[n2-1] = 0xffff;<br>&nbsp;&nbsp;&nbsp; for(int i=0,j=0,k=p;k&lt;=r;k++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(parray1[i]&gt;parray2[j])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A[k] = parray2[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A[k] = parray1[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; delete []parray1;<br>&nbsp;&nbsp;&nbsp; delete []parray2;<br><br>
<br>}<br>int Merge(int A[],int p,int r)<br>{<br>&nbsp;&nbsp;&nbsp; if(p&lt;r)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int q = (p+r)/2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Merge(A,p,q);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Merge(A,q+1,r);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MergeSort(A,p,q,r);<br>&nbsp;&nbsp;&nbsp; }<br>}<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int a[]={5,2,4,7,1,3,2,6};<br>&nbsp;&nbsp;&nbsp; Merge(a,0,sizeof(a)/sizeof(int)-1);<br>&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;8;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;a[i]&lt;&lt;" ";<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;endl;<br>}<br><br>
<br>
<br>  <img src ="http://www.cppblog.com/michaelgao/aggbug/63463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-10-08 15:01 <a href="http://www.cppblog.com/michaelgao/archive/2008/10/08/63463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>散列函数</title><link>http://www.cppblog.com/michaelgao/archive/2008/08/18/59202.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Mon, 18 Aug 2008 03:26:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/08/18/59202.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/59202.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/08/18/59202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/59202.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/59202.html</trackback:ping><description><![CDATA[将关键字转化为表地址的函数称为散列函数。理想的散列函数易于转换并且是随机的，这里的随机是指对每一个输入，相应的输出在某种程度上是等概率的。<br>常用的散列函数，适用于整数，模散列函数：k mod（M)<br>适用于关键字为字符串的算法：霍纳算法。<br>散列最主要的优越性能在于能够提供近似于常数的时间。<br> <img src ="http://www.cppblog.com/michaelgao/aggbug/59202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-08-18 11:26 <a href="http://www.cppblog.com/michaelgao/archive/2008/08/18/59202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>四则运算的实现</title><link>http://www.cppblog.com/michaelgao/archive/2008/07/22/56866.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Tue, 22 Jul 2008 07:40:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/07/22/56866.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/56866.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/07/22/56866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/56866.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/56866.html</trackback:ping><description><![CDATA[四则运算包括括号一般用栈来实现。<br>#include "stack.h"<br>#include &lt;string&gt;<br>#include &lt;iostream&gt;<br>using namespace std;<br><br>int main(int argc,char *argv[])<br>{<br>&nbsp;&nbsp;&nbsp; //char *a = argv[1];<br>&nbsp;&nbsp; // char *a = "(((2*(3-3))+5)*3)";<br>&nbsp;&nbsp;&nbsp; char *a = "4*3-2";<br>&nbsp;&nbsp;&nbsp; size_t len = strlen(a);<br><br>&nbsp;&nbsp;&nbsp; //the operation value<br>&nbsp;&nbsp;&nbsp; MyStack&lt;int&gt; opv(128);<br>&nbsp;&nbsp;&nbsp; //the opeartion transfer<br>&nbsp;&nbsp;&nbsp; MyStack&lt;char&gt; opt(128);<br><br><br>&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;len;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((a[i]&gt;='0')&amp;&amp;(a[i]&lt;='9'))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt;a[i];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; opv.push(0);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while((a[i]&gt;='0')&amp;&amp;(a[i]&lt;='9'))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; opv.push(opv.pop()*10+a[i++]-'0');<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(')'== a[i]) <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char c = opt.pop();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if('*' == c)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; opv.push(opv.pop()*opv.pop());<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if('+' == c)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; opv.push(opv.pop()+opv.pop());<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if('-' == c)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; opv.push(-(opv.pop()-opv.pop()));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br><br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(('-'== a[i])||('+' == a[i])||('*' == a[i]))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; opt.push(a[i]);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;opv.pop()&lt;&lt;endl;<br><br><br>}<br>    <img src ="http://www.cppblog.com/michaelgao/aggbug/56866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-07-22 15:40 <a href="http://www.cppblog.com/michaelgao/archive/2008/07/22/56866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内部排序的几种方法的比较</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/27/54810.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Fri, 27 Jun 2008 08:01:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/27/54810.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/54810.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/27/54810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/54810.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/54810.html</trackback:ping><description><![CDATA[内部排序的几种方法的比较
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最坏时间复杂度&nbsp; 平均时间复杂度&nbsp; 空间复杂度&nbsp;&nbsp; 稳定排序&nbsp; 其它特点<br>冒泡排序<br>快速排序<br><br>插入排序<br>shell排序<br><br>选择排序<br>堆排序<br><br>归并排序<br><br>基数排序<br>http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.7.1.1.htm
<br><br><br>   <img src ="http://www.cppblog.com/michaelgao/aggbug/54810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-27 16:01 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/27/54810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mykmp</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/26/54685.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Thu, 26 Jun 2008 09:37:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/26/54685.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/54685.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/26/54685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/54685.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/54685.html</trackback:ping><description><![CDATA[#include &lt;iostream&gt;<br>using namespace std;<br>int getIndex(const char * p,int next[])<br>{<br>&nbsp;&nbsp;&nbsp; if(p == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; int k = -1;<br>&nbsp;&nbsp;&nbsp; int j = 0;<br>&nbsp;&nbsp;&nbsp; next[0] = -1;<br>&nbsp;&nbsp;&nbsp; while(p[j])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(k==-1||p[k]==p[j])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++k;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(p[k]!=p[j])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next[j] = k;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next[j] = next[k];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = next[k];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br><br>int kmpcompare(const char * srcstr,const char * deststr,int next[] )<br>{<br>&nbsp;&nbsp;&nbsp; if(!srcstr ||!deststr||!next)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; int i = 0;<br>&nbsp;&nbsp;&nbsp; int j = 0;<br>&nbsp;&nbsp;&nbsp; while(srcstr[i]!='\0'&amp;&amp;deststr[j]!='\0')<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(srcstr[i] == deststr[j])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(next[j]!=-1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j = next[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if(deststr[j] == '\0')<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i-j;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>
<br><br>
<br><img src ="http://www.cppblog.com/michaelgao/aggbug/54685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-26 17:37 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/26/54685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆排分析。</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/16/53520.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Mon, 16 Jun 2008 03:40:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/16/53520.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/53520.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/16/53520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/53520.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/53520.html</trackback:ping><description><![CDATA[堆优化的方法：<br>1、自顶向下<br>template &lt;class Item&gt;<br>void fixDown(Item a[],int k,int N)<br>{<br>&nbsp;&nbsp;&nbsp; Item temp;<br>&nbsp;&nbsp;&nbsp; while(2*k &lt;= N)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = 2*k;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j&lt;N&amp;&amp;a[j]&lt;a[j+1]) j++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(a[k]&lt;a[j])) break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout&lt;&lt;"fixdown"&lt;&lt;j&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exch(a[k],a[j]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = j;<br>&nbsp;&nbsp;&nbsp; }<br>}<br>根据堆是个完全二叉树，把除了叶节点以外的从下往上逐步排好。<br>2、自底向上<br>template &lt;class Item&gt;<br>void fixUp(Item a[],int k)<br>{<br>&nbsp;&nbsp;&nbsp; while(k&gt;1 &amp;&amp; a[k/2]&lt;a[k])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exch(a[k],a[k/2]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = k/2;<br>&nbsp;&nbsp;&nbsp; }<br>}
<br><br>堆排排序的步骤，<br>1、建立堆。<br>可以插入的方法或者采取修正堆的方法。<br>&nbsp; for(k=N/2;k&gt;=l;k--)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fixDown(pq,k,N);<br>&nbsp;&nbsp;&nbsp; }
<br>2、逐步排序。<br>&nbsp;&nbsp; while(N&gt;l)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exch(pq[l],pq[N]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fixDown(pq,l,--N);<br>&nbsp;&nbsp;&nbsp; }
<br><br>总算法：<br>template &lt;class Item&gt;<br>void heapsort(Item a[],int l,int r)<br>{<br>&nbsp;&nbsp;&nbsp; int&nbsp; k = l,N = r-l+1;<br>&nbsp;&nbsp;&nbsp; Item *pq = a+l-1;<br>&nbsp;&nbsp;&nbsp; for(k=N/2;k&gt;=l;k--)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fixDown(pq,k,N);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; while(N&gt;l)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exch(pq[l],pq[N]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fixDown(pq,l,--N);<br>&nbsp;&nbsp;&nbsp; }<br><br>}
<br><br><br><br>堆排序引申的题目。<br>如果需要<font color="#cc0033">找出</font>N<font color="#cc0033">个数</font>中<font color="#cc0033">最大的K个</font>不同的数
<br>
<p><br></p>
<p>设<em>N</em> &gt; <em>K</em>，前<em>K</em>个数中的最大<em>K</em>个数是一个退化的情况，所有<em>K</em>个数就是最大的<em>K</em>个数。如果考虑第<em>K</em>+1个数<em>X</em>呢？如果<em>X</em>比最大的<em>K</em>个数中的最小的数<em>Y</em>小，那么最大的<em>K</em>个数还是保持不变。如果<em>X</em>比<em>Y</em>大，那么最大的<em>K</em>个数应该去掉<em>Y</em>，而包含<em>X</em>。如果用一个数组来存储最大的<em>K</em>个数，每新加入一个数<em>X</em>，就扫描一遍数组，得到数组中最小的数<em>Y</em>。用<em>X</em>替代<em>Y</em>，或者保持原数组不变。这样的方法，所耗费的时间为<em>O</em>（<em>N</em> *<em> K</em>）。</p>
<p>进一步，可以用容量为<em>K</em>的最小堆来存储最大的<em>K</em>个数。最小堆的堆顶元素就是最大<em>K</em>个数中最小的一个。每次新考虑一个数<em>X</em>，如果<em>X</em>比堆顶的元素<em>Y</em>小，则不需要改变原来的堆，因为这个元素比最大的<em>K</em>个数小。如果<em>X</em>比堆顶元素大，那么用<em>X</em>替换堆顶的元素<em>Y</em>。在<em>X</em>替换堆顶元素<em>Y</em>之后，<em>X</em>可能破坏最小堆的结构（每个结点都比它的父亲结点大），需要更新堆来维持堆的性质。更新过程花费的时间复杂度为<em>O</em>（log<sub>2</sub><em>K</em>）。</p>
<p><img alt="ImageName" src="http://www.msra.cn/files/images/5c5c36b2-0167-4274-931b-cf102a8d8d3c.bmp" aligh="absMiddle" border="0" height="180"></p>
<p>图2-1</p>
<p>图2-1是一个堆，用一个数组<em>h</em>[]表示。每个元素<em>h</em>[<em>i</em>]，它的父亲结点是<em>h</em>[<em>i</em>/2]，儿子结点是<em>h</em>[2 * <em>i</em> + 1]和<em>h</em>[2 * <em>i</em> + 2]。每新考虑一个数<em>X</em>，需要进行的更新操作伪代码如下:
</p>
<p>代码清单2-13
</p>
<div>
<p>if(X &gt; h[0])</p>
</div>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; h[0] = X;</p>
<p>&nbsp;&nbsp;&nbsp; p = 0;</p>
<p>&nbsp;&nbsp;&nbsp; while(p &lt; K)</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q = 2 * p + 1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(q &gt;= K) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((q &lt; K &#8211; 1) &amp;&amp; (h[q + 1] &lt; h[q]))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q = q + 1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(h[q] &lt; h[p])</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = h[p]; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h[p] = h[q];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h[q] = t;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = q;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<div>
<p>}</p>
</div>
<p>因此，算法只需要扫描所有的数据一次，时间复杂度为<em>O</em>（<em>N</em> * log<sub>2</sub><em>K</em>）。这实际上是部分执行了堆排序的算法。在空间方面，由于这个算法只扫描所有的数据一次，因此我们只需要存储一个容量为<em>K</em>的堆。大多数情况下，堆可以全部载入内存。如果<em>K</em>仍然很大，我们可以尝试先找最大的<em>K</em>&#8217;个元素，然后找第<em>K</em>&#8217;+1个到第2 * <em>K</em>&#8217;个元素，如此类推（其中容量<em>K</em>&#8217;的堆可以完全载入内存）。不过这样，我们需要扫描所有数据ceil<a title="" href="http://www.msra.cn/Articles/ArticleItem.aspx?Guid=1b973c2c-40eb-4d19-b554-5482549ab1a9#_ftn1" name="_ftnref1"></a>（<em>K</em>/<em>K</em>&#8217;）次。</p>
<br><br>   <img src ="http://www.cppblog.com/michaelgao/aggbug/53520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-16 11:40 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/16/53520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快排分析</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/16/53519.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Mon, 16 Jun 2008 03:40:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/16/53519.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/53519.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/16/53519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/53519.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/53519.html</trackback:ping><description><![CDATA[快排分析 ，快排与冒泡排序是相关联的。<br>template&lt;class T&gt;<br>bubblesort(T *src,int lne)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}<br>前者是通过相邻之间交换的方式来。<br>而后者是通过一个值得比较来交换的方式。<br><br>template &lt;class T&gt;<br>void quicksort(T *src,int low,int high)<br>{<br>&nbsp;&nbsp;&nbsp; T temp;<br>&nbsp;&nbsp;&nbsp; int i = low;<br>&nbsp;&nbsp;&nbsp; int k = high;<br>&nbsp;&nbsp;&nbsp; if(low &gt;=high) return;<br>&nbsp;&nbsp;&nbsp; temp = src[low];<br><br>&nbsp;&nbsp;&nbsp; while(low&lt;high)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(low&lt;high&amp;&amp;src[high]&gt;=temp) high--;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src[low] = src[high];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(low&lt;high&amp;&amp;src[low]&lt;=temp) low++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src[high] = src[low];<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; src[low] = temp;<br>&nbsp;&nbsp;&nbsp; quicksort(src,i,low-1);<br>&nbsp;&nbsp;&nbsp; quicksort(src,low+1,k);<br>}<br><br>
<br>   <img src ="http://www.cppblog.com/michaelgao/aggbug/53519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-16 11:40 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/16/53519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>B树原理</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/16/53518.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Mon, 16 Jun 2008 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/16/53518.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/53518.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/16/53518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/53518.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/53518.html</trackback:ping><description><![CDATA[B树原理
<br><img src ="http://www.cppblog.com/michaelgao/aggbug/53518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-16 11:39 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/16/53518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉搜索树的随机化建立方法</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/16/53514.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Mon, 16 Jun 2008 03:26:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/16/53514.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/53514.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/16/53514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/53514.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/53514.html</trackback:ping><description><![CDATA[二叉搜索树的随机化建立方法
<br>二叉搜索数是一棵二叉树，其中每一个内部节点都有一个相关的关键字，并有负有以下的性质。任意节点的关键字大于（或者等于）该节点左子树的所有关键字，并小于（或者等于）该节点右子树的所有关键字。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;maxKey&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1000</span><span style="color: #000000;">;<br>typedef&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Key;<br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Item{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key&nbsp;keyval;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;info;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Item()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{keyvalue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;maxKey;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key&nbsp;key()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;keyvalue;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;keyvalue&nbsp;&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">maxKey;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;rand()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyval&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1000</span><span style="color: #000000;">*</span><span style="color: #000000;">::rand()</span><span style="color: #000000;">/</span><span style="color: #000000;">RAND_MAX;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;scan(istream</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">=</span><span style="color: #000000;">cin)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">(</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">keyvalue</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">info&nbsp;)</span><span style="color: #000000;">!=</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;show(ostream</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;os</span><span style="color: #000000;">=</span><span style="color: #000000;">cout)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">keyvalue</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">info</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br>ostream</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">(ostream&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">os,Item&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">X)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;X.show(os);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;os;<br>}</span></div>
<br></span><span style="color: #000000;"></span><span style="color: #000000;"><br>template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Item,</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Key</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ST<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;node<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Item&nbsp;item;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">l,</span><span style="color: #000000;">*</span><span style="color: #000000;">r;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node(Item&nbsp;x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;node&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;link;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link&nbsp;head;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;node&nbsp;nullitem;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;insertR(link&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">h,Item&nbsp;x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(h&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;node(x);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(x.key()</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">h</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">item.key())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insertR(h</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">l,x);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insertR(h</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">r,x);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Item&nbsp;searchR(link&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">h,Key&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(h&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;nullitem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(h</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">item.key()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;h</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Item;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(h</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">item.key()</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchR(h</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">right,v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchR(h</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">left,v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ST(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;count();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Item&nbsp;search(Key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;insert(Item);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;remove(Item);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Item&nbsp;select(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;show(ostream&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">);<br>};<br></span></div>
<br>   <img src ="http://www.cppblog.com/michaelgao/aggbug/53514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-16 11:26 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/16/53514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ＫＭＰ字符串匹配。</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/16/53505.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Mon, 16 Jun 2008 02:57:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/16/53505.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/53505.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/16/53505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/53505.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/53505.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载比较详细&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.cppblog.com/michaelgao/archive/2008/06/16/53505.html'>阅读全文</a><img src ="http://www.cppblog.com/michaelgao/aggbug/53505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-16 10:57 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/16/53505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>后序遍历的递归和非递归算法</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/15/53336.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Sun, 15 Jun 2008 06:37:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/15/53336.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/53336.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/15/53336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/53336.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/53336.html</trackback:ping><description><![CDATA[后序的递归算法。<br>template &lt;class T&gt;<br>void recposttraverse(struct node&lt;T&gt;* Tree)<br>{<br>&nbsp;&nbsp;&nbsp; if(Tree == NULL) return;<br>&nbsp;&nbsp;&nbsp; recposttraverse(Tree-&gt;left);<br>&nbsp;&nbsp;&nbsp; recposttraverse(Tree-&gt;right);<br>&nbsp;&nbsp;&nbsp; visitnode(Tree);<br>}
<br>后序的非递归算法要加入tag的实现。<br>template &lt;class T&gt;<br>void posttraverse(struct node&lt;T&gt;*tree)<br>{<br>&nbsp;&nbsp;&nbsp; if(tree == NULL) return;<br>&nbsp;&nbsp;&nbsp; MyStack&lt;struct node&lt;T&gt; *&gt; treestack;<br>&nbsp;&nbsp;&nbsp; treestack.init(20);<br>&nbsp;&nbsp;&nbsp; treestack.push(tree);<br>&nbsp;&nbsp;&nbsp; struct node&lt;T&gt;* Item;<br>&nbsp;&nbsp;&nbsp; while(treestack.gettop()!=0)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Item&nbsp; = treestack.pop();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Item&amp;&amp;Item-&gt;flag)//true is tree<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Item-&gt;flag = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; treestack.push(Item);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Item-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; treestack.push(Item-&gt;right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Item-&gt;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; treestack.push(Item-&gt;left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visitnode(Item);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; }<br><br><br>}<br><br>
<br><br>  <img src ="http://www.cppblog.com/michaelgao/aggbug/53336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-15 14:37 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/15/53336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中序遍历的递归算法和非递归算法</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/15/53335.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Sun, 15 Jun 2008 06:35:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/15/53335.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/53335.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/15/53335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/53335.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/53335.html</trackback:ping><description><![CDATA[中序遍历的递归算法和非递归算法。<br>template &lt;class T&gt;<br>void recitraverse(struct node&lt;T&gt;* Tree)<br>{<br>&nbsp;&nbsp;&nbsp; if(Tree == NULL) return;<br>&nbsp;&nbsp;&nbsp; itraverse(Tree-&gt;left);<br>&nbsp;&nbsp;&nbsp; visitnode(Tree);<br>&nbsp;&nbsp;&nbsp; itraverse(Tree-&gt;right);<br>}<br>中序遍历的非递归算法visit节点时与前序不同。<br>template &lt;class T&gt;<br>void itraverse(struct node&lt;T&gt;*tree)<br>{<br>&nbsp;&nbsp;&nbsp; if(tree == NULL) return;<br>&nbsp;&nbsp;&nbsp; MyStack&lt;struct node&lt;T&gt; *&gt; treestack;<br>&nbsp;&nbsp;&nbsp; treestack.init(20);<br>&nbsp;&nbsp;&nbsp; while(tree != NULL|| treestack.gettop()!=0)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(tree!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; treestack.push(tree);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree = tree-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree = treestack.pop();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visitnode(tree);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree = tree-&gt;right;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>
<br>    <img src ="http://www.cppblog.com/michaelgao/aggbug/53335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-15 14:35 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/15/53335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>前序遍历二叉树的递归和非递归算法</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/05/52302.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Thu, 05 Jun 2008 14:20:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/05/52302.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/52302.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/05/52302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/52302.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/52302.html</trackback:ping><description><![CDATA[递归算法和非递归算法本质是一样的。<br>遍历时从根节点开始访问，访问左子树，关键是把树的访问顺序搞清楚。<br>当遍历完以后又是根节点。<br><br>递归函数实际上就是栈的操作。<br>所谓的先根就是先visit完根节点，然后再遍历左子树，遍历右子树。<br>&nbsp;<br>template &lt;class T&gt;<br>void recpretraverse(struct node&lt;T&gt;*&amp;Tree)<br>{<br>&nbsp;&nbsp;&nbsp; if(Tree == NULL) return;<br>&nbsp;&nbsp;&nbsp; visitnode(Tree);<br>&nbsp;&nbsp;&nbsp; recpretraverse(Tree-&gt;left);<br>&nbsp;&nbsp;&nbsp; recpretraverse(Tree-&gt;right);<br>}
<br><br>对应的非递归算法就是弹出项，看如果是树，如果右子树存在则压入右子树，左子树存在则压入左子树，最后压入节点（tag域变化）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看如果是节点，则访问节点。<br>可以看出需要一个tag域来表示弹出节点还是树。但是前序和中序可以通过别的实现办法避免tag实现。<br>&nbsp; template &lt;class T&gt;<br>void pretraverse(struct node&lt;T&gt;*tree)<br>{<br>&nbsp;&nbsp;&nbsp; if(tree == NULL) return;<br>&nbsp;&nbsp;&nbsp; MyStack&lt;struct node&lt;T&gt; *&gt; treestack;<br>&nbsp;&nbsp;&nbsp; treestack.init(20);<br>&nbsp;&nbsp;&nbsp; while(tree != NULL|| treestack.gettop()!=0)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(tree!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; treestack.push(tree);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visitnode(tree);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree = tree-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree = treestack.pop();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree = tree-&gt;right;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>}
<br>
<br>
<br><br><br><br><br>          <img src ="http://www.cppblog.com/michaelgao/aggbug/52302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-05 22:20 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/05/52302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>