<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dutor &#187; 算法</title>
	<atom:link href="http://www.dutor.net/index.php/tag/algorithms/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dutor.net</link>
	<description>熟读而精思，循序而渐进，厚积而薄发。</description>
	<lastBuildDate>Tue, 17 Jan 2012 14:44:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>几种排序算法</title>
		<link>http://www.dutor.net/index.php/2010/10/sorts-of-sort-methods/</link>
		<comments>http://www.dutor.net/index.php/2010/10/sorts-of-sort-methods/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 01:28:11 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[排序]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2484</guid>
		<description><![CDATA[　　简单实现了常见的几种内部排序算法，包括冒泡（Bubble），插入（Insert），快速排序（Quick Sort），堆排序（Heap Sort），归并（Merge），希尔排序（Shell Sort），并对这些算法的耗时在伪随机数上进行了简单的测试。
　　说明：
<ul>
	<li>没有实现计数、基数排序等线性复杂度的算法；</li>

	<li>各算法只是对算法思想的一次简单模拟，没有过多的优化；</li>

	<li>各排序主程序接口参数均为整型数组及元素个数；</li>

	<li>程序计时使用了glibc的gettimeofday()，因此。。。；</li>

	<li>归并排序中，每次调用都申请和释放堆空间，因此比较耗时。可以采用原地归并、使用全局/静态的方法加以优化；</li>

	<li>快速排序中，对待排子序列的长度进行的了判断，对短序列进行优先排序可以减小函数的递归深度（而不是次数）；</li>

	<li>希尔排序中，为了简洁，步长因子统一取做2.2（11/5）。</li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>　　简单实现了常见的几种内部排序算法，包括冒泡（Bubble），插入（Insert），快速排序（Quick Sort），堆排序（Heap Sort），归并（Merge），希尔排序（Shell Sort），并对这些算法的耗时在伪随机数上进行了简单的测试。<br />
　　说明：</p>
<ul>
<li>没有实现计数、基数排序等线性复杂度的算法；</li>
<li>各算法只是对算法思想的一次简单模拟，没有过多的优化；</li>
<li>各排序主程序接口参数均为整型数组及元素个数；</li>
<li>程序计时使用了glibc的gettimeofday()，因此。。。；</li>
<li>归并排序中，每次调用都申请和释放堆空间，因此比较耗时。可以采用原地归并、使用全局/静态的方法加以优化；</li>
<li>快速排序中，对待排子序列的长度进行的了判断，对短序列进行优先排序可以减小函数的递归深度（而不是次数）；</li>
<li>希尔排序中，为了简洁，步长因子统一取做2.2（11/5）。</li>
</ul>
<p>　　下面是主程序，</p>

<div class="wp_codebox"><table><tr id="p24841"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
</pre></td><td class="code" id="p2484code1"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #339933;">#include &lt;memory.h&gt;</span>
<span style="color: #339933;">#include &lt;time.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/time.h&gt; //~ gettimeofday()</span>
&nbsp;
<span style="color: #993333;">typedef</span> <span style="color: #993333;">void</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>SORTFUN<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#define ASIZE 24*1024 //~ array size</span>
<span style="color: #339933;">#define SCOUNT 6 //~ number of sort method</span>
<span style="color: #000000; font-weight: bold;">enum</span> <span style="color: #009900;">&#123;</span>BUBBLE<span style="color: #339933;">,</span> INSERT<span style="color: #339933;">,</span> QSORT<span style="color: #339933;">,</span> HEAP<span style="color: #339933;">,</span> MERGE<span style="color: #339933;">,</span> SHELL<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fname<span style="color: #009900;">&#91;</span>SCOUNT<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #ff0000;">&quot;Bubble&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Insert&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Qsort&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #ff0000;">&quot;Heap&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Merge&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Shell&quot;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
SORTFUN fpointer<span style="color: #009900;">&#91;</span>SCOUNT<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//~ pointers to sort functions</span>
&nbsp;
<span style="color: #993333;">int</span> array<span style="color: #009900;">&#91;</span>SCOUNT<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>ASIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//~ array(s) under sort.</span>
&nbsp;
<span style="color: #993333;">long</span> timeused<span style="color: #009900;">&#91;</span>SCOUNT<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//~ time taken by every sort function</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*******************Generate random data*********************/</span>
<span style="color: #993333;">void</span>
gen_data<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    srand<span style="color: #009900;">&#40;</span>time<span style="color: #009900;">&#40;</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//~ rand seeding</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> ASIZE<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//~ generate random array[0]</span>
    <span style="color: #009900;">&#123;</span>
        array<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> rand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">%</span> ASIZE<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> SCOUNT<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//~ copy array[0] to the rest</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> ASIZE<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>j<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> array<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">//NOTE: using TWO loops to maximize caching</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/***********************Time the time**********************/</span>
<span style="color: #993333;">long</span>
timer<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//~ Current Time by millisecond</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">struct</span> timeval tv<span style="color: #339933;">;</span>
    gettimeofday<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>tv<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>tv.<span style="color: #202020;">tv_sec</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">1000</span> <span style="color: #339933;">+</span> tv.<span style="color: #202020;">tv_usec</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> AC<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>AV<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//~ Both of AC and AV are fascinating ^_^</span>
<span style="color: #009900;">&#123;</span>
    gen_data<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//NOTE: to disable a function, just comment it out below.</span>
    fpointer<span style="color: #009900;">&#91;</span>BUBBLE<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> bubble_sort<span style="color: #339933;">;</span>
    fpointer<span style="color: #009900;">&#91;</span>INSERT<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> insert_sort<span style="color: #339933;">;</span>
    fpointer<span style="color: #009900;">&#91;</span>QSORT<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> quick_sort<span style="color: #339933;">;</span>
    fpointer<span style="color: #009900;">&#91;</span>HEAP<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> heap_sort<span style="color: #339933;">;</span>
    fpointer<span style="color: #009900;">&#91;</span>MERGE<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> merge_sort<span style="color: #339933;">;</span>
    fpointer<span style="color: #009900;">&#91;</span>SHELL<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> shell_sort<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> SCOUNT<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">long</span> starttime <span style="color: #339933;">=</span> timer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        SORTFUN fp <span style="color: #339933;">=</span> fpointer<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>fp<span style="color: #009900;">&#41;</span>
            fp<span style="color: #009900;">&#40;</span>array<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> ASIZE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        timeused<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> timer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> starttime<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//~ Header</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%%Method<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>%%Time<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>%%Elements<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;-----------------------------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//~ result</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> SCOUNT<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>%ld<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> fname<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> timeused<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> ASIZE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>　　各种排序，</p>

<div class="wp_codebox"><table><tr id="p24842"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
</pre></td><td class="code" id="p2484code2"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/************************Bubble Sort**************************/</span>
<span style="color: #993333;">void</span>
bubble_sort<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #339933;">--</span>i<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> issorted <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//~ flag, for some optimition</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> i<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>j<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                issorted <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
                <span style="color: #993333;">int</span> tmp <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                a<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                a<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tmp<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>issorted<span style="color: #009900;">&#41;</span>
            <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/************************Insert Sort**************************/</span>
<span style="color: #993333;">void</span>
insert_sort<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> i <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">int</span> tmp <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">&amp;&amp;</span> tmp <span style="color: #339933;">&lt;</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            a<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #339933;">--</span>j<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        a<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tmp<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/************************Quick Sort**************************/</span>
<span style="color: #993333;">int</span>
partition<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//~ seperate a[], using a[0] as pivot</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> l <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> r <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> pivot <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>l<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>l <span style="color: #339933;">&lt;</span> r<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span> l <span style="color: #339933;">&lt;</span> r <span style="color: #339933;">&amp;&amp;</span> a<span style="color: #009900;">&#91;</span><span style="color: #339933;">--</span>r<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> pivot<span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
        a<span style="color: #009900;">&#91;</span>l<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>r<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>l <span style="color: #339933;">&lt;</span> r <span style="color: #339933;">&amp;&amp;</span> a<span style="color: #009900;">&#91;</span><span style="color: #339933;">++</span>l<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> pivot<span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
        a<span style="color: #009900;">&#91;</span>r<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>l<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    a<span style="color: #009900;">&#91;</span>l<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> pivot<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> l<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//~ return the final index of pivot</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span>
quick_sort<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>n <span style="color: #339933;">&lt;=</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> m <span style="color: #339933;">=</span> partition<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>m <span style="color: #339933;">&lt;=</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        quick_sort<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        quick_sort<span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> m <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> n <span style="color: #339933;">-</span> m <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        quick_sort<span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> m <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> n <span style="color: #339933;">-</span> m <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        quick_sort<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/************************Quik Sort**************************/</span>
<span style="color: #993333;">void</span>
sift<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//~ sift to rebuild the heap rooted by a[i]</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> tmp <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #339933;">*</span>i <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">&lt;</span> n<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">*</span>i <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">&lt;</span> n <span style="color: #339933;">&amp;&amp;</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
            <span style="color: #339933;">++</span>j<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> tmp<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            i <span style="color: #339933;">=</span> j<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
            <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tmp<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span>
heap_sort<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>n<span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #339933;">--</span>i<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//~ build heap</span>
    <span style="color: #009900;">&#123;</span>
        sift<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//~ rebuild the decreasing heap over and over</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> tmp <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>n<span style="color: #339933;">-</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        a<span style="color: #009900;">&#91;</span>n<span style="color: #339933;">-</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tmp<span style="color: #339933;">;</span>
        sift<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> n <span style="color: #339933;">-</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/***********************Merge Sort**********************/</span>
<span style="color: #993333;">void</span>
merge_sort<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>n <span style="color: #339933;">==</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ext <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    merge_sort<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    merge_sort<span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    memcpy<span style="color: #009900;">&#40;</span>ext<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> j <span style="color: #339933;">=</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">,</span> k <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&lt;</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">&amp;&amp;</span> j <span style="color: #339933;">&lt;</span> n<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> ext<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
            a<span style="color: #009900;">&#91;</span>k<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">else</span>
            a<span style="color: #009900;">&#91;</span>k<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> ext<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&lt;</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span>
        a<span style="color: #009900;">&#91;</span>k<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> ext<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">&lt;</span> n<span style="color: #009900;">&#41;</span>
        a<span style="color: #009900;">&#91;</span>k<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    free<span style="color: #009900;">&#40;</span>ext<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/***********************Shell Sort**********************/</span>
<span style="color: #993333;">void</span>
shell_sort<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span> a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> step <span style="color: #339933;">=</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>step <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> step<span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #993333;">int</span> tmp <span style="color: #339933;">=</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #993333;">int</span> j <span style="color: #339933;">=</span> i <span style="color: #339933;">-</span> step<span style="color: #339933;">;</span>
            <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>j <span style="color: #339933;">&gt;=</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">&amp;&amp;</span> tmp <span style="color: #339933;">&lt;</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> j<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> j <span style="color: #339933;">+</span> step<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                j <span style="color: #339933;">-=</span> step<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> j <span style="color: #339933;">+</span> step<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> tmp<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>step <span style="color: #339933;">==</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span>
            step <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">else</span>
            step <span style="color: #339933;">=</span> step <span style="color: #339933;">*</span> <span style="color: #0000dd;">11</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//~ integer is better</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>　　对测试结果做一下简要的总结：</p>
<ul>
<li>快排不是盖的，在我有限的随机测试中，它始终是最快的；</li>
<li>这里的归并排序由于堆内存的频繁申请与释放，相比同量级的其它算法，是最慢的；</li>
<li>希尔排序相当给力，尽管步长因子选择很粗糙，但在我的测试中，还是超过了堆排序。这从侧面证明了，在接近有序时插入排序是很快的。事实上，插入排序，由于其简洁性，常常做为高级排序算法的末级算法（局部算法）。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/10/sorts-of-sort-methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>单源最短路径Bellman-Ford算法</title>
		<link>http://www.dutor.net/index.php/2010/05/shortest-path-bellman-ford/</link>
		<comments>http://www.dutor.net/index.php/2010/05/shortest-path-bellman-ford/#comments</comments>
		<pubDate>Thu, 06 May 2010 12:57:48 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[图论]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2254</guid>
		<description><![CDATA[<h4>Bellman-Ford算法简述</h4>
　　<a href="http://www.dutor.net/index.php/2010/04/shortest-path-dijkstra/" target="_blank">Dijkstra算法</a>是处理单源最短路径的有效算法，但它局限于边的权值非负的情况，若图中出现权值为负的边，Dijkstra算法就会失效，求出的最短路径就可能是错的。这时候，就需要使用其他的算法来求解最短路径，Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼（Richard Bellman, 动态规划的提出者）和小莱斯特•福特（Lester Ford）发明。Bellman-Ford算法的流程如下：
　　给定图G(V, E)（其中V、E分别为图G的顶点集与边集），源点s，
<ol>
	<li>数组Distant[i]记录从源点s到顶点i的路径长度，初始化数组Distant[n]为$$\color{red} \infty$$, Distant[s]为0；</li>
	<li>以下操作循环执行至多n-1次，n为顶点数：
<ul>
	<li>对于每一条边e(u, v)，如果Distant[u] + w(u, v) < Distant[v]，则另Distant[v] = Distant[u]+w(u, v)。w(u, v)为边e(u,v)的权值；</li>
	<li>若上述操作没有对Distant进行更新，说明最短路径已经查找完毕，或者部分点不可达，跳出循环。否则执行下次循环；</li>
</ul>
</li>
	<li>为了检测图中是否存在负环路，即权值之和小于0的环路。对于每一条边e(u, v)，如果存在Distant[u] + w(u, v) < Distant[v]的边，则图中存在负环路，即是说改图无法求出单源最短路径。否则数组Distant[n]中记录的就是源点s到各顶点的最短路径长度。</li>
</ol>
　　可知，Bellman-Ford算法寻找单源最短路径的时间复杂度为O(V*E).]]></description>
			<content:encoded><![CDATA[<h4>Bellman-Ford算法简述</h4>
<p>　　<a href="http://www.dutor.net/index.php/2010/04/shortest-path-dijkstra/" target="_blank">Dijkstra算法</a>是处理单源最短路径的有效算法，但它局限于边的权值非负的情况，若图中出现权值为负的边，Dijkstra算法就会失效，求出的最短路径就可能是错的。这时候，就需要使用其他的算法来求解最短路径，Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼（Richard Bellman, 动态规划的提出者）和小莱斯特•福特（Lester Ford）发明。Bellman-Ford算法的流程如下：<br />
　　给定图G(V, E)（其中V、E分别为图G的顶点集与边集），源点s，</p>
<ol>
<li>数组Distant[i]记录从源点s到顶点i的路径长度，初始化数组Distant[n]为<img src="http://www.dutor.net/wp-content/cache/3a39ec3839566b7a0da75d0b72c48d19.png" align="absmiddle" class="tex" alt="\color{red} \infty" />, Distant[s]为0；</li>
<li>以下操作循环执行至多n-1次，n为顶点数：
<ul>
<li>对于每一条边e(u, v)，如果Distant[u] + w(u, v) < Distant[v]，则另Distant[v] = Distant[u]+w(u, v)。w(u, v)为边e(u,v)的权值；</li>
<li>若上述操作没有对Distant进行更新，说明最短路径已经查找完毕，或者部分点不可达，跳出循环。否则执行下次循环；</li>
</ul>
</li>
<li>为了检测图中是否存在负环路，即权值之和小于0的环路。对于每一条边e(u, v)，如果存在Distant[u] + w(u, v) < Distant[v]的边，则图中存在负环路，即是说改图无法求出单源最短路径。否则数组Distant[n]中记录的就是源点s到各顶点的最短路径长度。</li>
</ol>
<p>　　可知，Bellman-Ford算法寻找单源最短路径的时间复杂度为O(V*E).</p>
<h4>Bellman-Ford算法C++实现</h4>

<div class="wp_codebox"><table><tr id="p22543"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
</pre></td><td class="code" id="p2254code3"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXINT <span style="color: #000080;">=</span> <span style="color: #208080;">0xFFFF</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 不可达的路径长度上限</span>
<span style="color: #0000ff;">struct</span> Node
<span style="color: #008000;">&#123;</span>
    Node<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> w<span style="color: #008000;">&#40;</span>MAXINT<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> src, <span style="color: #666666;">//~ 最短路径上的上一个顶点</span>
        w<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 到该节点的路径长度</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> Edge
<span style="color: #008000;">&#123;</span>
    Edge<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    Edge<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> f, <span style="color: #0000ff;">int</span> t<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> from<span style="color: #008000;">&#40;</span>f<span style="color: #008000;">&#41;</span>, to<span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> from,
        to<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">**</span>argv<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span>vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> <span style="color: #000080;">&gt;</span> Adj<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> n, <span style="color: #666666;">// 顶点数</span>
        m, <span style="color: #666666;">//~ 边数</span>
        from,
        to,
        w,
        start<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 源点</span>
    <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>n<span style="color: #008080;">;</span>
    vector<span style="color: #000080;">&lt;</span>Node<span style="color: #000080;">&gt;</span> Dist<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        Adj.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>n, MAXINT<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        Adj<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>m<span style="color: #008080;">;</span>
    vector<span style="color: #000080;">&lt;</span>Edge<span style="color: #000080;">&gt;</span> Edges<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> m<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>from<span style="color: #000080;">&gt;&gt;</span>to<span style="color: #000080;">&gt;&gt;</span>w<span style="color: #008080;">;</span>
        Adj<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> w<span style="color: #008080;">;</span>
        Edges.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>Edge<span style="color: #008000;">&#40;</span>from, to<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>start<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 从顶点start开始的最短路径</span>
    Dist<span style="color: #008000;">&#91;</span>start<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~</span>
    <span style="color: #0000ff;">bool</span> flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> Edges.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>j<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            from <span style="color: #000080;">=</span> Edges<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">from</span><span style="color: #008080;">;</span>
            to <span style="color: #000080;">=</span> Edges<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">to</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>Dist<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000080;">==</span> MAXINT <span style="color: #000040;">||</span> Adj<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> MAXINT<span style="color: #008000;">&#41;</span>
                <span style="color: #0000ff;">continue</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>Dist<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000040;">+</span> Adj<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> Dist<span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Dist<span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000080;">=</span> Dist<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000040;">+</span> Adj<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                Dist<span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">src</span> <span style="color: #000080;">=</span> from<span style="color: #008080;">;</span>
                flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>flag <span style="color: #000080;">==</span> <span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span>
            <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">else</span>
            flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #666666;">//~ 检测有无负环路</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> Edges.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>j<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        from <span style="color: #000080;">=</span> Edges<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">from</span><span style="color: #008080;">;</span>
        to <span style="color: #000080;">=</span> Edges<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">to</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>Dist<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000080;">==</span> MAXINT <span style="color: #000040;">||</span> Adj<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> MAXINT<span style="color: #008000;">&#41;</span>
            <span style="color: #0000ff;">continue</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>Dist<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000040;">+</span> Adj<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> Dist<span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;Negative Length Cycle Detected!&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #666666;">//~ 下面代码供测试用</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>to<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">int</span> rp <span style="color: #000080;">=</span> to<span style="color: #008080;">;</span>
        <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>Dist<span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>rp <span style="color: #000040;">!</span><span style="color: #000080;">=</span> start<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 反向输出路径</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>rp<span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot; &lt;- &quot;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>Dist<span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000080;">==</span> MAXINT<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
            rp <span style="color: #000080;">=</span> Dist<span style="color: #008000;">&#91;</span>rp<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">src</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>start<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/05/shortest-path-bellman-ford/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>出栈序列计数</title>
		<link>http://www.dutor.net/index.php/2010/04/catalan-count/</link>
		<comments>http://www.dutor.net/index.php/2010/04/catalan-count/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 11:39:46 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[数理空间]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2222</guid>
		<description><![CDATA[　　现有一个数列$$S = \{1,2,3,\ldots,n\}$$，另有一个栈Stack和一个队列Queue，Stack与Queue初始为空。现对S中元素依次进行如下操作：
<ol>
	<li>若Stack为空，则从S中取出一个元素入栈；</li>
	<li>若Stack非空，则有两种选择：将栈顶元素弹出并入队，或者从S中取出一个元素入栈；</li>
	<li>若S元素已经取完则操作结束，否则执行操作1或2。</li>
</ol>
　　问最终队列Queue有多少种排列情况？聪明且见识广博的你或许一下子就可以说出答案：$$\120dpi \color{red}\frac{C_{2n}^{n}}{n+1}\quad\textbf{or}\quad\frac{\binom{2n}{n}}{n+1}$$
　　现在对这个结果进行证明。
　　设1表示入栈操作，0表示出栈操作。那么上面对n个元素的入栈和出栈操作就构成了长度为2n的由0和1组成的序列，其中1和0的个数均为n个，在没有任何限制的情况下，一共有$$C_{2n}^n$$个这样的序列。但是，这里的01序列是建立在一些列的入栈出栈操作的基础上的，因此就会受到入栈、出栈操作的限制。这里，唯一的限制就是栈为空时，无法进行出栈操作。反映到这个01序列中就是，任意位置之前，0的个数都能比1的个数多。因为有了01序列的总数$$C_{2n}^n$$，所以为了找出满足条件的序列的个数，只需要找出不符合条件的序列的个数。]]></description>
			<content:encoded><![CDATA[<p>　　现有一个数列<img src="http://www.dutor.net/wp-content/cache/6c8ed79ba0c420a15eb059d708d93f25.png" align="absmiddle" class="tex" alt="S = \{1,2,3,\ldots,n\}" />，另有一个栈Stack和一个队列Queue，Stack与Queue初始为空。现对S中元素依次进行如下操作：</p>
<ol>
<li>若Stack为空，则从S中取出一个元素入栈；</li>
<li>若Stack非空，则有两种选择：将栈顶元素弹出并入队，或者从S中取出一个元素入栈；</li>
<li>若S元素已经取完则操作结束，否则执行操作1或2。</li>
</ol>
<p>　　问最终队列Queue有多少种排列情况？聪明且见识广博的你或许一下子就可以说出答案：<img src="http://www.dutor.net/wp-content/cache/d51374e717cdc01e07e23bc4689decd7.png" align="absmiddle" class="tex" alt="\120dpi \color{red}\frac{C_{2n}^{n}}{n+1}\quad\textbf{or}\quad\frac{\binom{2n}{n}}{n+1}" /><br />
　　现在对这个结果进行证明。<br />
　　设1表示入栈操作，0表示出栈操作。那么上面对n个元素的入栈和出栈操作就构成了长度为2n的由0和1组成的序列，其中1和0的个数均为n个，在没有任何限制的情况下，一共有<img src="http://www.dutor.net/wp-content/cache/e659e4628b3668b3c4762011fbab3311.png" align="absmiddle" class="tex" alt="C_{2n}^n" />个这样的序列。但是，这里的01序列是建立在一些列的入栈出栈操作的基础上的，因此就会受到入栈、出栈操作的限制。这里，唯一的限制就是栈为空时，无法进行出栈操作。反映到这个01序列中就是，任意位置之前，0的个数都能比1的个数多。因为有了01序列的总数<img src="http://www.dutor.net/wp-content/cache/e659e4628b3668b3c4762011fbab3311.png" align="absmiddle" class="tex" alt="C_{2n}^n" />，所以为了找出满足条件的序列的个数，只需要找出不符合条件的序列的个数。<br />
　　假设我们现在找到这样一个不符合条件的序列，那么这个序列中一定存在这样一个最小的位置k，k之前1的个数为m，0的个数为m+1。那么k之后1的个数就是n-m，0的个数为n-m-1。现在我们把k后面的01序列进行取反操作，即0变成1、1变成0。此时整个序列中有n-1个1，n+1个0。由构造过程可知，每一个<strong>不满足条件</strong>的01序列都唯一地对应一个长度为2n、含有n-1个1、n+1个0的序列。有上述变换的逆操作易知，每一个长度为2n、含有n-1个1、n+1个0的序列都唯一地对应一个不满足条件的01序列。而长度为2n、含有n-1个1、n+1个0的序列得个数为<img src="http://www.dutor.net/wp-content/cache/91f17fe6ab5ae122226bd4fa9b013501.png" align="absmiddle" class="tex" alt="C_{2n}^{n-1}" />。最后我们就证明了，满足条件的01序列的个数为：<br />
<img src="http://www.dutor.net/wp-content/cache/e6f0f33784fd05dda096ae9b2fabfc7d.png" align="absmiddle" class="tex" alt="\120dpi \color{red} C_n = C_{2n}^{n}-C_{2n}^{n-1} = C_{2n}^{n}-C_{2n}^{n+1} = \frac{1}{n+1}C_{2n}^{n}" /><br />
　　这个式子所表示的数列（设为h）叫做<a href="http://zh.wikipedia.org/zh/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0" target="_blank">卡特兰数（catalan）</a>，它具有这样一个特性：<br />
<img src="http://www.dutor.net/wp-content/cache/567062184aa5206cdf30877b6ba55a77.png" align="absmiddle" class="tex" alt="\begin{array}{rcl}h[0]&#038;=&#038;1 \\h[1]&#038;=&#038;1 \\h[n+1]&#038;=&#038;\sum_{i=0}^n h[i]\cdot h[n-i]\end{array}" /><br />
　　还有很多经典问题都可以用卡特兰数来表示，比如矩阵乘法、二叉计数、单调路径等，关于这些问题的原型，请Google之。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/04/catalan-count/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>单源最短路径Dijkstra算法</title>
		<link>http://www.dutor.net/index.php/2010/04/shortest-path-dijkstra/</link>
		<comments>http://www.dutor.net/index.php/2010/04/shortest-path-dijkstra/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 11:36:24 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[图论]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2180</guid>
		<description><![CDATA[<h4>Dijkstra算法简述</h4>
　　Dijkstra算法是图论中的一种求单源最短路的算法，即从一个点开始到所有其他点的最短路。其基本原理是：集合T包含所有当前已经找到最短路径的点，初始情况下T中只有源点U = V - T，其中V为图G的点集。从源点开始，每次新扩展一个属于U、距离T中点最短的点，用该点更新U中的与其相邻的点的距离。当所有边权都为正时，由于不会存在一个距离更短的没扩展过的点，所以这个点的距离永远不会再被改变，因而保证了算法的正确性。不过根据这个原理，用Dijkstra求最短路的图不能有负权边，因为扩展到负权边的时候会产生更短的距离，有可能就破坏了已经更新的点距离不会改变的性质。若要处理含有负权值边的情况，就需要使用<a href="http://www.dutor.net/index.php/2010/05/shortest-path-bellman-ford/" target="_blank">Bellman-Ford算法</a>了。
<h4>Dijkstra算法流程</h4>
　　在以下说明中，start为源，Adj[u,v]为点u和v之间的边的长度，结果保存在Closest[]
<ul>
	<li>初始化：源的距离Closest[start]设为0，其他的点距离设为无穷大，同时把所有的点的状态设为没有扩展过。</li>
	<li>以下过程循环n-1次：
在没有扩展过的点中取一距离最小的点u，并将其状态设为已扩展。
对于每个与u相邻的点v，如果Closest[u]+Adj[u,v] < Closest[v]，那么把Closest[v]更新成更短的距离Closest[u]+Adj[u,v]。此时到点v的最短路径上，前一个节点即为u。</li>
	<li>结束。此时对于任意的u，Closest[u]就是start到u的距离。</li>
</ul>]]></description>
			<content:encoded><![CDATA[<h4>Dijkstra算法简述</h4>
<p>　　Dijkstra算法是图论中的一种求单源最短路的算法，即从一个点开始到所有其他点的最短路。其基本原理是：集合T包含所有当前已经找到最短路径的点，初始情况下T中只有源点，U = V &#8211; T，其中V为图G的点集。从源点开始，每次新扩展一个属于U、距离T中点最短的点，用该点更新U中的与其相邻的点的距离。当所有边权都为正时，由于不会存在一个距离更短的没扩展过的点，所以这个点的距离永远不会再被改变，因而保证了算法的正确性。不过根据这个原理，用Dijkstra求最短路的图不能有负权边，因为扩展到负权边的时候会产生更短的距离，有可能就破坏了已经更新的点距离不会改变的性质。若要处理含有负权值边的情况，就需要使用<a href="http://www.dutor.net/index.php/2010/05/shortest-path-bellman-ford/" target="_blank">Bellman-Ford算法</a>了。</p>
<h4>Dijkstra算法流程</h4>
<p>　　在以下说明中，start为源，Adj[u,v]为点u和v之间的边的长度，结果保存在Closest[]</p>
<ul>
<li>初始化：源的距离Closest[start]设为0，其他的点距离设为无穷大，同时把所有的点的状态设为没有扩展过。</li>
<li>以下过程循环n-1次：<br />
在没有扩展过的点中取一距离最小的点u，并将其状态设为已扩展。<br />
对于每个与u相邻的点v，如果Closest[u]+Adj[u,v] < Closest[v]，那么把Closest[v]更新成更短的距离Closest[u]+Adj[u,v]。此时到点v的最短路径上，前一个节点即为u。</li>
<li>结束。此时对于任意的u，Closest[u]就是start到u的距离。</li>
</ul>
<h4>Dijkstra算法C++实现</h4>

<div class="wp_codebox"><table><tr id="p21804"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
</pre></td><td class="code" id="p2180code4"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
<span style="color: #339900;">#include &lt;algorithm&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXINT <span style="color: #000080;">=</span> <span style="color: #208080;">0xFFFF</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 不可达的路径长度上限</span>
<span style="color: #0000ff;">class</span> Node
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    Node<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> w<span style="color: #008000;">&#40;</span>MAXINT<span style="color: #008000;">&#41;</span>, v<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> src, <span style="color: #666666;">//~ 最短路径上的上一个顶点</span>
        w<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 到该节点的路径长度</span>
    <span style="color: #0000ff;">bool</span> v<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 标识该节点是否已经加入最短路径集</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">**</span>argv<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span>vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> <span style="color: #000080;">&gt;</span> Adj<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> n, <span style="color: #666666;">// 顶点数</span>
        m, <span style="color: #666666;">//~ 边数</span>
        from,
        to,
        w,
        min <span style="color: #000080;">=</span> MAXINT,
        start, <span style="color: #666666;">//~ 源点</span>
        k<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 下一个可以加入的顶点号</span>
    <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>n<span style="color: #008080;">;</span>
    vector<span style="color: #000080;">&lt;</span>Node<span style="color: #000080;">&gt;</span> Closest<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        Adj.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>n, MAXINT<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        Adj<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>m<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> m<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>from<span style="color: #000080;">&gt;&gt;</span>to<span style="color: #000080;">&gt;&gt;</span>w<span style="color: #008080;">;</span>
        Adj<span style="color: #008000;">&#91;</span>from<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>to<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> w<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>start<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 从顶点start开始的最短路径</span>
    Closest<span style="color: #008000;">&#91;</span>start<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~</span>
    k <span style="color: #000080;">=</span> start<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        min <span style="color: #000080;">=</span> MAXINT<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int</span> t<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 维护下一个可以加入最短路径集的顶点</span>
        Closest<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">v</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 加入最短路径集</span>
        <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>j<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 更新Closest和k</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>Closest<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000080;">&gt;</span> Closest<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000040;">+</span> Adj<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Closest<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000080;">=</span> Closest<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000040;">+</span> Adj<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                Closest<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">src</span> <span style="color: #000080;">=</span> k<span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>Closest<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span> <span style="color: #000080;">&lt;</span> min <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>Closest<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">v</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                min <span style="color: #000080;">=</span> Closest<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span><span style="color: #008080;">;</span>
                t <span style="color: #000080;">=</span> j<span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>min <span style="color: #000080;">==</span> MAXINT<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 剩下的顶点不可达</span>
        k <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #666666;">//~ 下面代码供测试用</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>Closest<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">w</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span><span style="color: #000080;">&lt;&lt;</span>boolalpha<span style="color: #000080;">&lt;&lt;</span>Closest<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">v</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>to<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">int</span> rp <span style="color: #000080;">=</span> to<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>rp <span style="color: #000040;">!</span><span style="color: #000080;">=</span> start<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 反向输出路径</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>rp<span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot; &lt;- &quot;</span><span style="color: #008080;">;</span>
            rp <span style="color: #000080;">=</span> Closest<span style="color: #008000;">&#91;</span>rp<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">src</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>start<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/04/shortest-path-dijkstra/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>最小生成树之Kruskal算法</title>
		<link>http://www.dutor.net/index.php/2010/04/kruskal/</link>
		<comments>http://www.dutor.net/index.php/2010/04/kruskal/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 02:56:56 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[图论]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2157</guid>
		<description><![CDATA[　　一个无向、加权、连通图的生成树是指这样一棵树，它包含该图所有的n个顶点，和该图边集E中的n-1个边。最小生成树就是该图所有生成树中各边权值之和（构造代价）最小的生成树。求指定图的最小生成树有多种算法，除了这里要介绍的Kruskal算法，还有Prim算法、Sollin算法等。
<h4>Kruskal算法描述</h4>
　　用Kruskal算法为无向加权连通图G构造最小生成树T的步骤如下：首先初始化T为一个包含所有n个顶点、0个边的森林，E为G的边集。每次从E中取出一条具有最小权值的边（并从E中删除该边），如果该边不与T中其他边构成回路，则将该边加入T，否则舍弃该边。重复上述操作至T中含有n-1条边，此时T即Kruskal算法构造出的最小生成树。
<h4>Kruskal算法证明</h4>
　　易证，对于一个无向加权连通图，总是存在一棵或以上的有限课生成树，而这些生成树中肯定存在至少一棵最小生成树。下面证明Kruskal算法构造的生成树是<strong>这些</strong>最小生成树中的一棵。
　　设T为Kruskal算法构造出的生成树，U是G的最小生成树。如果T==U那么证明结束。如果T != U，我们就需要证明T和U的构造代价相同。由于T != U，所以一定存在k > 0条边存在于T中，却不在U中。接下来，我们做k次变换，每次从T中取出一条不在U中的边放入U，然后删除U一条不在T中的边，最后使T和U的边集相同。每次变换中，把T中的一条边e加入U，同时删除U中的一条边f。e、f按如下规则选取：a). e是在T中却不在U中的边中<strong>最小</strong>的一条边；b). e加入U后，肯定构成唯一的一个环路，令f是这个环路中的一条边，但不在T中。f一定存在，因为T中没有环路。]]></description>
			<content:encoded><![CDATA[<p>　　一个无向、加权、连通图的生成树是指这样一棵树，它包含该图所有的n个顶点，和该图边集E中的n-1个边。最小生成树就是该图所有生成树中各边权值之和（构造代价）最小的生成树。求指定图的最小生成树有多种算法，除了这里要介绍的Kruskal算法，还有Prim算法、Sollin算法等。</p>
<h4>Kruskal算法描述</h4>
<p>　　用Kruskal算法为无向加权连通图G构造最小生成树T的步骤如下：首先初始化T为一个包含所有n个顶点、0个边的森林，E为G的边集。每次从E中取出一条具有最小权值的边（并从E中删除该边），如果该边不与T中其他边构成回路，则将该边加入T，否则舍弃该边。重复上述操作至T中含有n-1条边，此时T即Kruskal算法构造出的最小生成树。</p>
<h4>Kruskal算法证明</h4>
<p>　　易证，对于一个无向加权连通图，总是存在一棵或以上的有限课生成树，而这些生成树中肯定存在至少一棵最小生成树。下面证明Kruskal算法构造的生成树是<strong>这些</strong>最小生成树中的一棵。<br />
　　设T为Kruskal算法构造出的生成树，U是G的最小生成树。如果T==U那么证明结束。如果T != U，我们就需要证明T和U的构造代价相同。由于T != U，所以一定存在k > 0条边存在于T中，却不在U中。接下来，我们做k次变换，每次从T中取出一条不在U中的边放入U，然后删除U一条不在T中的边，最后使T和U的边集相同。每次变换中，把T中的一条边e加入U，同时删除U中的一条边f。e、f按如下规则选取：a). e是在T中却不在U中的边中<strong>最小</strong>的一条边；b). e加入U后，肯定构成唯一的一个环路，令f是这个环路中的一条边，但不在T中。f一定存在，因为T中没有环路。</p>
<p>　　这样的一次变换后，U仍然是一棵生成树。<br />
　　我们假设e权值小于f，这样变换后U的代价一定小于变换前U的代价，而这和我们之前假设U是最小生成树矛盾，因此e权值不小于f。<br />
　　再假设e权值大于f。由于f权值小于e，由Kruskal算法知，f在e之前从E中取出，但被舍弃了。一定是由于和权值小于等于f的边构成了环路。但是T中权值小于等于f（小于e）的边一定存在于U中，而f在U中却没有和它们构成环路，又推出矛盾。所以e权值不大于f。于是e权值等于f。<br />
　　这样，每次变换后U的代价都不变，所以K次变换后，U和T的边集相同，且代价相同，这样就证明了T也是最小生成树。由证明过程可以知道，最小生成树可以不是唯一的。</p>
<h4>Kruskal算法的C++实现</h4>
<p>　　利用最小堆来存储边集E，利用并-查集来判断向T中添加边是否构成环路。</p>

<div class="wp_codebox"><table><tr id="p21575"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
</pre></td><td class="code" id="p2157code5"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
<span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> Edge 
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> from, to, w<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 不要被假象迷惑，这里是无向图</span>
	Edge<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> f, <span style="color: #0000ff;">int</span> t, <span style="color: #0000ff;">int</span> _w<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> from<span style="color: #008000;">&#40;</span>f<span style="color: #008000;">&#41;</span>, to<span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span>, w<span style="color: #008000;">&#40;</span>_w<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
	<span style="color: #ff0000; font-style: italic;">/*
	//~ bool operator &lt;(const Edge&amp; e){ return w &lt; e.w; }
	bool operator &gt;(const Edge&amp; e){ return w &gt; e.w; }
	*/</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//~ 为什么我把operator&lt;重载为成员会出错？</span>
<span style="color: #666666;">//~ bool operator &lt;(const Edge&amp; e1, const Edge&amp; e2){ return e1.w &lt; e2.w; }</span>
<span style="color: #0000ff;">bool</span> operator <span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> Edge<span style="color: #000040;">&amp;</span> e1, <span style="color: #0000ff;">const</span> Edge<span style="color: #000040;">&amp;</span> e2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> e1.<span style="color: #007788;">w</span> <span style="color: #000080;">&gt;</span> e2.<span style="color: #007788;">w</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span> 
<span style="color: #0000ff;">bool</span> AddEdge<span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> <span style="color: #000040;">&amp;</span> V, <span style="color: #0000ff;">const</span> Edge<span style="color: #000040;">&amp;</span> e<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	vector<span style="color: #000080;">&lt;</span>Edge<span style="color: #000080;">&gt;</span> E<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> from, to, w<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> n<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 顶点数</span>
	<span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>n<span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> V<span style="color: #008000;">&#40;</span>n<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 顶点并查集</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>from<span style="color: #000080;">&gt;&gt;</span>to<span style="color: #000080;">&gt;&gt;</span>w<span style="color: #008000;">&#41;</span> E.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>Edge<span style="color: #008000;">&#40;</span>from, to, w<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	make_heap<span style="color: #008000;">&#40;</span>E.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, E.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, greater<span style="color: #000080;">&lt;</span>Edge<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> count <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 已添加边数</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>E.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		Edge e <span style="color: #000080;">=</span> E<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>AddEdge<span style="color: #008000;">&#40;</span>V, e<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 将成功添加的边输出</span>
		<span style="color: #008000;">&#123;</span>
			count<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>count <span style="color: #000080;">==</span> n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 树已生成完毕</span>
			<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>e.<span style="color: #007788;">from</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;-&gt;&quot;</span><span style="color: #000080;">&lt;&lt;</span>e.<span style="color: #007788;">to</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;: &quot;</span><span style="color: #000080;">&lt;&lt;</span>e.<span style="color: #007788;">w</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		pop_heap<span style="color: #008000;">&#40;</span>E.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, E.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,greater<span style="color: #000080;">&lt;</span>Edge<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		E.<span style="color: #007788;">pop_back</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>count <span style="color: #000040;">!</span><span style="color: #000080;">=</span> n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;I cannot do what you want.&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> AddEdge<span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> <span style="color: #000040;">&amp;</span> V, <span style="color: #0000ff;">const</span> Edge<span style="color: #000040;">&amp;</span> e<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> e.<span style="color: #007788;">from</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #008080;">;</span> V<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span><span style="color: #008000;">&#41;</span> i <span style="color: #000080;">=</span> V<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 寻找根节点</span>
	<span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> e.<span style="color: #007788;">to</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #008080;">;</span> V<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span><span style="color: #008000;">&#41;</span> j <span style="color: #000080;">=</span> V<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 寻找根节点</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">==</span> j<span style="color: #008000;">&#41;</span>	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ i,j两节点已经联通</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>V<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> V<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 将小集合合并至大集合上</span>
	<span style="color: #008000;">&#123;</span>
		V<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> j<span style="color: #008080;">;</span>
		V<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> V<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		V<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
		V<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> V<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ ^_^</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/04/kruskal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[算法]物不知数 &#8211; 中国剩余定理</title>
		<link>http://www.dutor.net/index.php/2010/04/chinese-remainder-theorem/</link>
		<comments>http://www.dutor.net/index.php/2010/04/chinese-remainder-theorem/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 11:59:12 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[数理空间]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[数论]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2142</guid>
		<description><![CDATA[　　设"此物"为x，则x满足同余方程组：
$$\left\{\begin{array}{c}x\equiv 2 (\mod 3)\\x\equiv 3 (\mod 5) \\x\equiv 2 (\mod 7)\end{array}\right.$$
　　若存在x满足上述方程组，则$$x + k*3*5*7$$也满足该方程其中k任意整数，方程的最小正整数解满足$$x\mod{3*5*7}$$，即对3,5,7的最小公倍数求余。
　　在介绍求x的具体方法之前，先介绍两个简单的定理(证明从略)：
<ol>
	<li>被除数增加(或减少)除数的倍数，除数不变，则余数电不变；</li>
	<li>被除数扩大(或缩小)指定的倍数，除数不变，则余数扩大(或缩小)同样的倍数(余数总小于除数)。</li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>　　《孙子算经》有云：</p>
<pre>
今有物不知其数，三三数之剩二；五五数之剩三；七七数之剩二。问物几何？
答曰：二十三。
</pre>
<p>　　设&#8221;此物&#8221;为x，则x满足同余方程组：<br />
<img src="http://www.dutor.net/wp-content/cache/c7e779c7b74e63ffc742866fa2b99510.png" align="absmiddle" class="tex" alt="\left\{\begin{array}{c}x\equiv 2 (\mod 3)\\x\equiv 3 (\mod 5) \\x\equiv 2 (\mod 7)\end{array}\right." /><br />
　　若存在x满足上述方程组，则<img src="http://www.dutor.net/wp-content/cache/8a2a3c9318a9a6e904932054adbd4f14.png" align="absmiddle" class="tex" alt="x + k*3*5*7" />也满足该方程其中k任意整数，方程的最小正整数解满足<img src="http://www.dutor.net/wp-content/cache/8c2b3033dca78fa829cff17821a71eee.png" align="absmiddle" class="tex" alt="x\mod{3*5*7}" />，即对3,5,7的最小公倍数求余。<br />
　　在介绍求x的具体方法之前，先介绍两个简单的定理(证明从略)：</p>
<ol>
<li>被除数增加(或减少)除数的倍数，除数不变，则余数电不变；</li>
<li>被除数扩大(或缩小)指定的倍数，除数不变，则余数扩大(或缩小)同样的倍数(余数总小于除数)。</li>
</ol>
<p>　　接下来，我们这样构造满足条件的x：x由三项相加得出，其中第一项是5和7的倍数且被3除余2，第二项是3和7的倍数且被5除余3，第三项是3和5的倍数且被7除余2。即<img src="http://www.dutor.net/wp-content/cache/f106f29c5644b870bf443626003ff942.png" align="absmiddle" class="tex" alt="x=5*7*p+3*7*q+3*5*t.(p,q,t\in \mathbf{Z})" />。又由于：<br />
<img src="http://www.dutor.net/wp-content/cache/504f4c92e2d7e0d13bf2882c9bad3507.png" align="absmiddle" class="tex" alt="5*7\equiv 2(\mod 3)." />所以<img src="http://www.dutor.net/wp-content/cache/4e6408c808a43d8105daea6152b89f7c.png" align="absmiddle" class="tex" alt="5*7*2\equiv 1 (\mod 3)" />，于是<img src="http://www.dutor.net/wp-content/cache/3b71ee4f6c05a0c2f055f3dce2703ca5.png" align="absmiddle" class="tex" alt="5*7*2*2\equiv 2 (\mod 3)" />;<br />
<img src="http://www.dutor.net/wp-content/cache/a51bff5eaa38cebf222c08970be66408.png" align="absmiddle" class="tex" alt="3*7\equiv 1(\mod 5)." />所以<img src="http://www.dutor.net/wp-content/cache/1d8c5e9a58b24e3e1fcaf0007cdf9125.png" align="absmiddle" class="tex" alt="3*7*3\equiv 3 (\mod 5)" />;<br />
<img src="http://www.dutor.net/wp-content/cache/d092a38f64ca373a37ed616e8736d469.png" align="absmiddle" class="tex" alt="3*5\equiv 1(\mod 7)." />所以<img src="http://www.dutor.net/wp-content/cache/c815addce2bb6b40506da3145f94d072.png" align="absmiddle" class="tex" alt="3*5*2\equiv 2 (\mod 7)" />.<br />
最后，<img src="http://www.dutor.net/wp-content/cache/4a482446738fe8ddd85cab816fffdb5c.png" align="absmiddle" class="tex" alt="x=5*7*2*2+3*7*3+3*5*2=233\equiv 23 (\mod 105)." /><br />
反复观察上述构造过程，我们就不难从中找出规律，而这个规律就是下面要介绍的中国剩余定理，又称孙子定理。它说的是，设<img src="http://www.dutor.net/wp-content/cache/9a54e2e19c6992b85cb5e13987aad16d.png" align="absmiddle" class="tex" alt="n\ge2, a_1,a_2,\ldots,a_n" />为互质整数。<img src="http://www.dutor.net/wp-content/cache/5970623c0f45bff29f5970246bc583ce.png" align="absmiddle" class="tex" alt="M=a_1\cdot a_2 \cdots a_n" />为最小公倍数。又有关于W的同余方程组如下：<br />
<img src="http://www.dutor.net/wp-content/cache/c3fa14987e9aff138a9abb1d230c970e.png" align="absmiddle" class="tex" alt="\left\{\begin{array}{l}W\equiv r_1 (\mod a_1)\\W\equiv r_2 (\mod a_2)\\\vdots\\W\equiv r_n (\mod a_n)\end{array}\right." /><br />
该方程组有且仅有解<br />
<img src="http://www.dutor.net/wp-content/cache/96f39e157e521ea275c540893fc31ceb.png" align="absmiddle" class="tex" alt="W=M_1\cdot\alpha_1\cdot r_1 + M_2\cdot\alpha_2\cdot r_2+\cdots+M_n\cdot\alpha_n\cdot r_n" /><br />
其中，<img src="http://www.dutor.net/wp-content/cache/d27ab0ee57028c06ead943c00cb5b0da.png" align="absmiddle" class="tex" alt="M_i=a_1\cdot a_2\cdots a_{i-1}\cdot a_{i+1}\cdots a_n" /><br />
<img src="http://www.dutor.net/wp-content/cache/cd0f1069db14b3485b705eb04d3e58a4.png" align="absmiddle" class="tex" alt="\alpha_i" />为调整因子，使得<img src="http://www.dutor.net/wp-content/cache/782c4384dcc5cfe22aa23150d87040cc.png" align="absmiddle" class="tex" alt="M_i\cdot\alpha_i\equiv 1(\mod a_i)" />。</p>
<p>over~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/04/chinese-remainder-theorem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[C++]优先级队列priority_queque</title>
		<link>http://www.dutor.net/index.php/2010/03/priority_queque/</link>
		<comments>http://www.dutor.net/index.php/2010/03/priority_queque/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 11:15:59 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[Cpp]]></category>
		<category><![CDATA[STL]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2096</guid>
		<description><![CDATA[　　好久没写C++没用STL了，今天在STLChina泡了一下午。完整的代码只写了这么一个，贴上来吧。
　　写了两个类，Max_Heap和Min_Heap，以他们特例化priority_queue，可以方便地实现最大、最小堆。写完了忽然又觉得这俩类似乎是多此一举了，完全可以用greater<int>来实现最小堆，但由priority_queue的模板定义看出，那样就必须提供一个容器类型，比如vector<int>。
　　最后还写了测试用例：找出ｎ个数中最大的k个。
<pre lang="cpp" line="1">
/*
template < class T, class Container = vector<T>,
           class Compare = less<typename Container::value_type> > class priority_queue;

explicit priority_queue ( const Compare&#038; x = Compare(),
                          const Container&#038; y = Container() );
template <class InputIterator>
         priority_queue ( InputIterator first, InputIterator last,
                          const Compare&#038; x = Compare(),
                          const Container&#038; y = Container() );
*/
</pre>]]></description>
			<content:encoded><![CDATA[<p>　　好久没写C++没用STL了，今天在STLChina泡了一下午。完整的代码只写了这么一个，贴上来吧。<br />
　　写了两个类，Max_Heap和Min_Heap，以他们特例化priority_queue，可以方便地实现最大、最小堆。写完了忽然又觉得这俩类似乎是多此一举了，完全可以用greater<int>来实现最小堆，但由priority_queue的模板定义看出，那样就必须提供一个容器类型，比如vector<int>。<br />
　　最后还写了测试用例：找出ｎ个数中最大的k个。</p>

<div class="wp_codebox"><table><tr id="p20966"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
</pre></td><td class="code" id="p2096code6"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/*
template &lt; class T, class Container = vector&lt;T&gt;,
           class Compare = less&lt;typename Container::value_type&gt; &gt; class priority_queue;
&nbsp;
explicit priority_queue ( const Compare&amp; x = Compare(),
                          const Container&amp; y = Container() );
template &lt;class InputIterator&gt;
         priority_queue ( InputIterator first, InputIterator last,
                          const Compare&amp; x = Compare(),
                          const Container&amp; y = Container() );
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;queue&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> Max_Heap
<span style="color: #008000;">&#123;</span>
    Max_Heap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> _n<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    operator <span style="color: #0000ff;">int</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> _n<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span> <span style="color: #666666;">//在需要的地方隐式类型转换</span>
    <span style="color: #0000ff;">int</span> _n<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> Min_Heap
<span style="color: #008000;">&#123;</span>
    Min_Heap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> _n<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    operator <span style="color: #0000ff;">int</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> _n<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span> <span style="color: #666666;">//在需要的地方隐式类型转换</span>
    <span style="color: #0000ff;">int</span> _n<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> operator <span style="color: #000080;">&lt;</span> <span style="color: #008000;">&#40;</span>Max_Heap l, Max_Heap r<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 正常的&lt;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> l._n <span style="color: #000080;">&lt;</span> r._n<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> operator <span style="color: #000080;">&lt;</span> <span style="color: #008000;">&#40;</span>Min_Heap l, Min_Heap r<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 反义的&lt;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> l._n <span style="color: #000080;">&gt;</span> r._n<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span>
main <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">**</span>argv<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    priority_queue<span style="color: #000080;">&lt;</span>Min_Heap<span style="color: #000080;">&gt;</span> heap<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 最小堆</span>
    <span style="color: #666666;">//priority_queue&lt;Max_Heap&gt; heap; //~ 最大堆</span>
    <span style="color: #666666;">//~ 测试用例</span>
    <span style="color: #666666;">//~ 前K个最大值</span>
    <span style="color: #0000ff;">int</span> k <span style="color: #000080;">=</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> tmp<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> k<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>tmp<span style="color: #008080;">;</span>
        heap.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>tmp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>tmp<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>tmp <span style="color: #000080;">&gt;</span> heap.<span style="color: #007788;">top</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>._n<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            heap.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>tmp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            heap.<span style="color: #007788;">pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">cin</span>.<span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>heap.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>heap.<span style="color: #007788;">top</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>._n<span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">' '</span><span style="color: #008080;">;</span>
        heap.<span style="color: #007788;">pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/03/priority_queque/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVL平衡树实现</title>
		<link>http://www.dutor.net/index.php/2009/11/avl-tree-implementation/</link>
		<comments>http://www.dutor.net/index.php/2009/11/avl-tree-implementation/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 14:29:00 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[AVL]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1663</guid>
		<description><![CDATA[　　这里只给出一个简单的实现，具体原理参见Google、Baidu的各个角落及各大教材。做两点说明：
仅仅实现了必要的左旋、右旋处理，左平衡、右平衡操作，以及数据的插入操作，
不可重复插入数据。
<pre lang="cpp" line="1">
typedef int Type; //~ 节点数据类型
typedef struct Node
{
	Type data;
	int bf;
	Node *left, *right;
	Node(){ bf = 0; left = right = 0; }
} AVLNode, *AVLTree; //~ 平衡树及其节点

void RRotate(AVLTree &#038; T) //~ 右旋处理,T的左孩子成为新子树根
{
	AVLNode * tmp = T->left;
	T->left = tmp->right;
	tmp->right = T;
	T = tmp;
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>　　这里只给出一个简单的实现，具体原理参见Google、Baidu的各个角落及各大教材。做两点说明：<br />
仅仅实现了必要的左旋、右旋处理，左平衡、右平衡操作，以及数据的插入操作，<br />
不可重复插入数据。</p>

<div class="wp_codebox"><table><tr id="p16637"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
</pre></td><td class="code" id="p1663code7"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">int</span> Type<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 节点数据类型</span>
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">struct</span> Node
<span style="color: #008000;">&#123;</span>
	Type data<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> bf<span style="color: #008080;">;</span>
	Node <span style="color: #000040;">*</span>left, <span style="color: #000040;">*</span>right<span style="color: #008080;">;</span>
	Node<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> left <span style="color: #000080;">=</span> right <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span> AVLNode, <span style="color: #000040;">*</span>AVLTree<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 平衡树及其节点</span>
&nbsp;
<span style="color: #0000ff;">void</span> RRotate<span style="color: #008000;">&#40;</span>AVLTree <span style="color: #000040;">&amp;</span> T<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 右旋处理,T的左孩子成为新子树根</span>
<span style="color: #008000;">&#123;</span>
	AVLNode <span style="color: #000040;">*</span> tmp <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left<span style="color: #008080;">;</span>
	T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left <span style="color: #000080;">=</span> tmp<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right<span style="color: #008080;">;</span>
	tmp<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right <span style="color: #000080;">=</span> T<span style="color: #008080;">;</span>
	T <span style="color: #000080;">=</span> tmp<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> LLotate<span style="color: #008000;">&#40;</span>AVLTree <span style="color: #000040;">&amp;</span> T<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 左旋处理,T的右孩子成为新子树根</span>
<span style="color: #008000;">&#123;</span>
	AVLNode <span style="color: #000040;">*</span> tmp <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right<span style="color: #008080;">;</span>
	T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right <span style="color: #000080;">=</span> tmp<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left<span style="color: #008080;">;</span>
	tmp<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left <span style="color: #000080;">=</span> T<span style="color: #008080;">;</span>
	T <span style="color: #000080;">=</span> tmp<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> LBalance<span style="color: #008000;">&#40;</span>AVLTree <span style="color: #000040;">&amp;</span> T<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 左平衡处理</span>
<span style="color: #008000;">&#123;</span>
	AVLNode <span style="color: #000040;">*</span> l <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ LL,单右旋转</span>
			RRotate<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 更新平衡因子</span>
			<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
		<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ LR双旋转</span>
			AVLNode <span style="color: #000040;">*</span> lr <span style="color: #000080;">=</span> l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>lr<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 更新平衡因子</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>
					l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
					T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>
					T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
					l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span><span style="color: #666666;">// switch</span>
			lr<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			LLotate<span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			RRotate<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span><span style="color: #666666;">// switch</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> RBalance<span style="color: #008000;">&#40;</span>AVLTree <span style="color: #000040;">&amp;</span> T<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 右平衡处理</span>
<span style="color: #008000;">&#123;</span>
	AVLNode <span style="color: #000040;">*</span> r <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>r<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ RR,单左旋转</span>
			LLotate<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> r<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
		<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ RL双旋转</span>
			AVLNode <span style="color: #000040;">*</span> rl <span style="color: #000080;">=</span> r<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>rl<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span><span style="color: #666666;">//~ 更新平衡因子</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>
					r<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
					T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>
					T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
					r<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span><span style="color: #666666;">// switch</span>
			rl<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			RRotate<span style="color: #008000;">&#40;</span>r<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			LLotate<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span><span style="color: #666666;">// switch</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">bool</span> Insert<span style="color: #008000;">&#40;</span>AVLTree <span style="color: #000040;">&amp;</span> T, Type <span style="color: #000040;">&amp;</span> data<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 通过插入操作构建AVL树</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">bool</span> taller <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 标识此次插入操作是否使该树长高</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>T<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 该子树为空树，长高</span>
	<span style="color: #008000;">&#123;</span>
		T <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> AVLNode<span style="color: #008080;">;</span>
		T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data <span style="color: #000080;">=</span> data<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> taller<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// if</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>data <span style="color: #000080;">==</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 该数据已存在，不重复插入</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>data <span style="color: #000080;">&lt;</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 需要将该数据插入左子树</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>Insert<span style="color: #008000;">&#40;</span>T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left, data<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 左子树未长高</span>
		<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 左子树长高，判断是否需要调整</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 失衡，许进行左平衡调整</span>
				LBalance<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 未失衡，只需调整当前节点的平衡因子</span>
				T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 未失衡，只需调整当前节点的平衡因子</span>
				T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// switch</span>
	<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// if</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>Insert<span style="color: #008000;">&#40;</span>T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left, data<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 未失衡，只需调整当前节点的平衡因子</span>
				T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 未失衡，只需调整当前节点的平衡因子</span>
				T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 失衡，许进行右平衡调整</span>
				RBalance<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// switch</span>
	<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// if</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/11/avl-tree-implementation/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Shell 排序</title>
		<link>http://www.dutor.net/index.php/2009/11/shell-sort/</link>
		<comments>http://www.dutor.net/index.php/2009/11/shell-sort/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 23:10:31 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[排序]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1658</guid>
		<description><![CDATA[　　这个排序算法为什么被命名为Shell排序，我一直幻想着它可能最早被用以Shell脚本吧，Just Now我才知道，发明人叫做Donald Shell，居然有人叫自己壳？
　　以前从来没有写过这个排序，事实证明，没写过基本等于没听说过、没学过。
　　21行的小程序花了我将近一个小时来调试，对一个大小为9的逆序用gdb跟踪了程序整个的执行过程，发现两处错误，迭代变量j的类型习惯性地写成了size_t，导致死循环，以后凡是这种i,j,k，一律int。还有就是把最外层的while(step > 0)写成了while(size > 0)，纯属自作自受。]]></description>
			<content:encoded><![CDATA[
<div class="wp_codebox"><table><tr id="p16588"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code" id="p1658code8"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span>
shell_sort<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span> a, <span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> step <span style="color: #000080;">=</span> n <span style="color: #000040;">/</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>step <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> step<span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">int</span> tmp <span style="color: #000080;">=</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> i <span style="color: #000040;">-</span> step<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>j <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span> <span style="color: #000040;">&amp;&amp;</span> tmp <span style="color: #000080;">&lt;</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> j<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> j <span style="color: #000040;">+</span> step<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> j<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                j <span style="color: #000040;">-</span><span style="color: #000080;">=</span> step<span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> j <span style="color: #000040;">+</span> step<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> tmp<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>step <span style="color: #000080;">==</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span>
            step <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">else</span>
            step <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>step <span style="color: #000040;">/</span> <span style="color:#800080;">2.2</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>　　这个排序算法为什么被命名为Shell排序，我一直幻想着它可能最早被用以Shell脚本吧，Just Now我才知道，发明人叫做Donald Shell，居然有人叫自己壳？<br />
　　以前从来没有写过这个排序，事实证明，没写过基本等于没听说过、没学过。<br />
　　21行的小程序花了我将近一个小时来调试，对一个大小为9的逆序用gdb跟踪了程序整个的执行过程，发现两处错误，迭代变量j的类型习惯性地写成了size_t，导致死循环，以后凡是这种i,j,k，一律int。还有就是把最外层的while(step > 0)写成了while(size > 0)，纯属自作自受。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/11/shell-sort/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>全排列</title>
		<link>http://www.dutor.net/index.php/2009/11/permutation-again/</link>
		<comments>http://www.dutor.net/index.php/2009/11/permutation-again/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 23:28:51 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[边走编程]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1616</guid>
		<description><![CDATA[　　不知道写什么，把昨天写的一个全排列贴出来吧。8-)]]></description>
			<content:encoded><![CDATA[<p>　　不知道写什么，把昨天写的一个全排列贴出来吧。8-)</p>

<div class="wp_codebox"><table><tr id="p16169"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p1616code9"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> Perm<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> s<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> st <span style="color: #000080;">=</span> s<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>s<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>st<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>t <span style="color: #000080;">=</span> s<span style="color: #008080;">;</span> <span style="color: #000040;">*</span>t<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>t<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			swap<span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>s, <span style="color: #000040;">*</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			Perm<span style="color: #008000;">&#40;</span>s <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			swap<span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>s, <span style="color: #000040;">*</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>　　再来一个考虑串内有重复字符的，</p>

<div class="wp_codebox"><table><tr id="p161610"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p1616code10"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;set&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> Perm<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> s<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> st <span style="color: #000080;">=</span> s<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>s<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>st<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		set<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">char</span><span style="color: #000080;">&gt;</span> Set<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>t <span style="color: #000080;">=</span> s<span style="color: #008080;">;</span> <span style="color: #000040;">*</span>t<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>t<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">size_t</span> size <span style="color: #000080;">=</span> Set.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			Set.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>size <span style="color: #000040;">!</span><span style="color: #000080;">=</span> Set.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				swap<span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>s, <span style="color: #000040;">*</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				Perm<span style="color: #008000;">&#40;</span>s <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				swap<span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>s, <span style="color: #000040;">*</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/11/permutation-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>虚存管理页面调度算法</title>
		<link>http://www.dutor.net/index.php/2009/11/vm-page-schedule/</link>
		<comments>http://www.dutor.net/index.php/2009/11/vm-page-schedule/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 02:23:28 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[OS基础]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[虚拟内存]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1586</guid>
		<description><![CDATA[<ul>
	<li><strong>最优置换算法(OPT)</strong>
　　最优置换(OPTimal replacement)，顾其名，知其义，这是一种最优的算法，因为对于任一页面请求序列，其产生的缺页中断次数时最少的，但，这只是理论上的最优。其实质是：当调入新的一页而必须预先置换某个老页时，所选择的老页应是将来不再被使用，或者是在最远的将来才被访问。其最优性是容易证明的。
　　但是最优页面置换算法的实现是困难的，因为它需要我们预先就知道一个进程整个运行过程中页面走向的全部情况，而这几乎时不可能的。所以，这个算法主要还是用来衡量其他算法的优劣的。
</li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>　　在虚拟内存管理的实现中，最关键的就是页面的调入策略和页面的置换算法。<br />
　　页面的调入策略主要有两种：预先调入策略和页面请求调入策略。由于前者需要对进程的运行过程进行一定量的预测，所以实现起来比较困难和低效，所以经常采用的是后一种策略，即当执行进程所需的某个页面不在内存时，产生缺页中断，再由专门的缺页中断服务程序(ISR)根据进程页表将所需页面调入内存。</p>
<p>　　当缺页中断服务程序发现，内存中已经没有空闲的物理页面(通常称之为帧)时，就会执行一种页面换出程序，它采取一定的置换算法将某个页面换出到外存的交换(文件)分区。通常，衡量一种页面置换算法性能好坏的指标就是对于大量的页面请求序列，在一定数量的物理帧上，产生缺页中断的平均次数。页面置换算法较多，其变种更多，常常见诸于各大OS教材的主要由下面的几种。</p>
<ul>
<li><strong>先入先出法(FIFO)</strong><br />
　　Fist In Fist Out, 这是一种实现起来最为简单的算法，其实质是，最简单的页面置换算法是先入先出(FIFO)法。这种算法的实质是，总是选择在主存中停留时间<strong>最长(即最老)</strong>的一页置换，即先进入内存的页，先退出内存。理由是：<strong>最早调入内存的页，其不再被使用的可能性比刚调入内存的可能性大。</strong>建立一个FIFO队列，收容所有在内存中的页。被置换页面总是在队列头上进行。当一个页面被放入内存时，就把它插在队尾上。<br />
　　这种算法只是在按线性顺序访问地址空间时才是理想的，否则效率不高。因为那些常被访问的页，往往在主存中也停留得最久，结果它们因变“老”而不得不被置换出去。另外，FIFO算法还有一个比较有意思的缺陷，称之为Berlady异常(或者?)，说当物理内存也即帧数增加时，其缺页中断的次数反而<strong>有可能</strong>增加！
</li>
<li><strong>最优置换算法(OPT)</strong><br />
　　最优置换(OPTimal replacement)，顾其名，知其义，这是一种最优的算法，因为对于任一页面请求序列，其产生的缺页中断次数时最少的，但，这只是理论上的最优。其实质是：当调入新的一页而必须预先置换某个老页时，所选择的老页应是将来不再被使用，或者是在最远的将来才被访问。其最优性是容易证明的。<br />
　　但是最优页面置换算法的实现是困难的，因为它需要我们预先就知道一个进程整个运行过程中页面走向的全部情况，而这几乎时不可能的。所以，这个算法主要还是用来衡量其他算法的优劣的。
</li>
<li><strong>最近最久未使用算法(LRU)</strong><br />
　　最近最久未使用算法(Least-Recently Used)，它的核心思想是，当需要置换一页时，选择在最近一段时间里最久没有使用过的页面予以置换。既然要以时间为替换依据，那么肯定就要用到定时/计数器，因此这个算法通常需要一定的硬件支持，这样的话其通用性也会降低。</p>
<p>　　还有一种LRU的近似算法，最近未使用算法(Not Recently Used，NUR)，相比LRU实现起来更简单一些。它在页表的每一表项中增加一个引用位，操作系统<strong>定期</strong>地将它们置为0。当某一页被访问时，由硬件将该位置1。需要页面替换时，就可把该位是0的页淘汰出去。
</li>
<p>　　
<li><strong>二次机会算法(SC)</strong><br />
　　这是一种FIFO和LRU的折中，或者说结合，它避免了FIFO的缺陷，即可能把经常使用的页面替换出去(比如说装入程序?)。它的思想是：需要页面替换时，检查它的访问位。如果是0，就淘汰这页；如果访问位是1，就将其清0，同时给它第二次机会，然后检验下一个FIFO页面。因此，如果一个页面经常使用，它的访问位总保持为1，它被淘汰出去的几率是很小的。</li>
</ul>
<p>　　<br />
　　还有其他很多页面置换算法，实际使用的算法通常就是这些算法的一些折中或者说变种，可见，要想把一个理论上的好算法应用到具体的问题上，会受到很多限制，还需要做不少其他的工作。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/11/vm-page-schedule/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>处理机调度</title>
		<link>http://www.dutor.net/index.php/2009/11/processor-schedule/</link>
		<comments>http://www.dutor.net/index.php/2009/11/processor-schedule/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 09:03:24 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[OS基础]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1572</guid>
		<description><![CDATA[<strong>常见处理机调度算法：</strong>

<ul>
	<li>先来先服务(FCFS)</li>
	<li>短作业优先调度(SJF)</li>
	<li>优先级调度
           <ol>
	   <li>静态优先级</li>
                 <li>动态优先级</li>
               </ol>
            </li>
	<li>高响应比优先调度</li>
	<li>时间片轮转</li>
	<li>多级队列调度算法</li>
	<li>多级反馈队列调度算法</li>
</ul>]]></description>
			<content:encoded><![CDATA[<p><strong>处理机调度方式主要两种：</strong>
<ul>
<li>非抢占式。</li>
<li>抢占式</li>
</ul>
<p><strong>常见处理机调度算法：</strong></p>
<ul>
<li>先来先服务(FCFS)</li>
<li>短作业优先调度(SJF)</li>
<li>优先级调度
<ol>
<li>静态优先级</li>
<li>动态优先级</li>
</ol>
</li>
<li>高响应比优先调度</li>
<li>时间片轮转</li>
<li>多级队列调度算法</li>
<li>多级反馈队列调度算法</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/11/processor-schedule/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>二分查找</title>
		<link>http://www.dutor.net/index.php/2009/08/binary-search/</link>
		<comments>http://www.dutor.net/index.php/2009/08/binary-search/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 11:10:02 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[边走编程]]></category>
		<category><![CDATA[排序]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1174</guid>
		<description><![CDATA[没啥好说的，只是要注意防止m = (r + l) / 2;时m会发生上溢。
<pre lang="cpp" line="1">
template <class T>
int BSearch(T *a, size_t n, T v)
{
    assert(a != NULL &#038;& n > 0); //! a == NULL &#124;&#124; n <= 0 就坏了:-(
    size_t l = 0,
           r = n -1,
           m = l + (r - l) / 2; //! 勿用m=(l+r)/2;
    while(l <= r)
    {
        if(a[m] == v)
            return (int)m;
        else if(a[m] < v)
            l = m + 1;
        else
            r = m - 1;
    }
    return -1;
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>没啥好说的，只是要注意防止m = (r + l) / 2;时m会发生上溢。</p>

<div class="wp_codebox"><table><tr id="p117411"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p1174code11"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">int</span> BSearch<span style="color: #008000;">&#40;</span>T <span style="color: #000040;">*</span>a, <span style="color: #0000ff;">size_t</span> n, T v<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">assert</span><span style="color: #008000;">&#40;</span>a <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span> <span style="color: #000040;">&amp;&amp;</span> n <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//! a == NULL || n &lt;= 0 就坏了:-(</span>
    <span style="color: #0000ff;">size_t</span> l <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>,
           r <span style="color: #000080;">=</span> n <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>,
           m <span style="color: #000080;">=</span> l <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>r <span style="color: #000040;">-</span> l<span style="color: #008000;">&#41;</span> <span style="color: #000040;">/</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> <span style="color: #666666;">//! 勿用m=(l+r)/2;</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>l <span style="color: #000080;">&lt;=</span> r<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#91;</span>m<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> v<span style="color: #008000;">&#41;</span> 
            <span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>m<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#91;</span>m<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> v<span style="color: #008000;">&#41;</span>
            l <span style="color: #000080;">=</span> m <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">else</span>
            r <span style="color: #000080;">=</span> m <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/binary-search/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>原地归并算法一例</title>
		<link>http://www.dutor.net/index.php/2009/08/merge-sort-2/</link>
		<comments>http://www.dutor.net/index.php/2009/08/merge-sort-2/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 13:36:38 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[归并]]></category>
		<category><![CDATA[排序]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1161</guid>
		<description><![CDATA[归并排序算法(mergesort)是将一个序列划分为同样大小的两个子序列，然后对两个子序列分别进行排序，最后进行合并操作，将两个子序列合成有序的序列。在合成的过程中，一般的实现都需要开辟一块与原序列大小相同的空间，以进行合并操作。这里介绍一种不需要开辟新的空间就可以进行归并操作的原地归并算法。代码来说事儿：
<pre lang="cpp" line="1">
//~ 原地归并
while(l < r &#038;& r < size) //~ 核心算法
{
	while(v[l] <= v[r] &#038;& l < r) ++l; //~ 找到左面第一个比v[r]大的v[l]
	size_t to_mv = 0; //~ 计数器
	while(v[r] < v[l] &#038;& r < size) ++r, ++to_mv; //~ 右侧找到to_mv个比v[l]小的数
	Exchange(v+l, r-l-to_mv, r-l);//~ 将此to_mv个数移到v[l]前面
	l += to_mv; //~ 改变l，继续下一轮循环
}//~ l >-r 或者 r >= size时归并结束
</pre>]]></description>
			<content:encoded><![CDATA[<p>归并排序算法(mergesort)是将一个序列划分为同样大小的两个子序列，然后对两个子序列分别进行排序，最后进行合并操作，将两个子序列合成有序的序列。在合成的过程中，一般的实现都需要开辟一块与原序列大小相同的空间，以进行合并操作。这里介绍一种不需要开辟新的空间就可以进行归并操作的原地归并算法。代码来说事儿：</p>

<div class="wp_codebox"><table><tr id="p116112"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
</pre></td><td class="code" id="p1161code12"><pre class="cpp" style="font-family:monospace;">&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> Swap<span style="color: #008000;">&#40;</span>T<span style="color: #000040;">&amp;</span> l, T<span style="color: #000040;">&amp;</span> r<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 交换</span>
<span style="color: #008000;">&#123;</span>
	T t <span style="color: #000080;">=</span> l<span style="color: #008080;">;</span> l <span style="color: #000080;">=</span> r<span style="color: #008080;">;</span> r <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> Reverse<span style="color: #008000;">&#40;</span>T<span style="color: #000040;">*</span> v, <span style="color: #0000ff;">size_t</span> size<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 反序</span>
<span style="color: #008000;">&#123;</span>
	size<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">size_t</span> l <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>l <span style="color: #000080;">&lt;</span> size<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		Swap<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#91;</span>l<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span>, v<span style="color: #008000;">&#91;</span>size<span style="color: #000040;">--</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> Exchange<span style="color: #008000;">&#40;</span>T<span style="color: #000040;">*</span> v, <span style="color: #0000ff;">size_t</span> l, <span style="color: #0000ff;">size_t</span> s<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 分块交换：前l个与s-l交换</span>
<span style="color: #008000;">&#123;</span>	<span style="color: #666666;">//~ 据说叫手摇算法？</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>l <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #000040;">||</span> s <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
	Reverse<span style="color: #008000;">&#40;</span>v, l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	Reverse<span style="color: #008000;">&#40;</span>v<span style="color: #000040;">+</span>l, s <span style="color: #000040;">-</span> l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	Reverse<span style="color: #008000;">&#40;</span>v, s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> merge<span style="color: #008000;">&#40;</span>T<span style="color: #000040;">*</span> v, <span style="color: #0000ff;">size_t</span> size<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>size <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 递归终结点1</span>
		<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>size <span style="color: #000080;">==</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 递归终结点2</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> v<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			Swap<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span>, v<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #666666;">//~ 分别排序</span>
		merge<span style="color: #008000;">&#40;</span>v, size<span style="color: #000040;">/</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		merge<span style="color: #008000;">&#40;</span>v<span style="color: #000040;">+</span>size<span style="color: #000040;">/</span><span style="color: #0000dd;">2</span>, size<span style="color: #000040;">-</span>size<span style="color: #000040;">/</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">size_t</span> l <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>, r <span style="color: #000080;">=</span> size<span style="color: #000040;">/</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
		<span style="color: #666666;">//~ 原地归并</span>
		<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>l <span style="color: #000080;">&lt;</span> r <span style="color: #000040;">&amp;&amp;</span> r <span style="color: #000080;">&lt;</span> size<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 核心算法</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;=</span> v<span style="color: #008000;">&#91;</span>r<span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> l <span style="color: #000080;">&lt;</span> r<span style="color: #008000;">&#41;</span> <span style="color: #000040;">++</span>l<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 找到左面第一个比v[r]大的v[l]</span>
			<span style="color: #0000ff;">size_t</span> to_mv <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 计数器</span>
			<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#91;</span>r<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> v<span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> r <span style="color: #000080;">&lt;</span> size<span style="color: #008000;">&#41;</span> <span style="color: #000040;">++</span>r, <span style="color: #000040;">++</span>to_mv<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 右侧找到to_mv个比v[l]小的数</span>
			Exchange<span style="color: #008000;">&#40;</span>v<span style="color: #000040;">+</span>l, r<span style="color: #000040;">-</span>l<span style="color: #000040;">-</span>to_mv, r<span style="color: #000040;">-</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//~ 将此to_mv个数移到v[l]前面</span>
			l <span style="color: #000040;">+</span><span style="color: #000080;">=</span> to_mv<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 改变l，继续下一轮循环</span>
		<span style="color: #008000;">&#125;</span><span style="color: #666666;">//~ l &gt;-r 或者 r &gt;= size时归并结束</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/merge-sort-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>反转链表小算法</title>
		<link>http://www.dutor.net/index.php/2009/08/reverse-list/</link>
		<comments>http://www.dutor.net/index.php/2009/08/reverse-list/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 04:39:51 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1114</guid>
		<description><![CDATA[<pre lang="cpp" line="1">
void reverse(Node * T)
{
	assert(T); //~ 表头非空
	Node* p = T->next, *t;
	if(p)
	{	//~ 将第一个结点，即未来的表尾next域置空
		t = p->next;
		p->next = NULL;
		p = t;
	}
	while(p)
	{	//~ 将余下结点依次插入表头
		t = p->next;
		p->next = T->next;
		T->next = p;
		p = t;
	}
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>基本思想是，从链表的第二个结点(如果存在的话)开始，依次插入到链表的头结点后面，即作为第一个结点，直至表尾，此时链表反转工作已经完成。</p>

<div class="wp_codebox"><table><tr id="p111413"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
</pre></td><td class="code" id="p1114code13"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cassert&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> Node
<span style="color: #008000;">&#123;</span>
	Node<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>data<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> data<span style="color: #008080;">;</span>
	Node<span style="color: #000040;">*</span> next<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span> 
<span style="color: #0000ff;">void</span> reverse<span style="color: #008000;">&#40;</span>Node <span style="color: #000040;">*</span> T<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">assert</span><span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 表头非空</span>
	Node<span style="color: #000040;">*</span> p <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next, <span style="color: #000040;">*</span>t<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>	<span style="color: #666666;">//~ 将第一个结点，即未来的表尾next域置空</span>
		t <span style="color: #000080;">=</span> p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
		p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
		p <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>	<span style="color: #666666;">//~ 将余下结点依次插入表头</span>
		t <span style="color: #000080;">=</span> p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
		p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
		T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
		p <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">//~ 测试代码</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	Node <span style="color: #000040;">*</span>head <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Node, <span style="color: #000040;">*</span>t <span style="color: #000080;">=</span> head<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		t<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Node<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		t <span style="color: #000080;">=</span> t<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	t<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
&nbsp;
	Node <span style="color: #000040;">*</span> p <span style="color: #000080;">=</span> head<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
	reverse<span style="color: #008000;">&#40;</span>head<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
		p <span style="color: #000080;">=</span> p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/reverse-list/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>再来个队列模板类~</title>
		<link>http://www.dutor.net/index.php/2009/08/queue-template/</link>
		<comments>http://www.dutor.net/index.php/2009/08/queue-template/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 14:40:17 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1100</guid>
		<description><![CDATA[<pre lang="cpp" line="1">
template <class T>
class Queue
{
public:
	Queue(int size = 30);
	~Queue();
	void EnQueue(T value);
	T DeQueue();
	T GetFirst();
	bool IsEmpty();
	bool IsFull();
	void ClearQueue();
private:
	T *queue;
	int front;
	int rare;
	int MaxSize;
	int CurLen;
};
</pre>]]></description>
			<content:encoded><![CDATA[<p>Queue.h:</p>

<div class="wp_codebox"><table><tr id="p110014"><td class="code" id="p1100code14"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> 
<span style="color: #0000ff;">class</span> Queue
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Queue<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> size <span style="color: #000080;">=</span> <span style="color: #0000dd;">30</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	~Queue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">void</span> EnQueue<span style="color: #008000;">&#40;</span>T value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	T DeQueue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	T GetFirst<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> IsEmpty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> IsFull<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">void</span> ClearQueue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
	T <span style="color: #000040;">*</span>queue<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> front<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> rare<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> MaxSize<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> CurLen<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">template</span> 
Queue<span style="color: #008080;">::</span><span style="color: #007788;">Queue</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> size <span style="color: #000080;">=</span> <span style="color: #0000dd;">30</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	queue <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> T<span style="color: #008000;">&#91;</span>size<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	front <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	rare <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	CurLen <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	MaxSize <span style="color: #000080;">=</span>size<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> 
Queue<span style="color: #008080;">::</span>~Queue<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">delete</span> queue<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span>
<span style="color: #0000ff;">void</span> Queue<span style="color: #008080;">::</span><span style="color: #007788;">EnQueue</span><span style="color: #008000;">&#40;</span>T value<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	queue<span style="color: #008000;">&#91;</span>rare<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> value<span style="color: #008080;">;</span>
	rare <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>rare <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">%</span>MaxSize<span style="color: #008080;">;</span>
	CurLen<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span>
T Queue<span style="color: #008080;">::</span><span style="color: #007788;">DeQueue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	T value<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>IsEmpty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span><span style="color: #FF0000;">&quot;Empty When Dequeue&quot;</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span>
T Queue<span style="color: #008080;">::</span><span style="color: #007788;">GetFirst</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	T value<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>IsEmpty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span><span style="color: #FF0000;">&quot;Empty When GetFirst!&quot;</span><span style="color: #000040;">&amp;</span>lt<span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> Queue<span style="color: #008080;">::</span><span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>front<span style="color: #000080;">==</span>rare<span style="color: #000040;">&amp;</span>amp<span style="color: #008080;">;</span><span style="color: #000040;">&amp;</span>amp<span style="color: #008080;">;</span>CurLen<span style="color: #000080;">==</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span><span style="color: #0000ff;">true</span><span style="color: #008080;">:</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span>
<span style="color: #0000ff;">bool</span> Queue<span style="color: #008080;">::</span><span style="color: #007788;">IsFull</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>front<span style="color: #000080;">==</span>rare<span style="color: #000040;">&amp;</span>amp<span style="color: #008080;">;</span><span style="color: #000040;">&amp;</span>amp<span style="color: #008080;">;</span>CurLen<span style="color: #000080;">==</span>MaxSize<span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span><span style="color: #0000ff;">true</span><span style="color: #008080;">:</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span>
<span style="color: #0000ff;">void</span> Queue<span style="color: #008080;">::</span><span style="color: #007788;">ClearQueue</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	front <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	rare <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	CurLen <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/queue-template/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个堆栈类模板，一个表达式计算器</title>
		<link>http://www.dutor.net/index.php/2009/08/stack-and-calculater/</link>
		<comments>http://www.dutor.net/index.php/2009/08/stack-and-calculater/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 07:59:58 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1090</guid>
		<description><![CDATA[一个堆栈类模板，和用到此模板的一个表达式计算器。
输入四则运算表达式（可含括号），输出计算结果，暂未提供盛放运算和浮点数功能。
<pre lang="cpp" line="1">class Stack   
{   
public:   
	Stack(int stack_size = 30);   
	~Stack();   
	void Push(T value);   
	T Pop();   
	T Top();   
	bool IsEmpty();   
	bool IsFull();   
	void ClearStack();   
private:   
	int top;   
	T* stack;   
	int size;   
};</pre> 
]]></description>
			<content:encoded><![CDATA[<p>一个堆栈类模板，和用到此模板的一个表达式计算器。<br />
输入四则运算表达式（可含括号），输出计算结果，暂未提供盛放运算和浮点数功能。</p>
<p>Stack.h:</p>

<div class="wp_codebox"><table><tr id="p109015"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
</pre></td><td class="code" id="p1090code15"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
&nbsp;
<span style="color: #0000ff;">class</span> Stack   
<span style="color: #008000;">&#123;</span>   
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>   
	Stack<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> stack_size <span style="color: #000080;">=</span> <span style="color: #0000dd;">30</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	~Stack<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	<span style="color: #0000ff;">void</span> Push<span style="color: #008000;">&#40;</span>T value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	T Pop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	T Top<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	<span style="color: #0000ff;">bool</span> IsEmpty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	<span style="color: #0000ff;">bool</span> IsFull<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
	<span style="color: #0000ff;">void</span> ClearStack<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>   
	<span style="color: #0000ff;">int</span> top<span style="color: #008080;">;</span>   
	T<span style="color: #000040;">*</span> stack<span style="color: #008080;">;</span>   
	<span style="color: #0000ff;">int</span> size<span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>   
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Stack</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> stack_size<span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	size <span style="color: #000080;">=</span> stack_size<span style="color: #008080;">;</span>   
	Stack<span style="color: #008080;">::</span><span style="color: #007788;">stack</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> T<span style="color: #008000;">&#91;</span>size<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>   
	Stack<span style="color: #008080;">::</span><span style="color: #007788;">top</span> <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span>~Stack<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	<span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>stack<span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
<span style="color: #0000ff;">void</span> Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>T value<span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	stack<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>top<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> value<span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
T Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	<span style="color: #0000ff;">return</span> stack<span style="color: #008000;">&#91;</span>top<span style="color: #000040;">--</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
T Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Top</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	<span style="color: #0000ff;">return</span> Stack<span style="color: #008000;">&#91;</span>top<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
<span style="color: #0000ff;">bool</span> Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	<span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>top<span style="color: #000080;">==</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">?</span><span style="color: #0000ff;">true</span><span style="color: #008080;">:</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
<span style="color: #0000ff;">bool</span> Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">IsFull</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	<span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>top<span style="color: #000080;">==</span><span style="color: #008000;">&#40;</span>size<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span><span style="color: #0000ff;">true</span><span style="color: #008080;">:</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span>   
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>   
<span style="color: #0000ff;">void</span> Stack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">ClearStack</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   
<span style="color: #008000;">&#123;</span>   
	top <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>   
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p> <br />
Calculater.h:</p>

<div class="wp_codebox"><table><tr id="p109016"><td class="code" id="p1090code16"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;sstream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
<span style="color: #339900;">#include &quot;Stack.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Calculate
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Calculate<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	~Calculate<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> Cal<span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
	string ParseString<span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> MidToBehind<span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> Compute<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> b,<span style="color: #0000ff;">char</span> operater<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	Stack<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> stack_int<span style="color: #008080;">;</span>
	Stack<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">char</span><span style="color: #000080;">&gt;</span> stack_char<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Calculater.cpp:</p>

<div class="wp_codebox"><table><tr id="p109017"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
</pre></td><td class="code" id="p1090code17"><pre class="cpp" style="font-family:monospace;">Calculate<span style="color: #008080;">::</span><span style="color: #007788;">Calculate</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
&nbsp;
<span style="color: #008000;">&#125;</span>
&nbsp;
Calculate<span style="color: #008080;">::</span>~Calculate<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
&nbsp;
<span style="color: #008000;">&#125;</span>
&nbsp;
vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> Calculate<span style="color: #008080;">::</span><span style="color: #007788;">MidToBehind</span><span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	stringstream strstrm<span style="color: #008000;">&#40;</span>express<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">char</span> temp_char<span style="color: #008080;">;</span>
	string temp_str<span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> result_vec<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>strstrm<span style="color: #000080;">&gt;&gt;</span>temp_char<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'('</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">')'</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'+'</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'-'</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'*'</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'/'</span><span style="color: #000040;">&amp;&amp;</span>temp_char<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'='</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			strstrm.<span style="color: #007788;">putback</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			strstrm<span style="color: #000080;">&gt;&gt;</span>temp_str<span style="color: #008080;">;</span>
			result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>temp_str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'('</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">')'</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;stack is empty when push ')'&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
				stack_char.<span style="color: #007788;">ClearStack</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			<span style="color: #0000ff;">else</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>temp_char <span style="color: #000080;">=</span> stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,temp_char <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">'('</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,temp_char<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;stack is empty when pop,not found the '('&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
						stack_char.<span style="color: #007788;">ClearStack</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
				<span style="color: #008000;">&#125;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'+'</span><span style="color: #000040;">||</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'-'</span><span style="color: #000040;">||</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'*'</span><span style="color: #000040;">||</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'/'</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">char</span> temp_char_2<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'+'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					temp_char_2 <span style="color: #000080;">=</span> stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'('</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
					<span style="color: #0000ff;">else</span>
						result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'-'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					temp_char_2 <span style="color: #000080;">=</span> stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'('</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
					<span style="color: #0000ff;">else</span>
						result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'*'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					temp_char_2 <span style="color: #000080;">=</span> stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'('</span><span style="color: #000040;">||</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'+'</span><span style="color: #000040;">||</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'-'</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
					<span style="color: #0000ff;">else</span>
						result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'/'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					temp_char_2 <span style="color: #000080;">=</span> stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'('</span><span style="color: #000040;">||</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'+'</span><span style="color: #000040;">||</span>temp_char_2 <span style="color: #000080;">==</span> <span style="color: #FF0000;">'-'</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
					<span style="color: #0000ff;">else</span>
						result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,temp_char_2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				stack_char.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>temp_char<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">default</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>temp_char <span style="color: #000080;">==</span> <span style="color: #FF0000;">'='</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>stack_char.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				result_vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,stack_char.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
			<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;wrong express&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> result_vec<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Calculate<span style="color: #008080;">::</span><span style="color: #007788;">Compute</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> b,<span style="color: #0000ff;">char</span> operater<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>operater<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'+'</span><span style="color: #008080;">:</span>
		<span style="color: #0000ff;">return</span> a <span style="color: #000040;">+</span> b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'-'</span><span style="color: #008080;">:</span>
		<span style="color: #0000ff;">return</span> a <span style="color: #000040;">-</span> b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'*'</span><span style="color: #008080;">:</span>
		<span style="color: #0000ff;">return</span> a <span style="color: #000040;">*</span> b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'/'</span><span style="color: #008080;">:</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>b <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;divided by 0!wrong!&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
			<span style="color: #0000ff;">return</span> a <span style="color: #000040;">/</span> b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">default</span><span style="color: #008080;">:</span>
		<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;Not return&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Calculate<span style="color: #008080;">::</span><span style="color: #007788;">Cal</span><span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string new_exp <span style="color: #000080;">=</span> ParseString<span style="color: #008000;">&#40;</span>express<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	string str_temp<span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> vec_exp <span style="color: #000080;">=</span> MidToBehind<span style="color: #008000;">&#40;</span>new_exp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> it <span style="color: #000080;">=</span> vec_exp.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> vec_exp.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>it<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		str_temp <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>it<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>str_temp<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;+&quot;</span><span style="color: #000040;">&amp;&amp;</span>str_temp<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;-&quot;</span><span style="color: #000040;">&amp;&amp;</span>str_temp<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;*&quot;</span><span style="color: #000040;">&amp;&amp;</span>str_temp<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;/&quot;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">int</span> int_temp <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">int</span> <span style="color: #0000dd;">time</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>string<span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> itr <span style="color: #000080;">=</span> str_temp.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>itr <span style="color: #000040;">!</span><span style="color: #000080;">=</span> str_temp.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>itr<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				int_temp <span style="color: #000080;">=</span> int_temp<span style="color: #000040;">*</span><span style="color: #0000dd;">10</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>itr <span style="color: #000040;">-</span> <span style="color: #FF0000;">'0'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			stack_int.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>int_temp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span> 
		<span style="color: #0000ff;">else</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">int</span> a,b<span style="color: #008080;">;</span>
			b <span style="color: #000080;">=</span> stack_int.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			a <span style="color: #000080;">=</span> stack_int.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">char</span> ch <span style="color: #000080;">=</span> str_temp<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">int</span> c <span style="color: #000080;">=</span> Compute<span style="color: #008000;">&#40;</span>a,b,ch<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			stack_int.<span style="color: #007788;">Push</span><span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> stack_int.<span style="color: #007788;">Pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
string Calculate<span style="color: #008080;">::</span><span style="color: #007788;">ParseString</span><span style="color: #008000;">&#40;</span>string express<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string new_exp<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>string<span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> it <span style="color: #000080;">=</span> express.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> express.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>it<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>it<span style="color: #000080;">&gt;=</span><span style="color: #FF0000;">'0'</span><span style="color: #000040;">&amp;&amp;</span><span style="color: #000040;">*</span>it<span style="color: #000080;">&lt;=</span><span style="color: #FF0000;">'9'</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>flag<span style="color: #008000;">&#41;</span>
				new_exp.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">' '</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			new_exp.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>it<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
		<span style="color: #008000;">&#123;</span>
			flag <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> express.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				new_exp.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">' '</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			new_exp.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>it<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> new_exp<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/stack-and-calculater/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>A question from csdn-关于字符串、单词</title>
		<link>http://www.dutor.net/index.php/2009/08/a-question-from-csdn/</link>
		<comments>http://www.dutor.net/index.php/2009/08/a-question-from-csdn/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 05:45:24 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1087</guid>
		<description><![CDATA[<h6>一种遍历算法</h6>
<pre lang="cpp" line="1">
int main()
{
    string word;
    cin>>word;
    int len = word.length()-1;
    long psb = 1;
    for (int i = 0;i < len;i++)
    {
        psb *= 2;
    }
    int *flags = new int[len];
    for (int i = 0;i < psb;i++)
    {
        int temp = i;
        for (int j = 0;j < len;j++)
        {
            flags[j] = temp%2;
            temp = temp/2;
        }
        if(i>0)
        {
            for (int j = 0;j < len;j++)
            {
                cout<<word[j];
                if(flags[j] == 1)cout<<"-";
            }
            cout<<word[word.length()-1]<<endl;
        }
    }
}
</pre>]]></description>
			<content:encoded><![CDATA[<h6>问题描述</h6>
<p>一个单词，可以在其相临的两个字母中插入一个“-”（横杠字符）而形成一个字符串，比如单词cake，可以在相连字母间（不同的位置）拖入“-”，而得到如下字符串：</p>
<blockquote><p>
c-a-k-e<br />
ca-k-e<br />
cak-e<br />
c-ak-e<br />
c-ake<br />
ca-ke<br />
c-a-ke
</p></blockquote>
<p>如果给定任一个单词（作为输入），按上面的规则，在其相临的两个字母中插入一个“-”，要计算出所有可能的形成的字符串（输出），程序要怎么写？</p>
<p>又例如输入单词 cat，输出结果为：</p>
<blockquote><p>
c-a-t<br />
ca-t<br />
c-at
</p></blockquote>
<h6>一种遍历算法</h6>

<div class="wp_codebox"><table><tr id="p108718"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code" id="p1087code18"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    string word<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>word<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> len <span style="color: #000080;">=</span> word.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">long</span> psb <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> len<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        psb <span style="color: #000040;">*</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>flags <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#91;</span>len<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> psb<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">int</span> temp <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>j <span style="color: #000080;">&lt;</span> len<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            flags<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> temp<span style="color: #000040;">%</span><span style="color:#800080;">2</span><span style="color: #008080;">;</span>
            temp <span style="color: #000080;">=</span> temp<span style="color: #000040;">/</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>i<span style="color: #000080;">&gt;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>j <span style="color: #000080;">&lt;</span> len<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>word<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>flags<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;-&quot;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>word<span style="color: #008000;">&#91;</span>word.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/a-question-from-csdn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>由遍历序列恢复二叉树</title>
		<link>http://www.dutor.net/index.php/2009/08/generate-btree/</link>
		<comments>http://www.dutor.net/index.php/2009/08/generate-btree/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 00:44:34 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1061</guid>
		<description><![CDATA[<pre lang="cpp" line="1">
/*
 * pre存放先序序列，
 * in存放中序序列，
 * n为结点个数，
 * 返回二叉树根指针
 */
BTree CreateBT(Type * pre, Type * in, int n)
{
	if(n <= 0)
		return NULL;
	BTree bt = new BTNode;
	Type * p;
	int k;
	bt->data = *pre;
	for(p = in; p < in + n; ++p)
		if(*pre == *p)
			break;
	k = p - in;
	bt->lchild = CreateBT(pre+1, in, k);
	bt->rchild = CreateBT(pre+k+1, p+1, n-k-1);
        return bt;	
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>各种计算机考试中，几乎都有这样的问题，给定二叉树先序、中序、后序、层次遍历的其中两种遍历序列，要求我们来恢复这棵二叉树。以先序、中序序列为例，由先序遍历的特点可知，先序序列的第一个元素R一定是二叉树的根结点，在中序序列中找到该结点，则此结点的左侧m个结点就是二叉树的左子树，右侧n个结点便是二叉树的右子树。先序序列中根结点后的m个结点为左子树，剩下n个结点为右子树。分别针对左右子树递归地寻找其根结点及其左右子树，便可恢复原二叉树。对于从中序、后序等其他遍历序列恢复二叉树的方法，大致雷同。写了段代码，实现从先序、中序遍历序列恢复二叉树：</p>

<div class="wp_codebox"><table><tr id="p106119"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p1061code19"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/*
 * pre存放先序序列，
 * in存放中序序列，
 * n为结点个数，
 * 返回二叉树根指针
 */</span>
BTree CreateBT<span style="color: #008000;">&#40;</span>Type <span style="color: #000040;">*</span> pre, Type <span style="color: #000040;">*</span> in, <span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>n <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	BTree bt <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> BTNode<span style="color: #008080;">;</span>
	Type <span style="color: #000040;">*</span> p<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> k<span style="color: #008080;">;</span>
	bt<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>pre<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>p <span style="color: #000080;">=</span> in<span style="color: #008080;">;</span> p <span style="color: #000080;">&lt;</span> in <span style="color: #000040;">+</span> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>p<span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>pre <span style="color: #000080;">==</span> <span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
	k <span style="color: #000080;">=</span> p <span style="color: #000040;">-</span> in<span style="color: #008080;">;</span>
	bt<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>lchild <span style="color: #000080;">=</span> CreateBT<span style="color: #008000;">&#40;</span>pre<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, in, k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	bt<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>rchild <span style="color: #000080;">=</span> CreateBT<span style="color: #008000;">&#40;</span>pre<span style="color: #000040;">+</span>k<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, p<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, n<span style="color: #000040;">-</span>k<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> bt<span style="color: #008080;">;</span>	
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/generate-btree/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVL左转转右转转</title>
		<link>http://www.dutor.net/index.php/2009/08/avl_rotate/</link>
		<comments>http://www.dutor.net/index.php/2009/08/avl_rotate/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 11:23:42 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[AVL]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1048</guid>
		<description><![CDATA[严老太，在您面前小孙孙我实在心智底下啊！一个AVL就把我整的团团转，单向右旋，单向左旋，双向旋转先左后右，双向旋转先右后左，很简单的道理，您就是不肯轻易说出来，在那转啊转的，貌似很神秘的样子！

在构造AVL树的时候，会出现插入某个节点后输不再平衡的情况，这时候只需要找到离插入点最近的、平衡因子不合法的节点，调整以此节点为根的子树(*)，使其平衡因子合法，其实就是使这棵子树(*)的高度与插入节点前相比不发生变化。具体的调整策略因具体情况而异，但原则都是一样的：首先应该明确根节点大于左孩子而小于右孩子，另外，调整后的子树(*)的根是一定会发生变化的，且变化后的子树应该满足平衡条件，即平衡因子为1，0，-1之一。
<img alt="rotate sample" src="http://www.dutor.net/files/images/avl_rotate.gif" title="avl_rotate" width="602" height="281" />]]></description>
			<content:encoded><![CDATA[<p>严老太，在您面前小孙孙我实在心智底下啊！一个AVL就把我整的团团转，单向右旋，单向左旋，双向旋转先左后右，双向旋转先右后左，很简单的道理，您就是不肯轻易说出来，在那转啊转的，貌似很神秘的样子！</p>
<p>在构造AVL树的时候，会出现插入某个节点后输不再平衡的情况，这时候只需要找到离插入点最近的、平衡因子不合法的节点，调整以此节点为根的子树(*)，使其平衡因子合法，其实就是使这棵子树(*)的高度与插入节点前相比不发生变化。具体的调整策略因具体情况而异，但原则都是一样的：首先应该明确根节点大于左孩子而小于右孩子，另外，调整后的子树(*)的根是一定会发生变化的，且变化后的子树应该满足平衡条件，即平衡因子为1，0，-1之一。</p>
<p>这里有一个图示，<br />
<div class="wp-caption aligncenter" style="width: 612px"><img alt="rotate sample" src="http://www.dutor.net/files/images/avl_rotate.gif" title="avl_rotate" width="602" height="281" /><p class="wp-caption-text">rotate sample</p></div></p>
<p>还有两个，</p>
<div class="wp-caption aligncenter" style="width: 581px"><img alt="/型" src="http://www.dutor.net/files/images/avl_rotate2.jpg" title="AVL" width="571" height="284" /><p class="wp-caption-text">&quot;/&quot;型</p></div>
<div class="wp-caption aligncenter" style="width: 634px"><img alt="型" src="http://www.dutor.net/files/images/avl_rotate3.jpg" title="avl" width="624" height="353" /><p class="wp-caption-text">&quot;&lt;&quot;型</p></div>
<p>这里还有两段示例代码，</p>

<div class="wp_codebox"><table><tr id="p104820"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p1048code20"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> R_Rotate <span style="color: #008000;">&#40;</span>BSTree <span style="color: #000040;">&amp;</span>p<span style="color: #008000;">&#41;</span> 
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//~ 对以*p为根的二叉排序树作右旋转处理，处理之后p指向新的树根结点，即旋转</span>
    <span style="color: #666666;">//~ 处理之前的左子树的根结点</span>
    lc<span style="color: #000080;">=</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>lchild <span style="color: #008080;">;</span>            <span style="color: #666666;">//~ lc指向的*p的左子树根结点</span>
    p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>lchild<span style="color: #000080;">=</span>lc<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>rchild <span style="color: #008080;">;</span>    <span style="color: #666666;">//~ lc的右子树挂接为*p的左子树</span>
    lc<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>rchild<span style="color: #000080;">=</span>p <span style="color: #008080;">;</span> p<span style="color: #000080;">=</span>lc <span style="color: #008080;">;</span>    <span style="color: #666666;">//~ p指向新的根结点</span>
<span style="color: #008000;">&#125;</span><span style="color: #666666;">//~ R_Rotate</span>
&nbsp;
<span style="color: #0000ff;">void</span> L_Rotate <span style="color: #008000;">&#40;</span>BSTree <span style="color: #000040;">&amp;</span>p<span style="color: #008000;">&#41;</span>    
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//~ 对以*p为根的二叉排序树作左旋处理，处理之后p指向新的树根结点，即旋转</span>
    <span style="color: #666666;">//~ 处理之前的右子树的根结点</span>
    rc<span style="color: #000080;">=</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>rchild <span style="color: #008080;">;</span>            <span style="color: #666666;">//~ rc指向的*p的右子树根结点</span>
    p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>rchild<span style="color: #000080;">=</span>rc<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>lchild <span style="color: #008080;">;</span>  <span style="color: #666666;">//~ rc左子树挂接为*p的右子树</span>
    rc<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>lchild<span style="color: #000080;">=</span>p <span style="color: #008080;">;</span> p<span style="color: #000080;">=</span>rc <span style="color: #008080;">;</span>   <span style="color: #666666;">//~ p指向新的根结点</span>
<span style="color: #008000;">&#125;</span><span style="color: #666666;">//~ L_Rotate</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/avl_rotate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVL的定义</title>
		<link>http://www.dutor.net/index.php/2009/08/definition-avl/</link>
		<comments>http://www.dutor.net/index.php/2009/08/definition-avl/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 08:07:51 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[边走编程]]></category>
		<category><![CDATA[AVL]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1041</guid>
		<description><![CDATA[AVL是一种二叉搜索树(Binary Search Tree)，被称为平衡树(Balanced Binary Tree)，由Adelsonr Velskii 和Landis 提出并以他们的名字命名。

今天看严蔚敏老太太的数据结构，她老人家是这么描述AVL的：AVL，它或者是一棵空树，或者是具有以下性质的二叉树：它的左子树和右子树都是平衡二叉树，且左子树和右子树的深度之差(平衡因子：BF)的绝对值不超过1。看着这么个定义很别扭，总觉得对平衡因子的要求比较弱，也可能是我悟性较弱吧，在这句话上我很是下了一番功夫……如果这样来定义的话，可能会让我更容易理解一些：
<ol>
	<li>根的左子树和右子树的高度差的最大值为1，空树的高度为0。</li>
	<li>根的左子树和右子树都是AVL树。</li>
</ol>
]]></description>
			<content:encoded><![CDATA[<p>AVL是一种二叉搜索树(Binary Search Tree)，被称为平衡树(Balanced Binary Tree)，由Adelsonr Velskii 和Landis 提出并以他们的名字命名。</p>
<p>今天看严蔚敏老太太的数据结构，她老人家是这么描述AVL的：AVL，它或者是一棵空树，或者是具有以下性质的二叉树：它的左子树和右子树都是平衡二叉树，且左子树和右子树的深度之差(平衡因子：BF)的绝对值不超过1。看着这么个定义很别扭，总觉得对平衡因子的要求比较弱，也可能是我悟性较弱吧，在这句话上我很是下了一番功夫……如果这样来定义的话，可能会让我更容易理解一些：</p>
<ol>
<li>根的左子树和右子树的高度差的最大值为1，空树的高度为0。</li>
<li>根的左子树和右子树都是AVL树。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/definition-avl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>kmp</title>
		<link>http://www.dutor.net/index.php/2009/08/kmp/</link>
		<comments>http://www.dutor.net/index.php/2009/08/kmp/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 07:48:05 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1029</guid>
		<description><![CDATA[<pre lang="cpp" line="1">
class Match
{
public:
	Match(): repos(NULL){}
	Match(const string&#038; main, const string&#038; mod) 
		:repos(new int[mod.size()]), m_main(main), m_mod(mod)
	{}

	~Match()
	{
		delete [] repos;
	}

	//~ kmp搜索，默认从主串0位置处开始，
	//~ 匹配成功返回匹配开始的索引，否则返回-1
	int strkmp(size_t pos = 0);

	//~ 重设主串与模式串
	void reset(const string&#038; main, const string&#038; mod);

private:
	int * repos;
	string m_main; //~ 主串
	string m_mod; //~ 模式串

	//~ 生成重定位的索引值
	void gen_rps();

};
</pre>]]></description>
			<content:encoded><![CDATA[
<div class="wp_codebox"><table><tr id="p102921"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="code" id="p1029code21"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Match
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Match<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> repos<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
	Match<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> string<span style="color: #000040;">&amp;</span> main, <span style="color: #0000ff;">const</span> string<span style="color: #000040;">&amp;</span> mod<span style="color: #008000;">&#41;</span> 
		<span style="color: #008080;">:</span>repos<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">new</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#91;</span>mod.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>, m_main<span style="color: #008000;">&#40;</span>main<span style="color: #008000;">&#41;</span>, m_mod<span style="color: #008000;">&#40;</span>mod<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
	~Match<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> repos<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #666666;">//~ kmp搜索，默认从主串0位置处开始，</span>
	<span style="color: #666666;">//~ 匹配成功返回匹配开始的索引，否则返回-1</span>
	<span style="color: #0000ff;">int</span> strkmp<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> pos <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #666666;">//~ 重设主串与模式串</span>
	<span style="color: #0000ff;">void</span> reset<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> string<span style="color: #000040;">&amp;</span> main, <span style="color: #0000ff;">const</span> string<span style="color: #000040;">&amp;</span> mod<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
	<span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span> repos<span style="color: #008080;">;</span>
	string m_main<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 主串</span>
	string m_mod<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 模式串</span>
&nbsp;
	<span style="color: #666666;">//~ 生成重定位的索引值</span>
	<span style="color: #0000ff;">void</span> gen_rps<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> Match<span style="color: #008080;">::</span><span style="color: #007788;">gen_rps</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	repos<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>, j <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>m_mod.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> j <span style="color: #000080;">==</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">||</span> m_mod<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> m_mod<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #000040;">++</span>i<span style="color: #008080;">;</span><span style="color: #000040;">++</span>j<span style="color: #008080;">;</span>
			repos<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> j<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
			j <span style="color: #000080;">=</span> repos<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Match<span style="color: #008080;">::</span><span style="color: #007788;">strkmp</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> pos<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	gen_rps<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>pos, j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>m_main.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> j <span style="color: #000080;">&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>m_mod.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>j <span style="color: #000080;">==</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">||</span> m_main<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> m_mod<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #000040;">++</span>i<span style="color: #008080;">;</span><span style="color: #000040;">++</span>j<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
			j <span style="color: #000080;">=</span> repos<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>j <span style="color: #000080;">==</span> m_mod.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span>  i <span style="color: #000040;">-</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>m_mod.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span> 
		<span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> Match<span style="color: #008080;">::</span><span style="color: #007788;">reset</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> string<span style="color: #000040;">&amp;</span> main, <span style="color: #0000ff;">const</span> string<span style="color: #000040;">&amp;</span> mod<span style="color: #008000;">&#41;</span> 
<span style="color: #008000;">&#123;</span>
	<span style="color: #666666;">// ~Match();  为什么不让我显式调用析构函数</span>
	<span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> repos<span style="color: #008080;">;</span>
	m_main <span style="color: #000080;">=</span> main<span style="color: #008080;">;</span> 
	m_mod <span style="color: #000080;">=</span> mod<span style="color: #008080;">;</span>
	repos <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#91;</span>mod.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	Match match<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;acabaabaabcacaabc&quot;</span>, <span style="color: #FF0000;">&quot;abaabcac&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>match.<span style="color: #007788;">strkmp</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/kmp/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>大数乘法小程序</title>
		<link>http://www.dutor.net/index.php/2009/08/big-int-multiply/</link>
		<comments>http://www.dutor.net/index.php/2009/08/big-int-multiply/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 12:08:36 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[Cpp]]></category>
		<category><![CDATA[数值计算]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1025</guid>
		<description><![CDATA[其实，我最初写的不是这样子滴，对比上面的程序，看看下面这个哪里会出问题？
<pre lang="cpp" line="1">
string multiply(const string &#038;l, const string &#038;r)
{
	size_t lenl = l.size();
	size_t lenr = r.size();
	string result(lenl+lenr, '\0');
	for(size_t i = 0; i < lenl; ++i)
		for(size_t j = 0; j < lenr; ++j)
		{
			result[i + j + 1] += ctoi(l[i]) * ctoi(r[j]);
		}
	for(size_t i = lenl + lenr-1 ; i > 0; --i)
	{
		result[i - 1] += (unsigned char)result[i] / 10;
		result[i] = (unsigned char)result[i] % 10 + '0';
	}
	if(result[0] == 0)
		result.erase(0, 1);
	else
		result[0] += '0';
	
	return result;
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>写了一个大整数的乘法，使用最笨的算法，数不是十分大时能将就着用：</p>

<div class="wp_codebox"><table><tr id="p102522"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
</pre></td><td class="code" id="p1025code22"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include&lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;fstream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">//~ type char To int</span>
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">int</span> ctoi<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> ch<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> ch <span style="color: #000040;">-</span> <span style="color: #FF0000;">'0'</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">//~ 接受两个string因子，返回string乘积</span>
string multiply<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span>l, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span>r<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #ff0000; font-style: italic;">/*
	 * 两长度分别为lenl,lenr的数相乘，结果长度最大为lenl+lenr，
	 * 最小为lenl+lenr-1
	 */</span>
	<span style="color: #0000ff;">size_t</span> lenl <span style="color: #000080;">=</span> l.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">size_t</span> lenr <span style="color: #000080;">=</span> r.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #000040;">*</span>tmp <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> <span style="color: #0000ff;">unsigned</span><span style="color: #008000;">&#91;</span>lenl <span style="color: #000040;">+</span> lenr<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>tmp, <span style="color: #0000dd;">0</span>, <span style="color: #008000;">&#40;</span>lenl<span style="color: #000040;">+</span>lenr<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #666666;">//~ 交叉相乘</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> lenl<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> lenr<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>j<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			tmp<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> j <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> ctoi<span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> ctoi<span style="color: #008000;">&#40;</span>r<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #666666;">//~ 处理进位</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> i <span style="color: #000080;">=</span> lenl <span style="color: #000040;">+</span> lenr<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		tmp<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> tmp<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">/</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
		tmp<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> tmp<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">10</span> <span style="color: #000040;">+</span> <span style="color: #FF0000;">'0'</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #666666;">//~ 将结果转化成string，并返回</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>tmp<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> string<span style="color: #008000;">&#40;</span>tmp<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, tmp <span style="color: #000040;">+</span> lenl <span style="color: #000040;">+</span> lenr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 长度为lenl+lenr-1</span>
	<span style="color: #0000ff;">else</span>
		tmp<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">'0'</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 长度为lenl+lenr</span>
&nbsp;
	<span style="color: #0000ff;">return</span> string<span style="color: #008000;">&#40;</span>tmp, tmp <span style="color: #000040;">+</span> lenl <span style="color: #000040;">+</span> lenr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string l, r<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>l<span style="color: #000080;">&gt;&gt;</span>r<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>multiply<span style="color: #008000;">&#40;</span>l, r<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>其实，我最初写的不是这样子滴，对比上面的程序，看看下面这个哪里会出问题？</p>

<div class="wp_codebox"><table><tr id="p102523"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p1025code23"><pre class="cpp" style="font-family:monospace;">string multiply<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span>l, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span>r<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">size_t</span> lenl <span style="color: #000080;">=</span> l.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">size_t</span> lenr <span style="color: #000080;">=</span> r.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	string result<span style="color: #008000;">&#40;</span>lenl<span style="color: #000040;">+</span>lenr, <span style="color: #FF0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> lenl<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> lenr<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>j<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			result<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> j <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> ctoi<span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> ctoi<span style="color: #008000;">&#40;</span>r<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> i <span style="color: #000080;">=</span> lenl <span style="color: #000040;">+</span> lenr<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		result<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: #008000;">&#41;</span>result<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">/</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
		result<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: #008000;">&#41;</span>result<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">10</span> <span style="color: #000040;">+</span> <span style="color: #FF0000;">'0'</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>result<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		result.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span>
		result<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">'0'</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> result<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/big-int-multiply/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>整数拼数</title>
		<link>http://www.dutor.net/index.php/2009/07/integrade/</link>
		<comments>http://www.dutor.net/index.php/2009/07/integrade/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 02:22:37 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[排序]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=914</guid>
		<description><![CDATA[<h6>题目描述：</h6>
给你n个整数，用这n个拼成一个超长的整数，要令这个新的整数最小
<h6>输入：</h6>
多组测试数据，每组第一行为n(1<=n<=1000)，接下来是n个正整数，使用空格或者换行分开;
每个数字的长度不会超过1000，不存在前导0;
当n为0时结束程序.
<h6>输出：</h6>
对于每组输入，输出拼成的新的整数的结果]]></description>
			<content:encoded><![CDATA[<h6>题目描述：</h6>
<p>给你n个整数，用这n个拼成一个超长的整数，要令这个新的整数最小</p>
<h6>输入：</h6>
<p>多组测试数据，每组第一行为n(1<=n<=1000)，接下来是n个正整数，使用空格或者换行分开;<br />
每个数字的长度不会超过1000，不存在前导0;<br />
当n为0时结束程序.</p>
<h6>输出：</h6>
<p>对于每组输入，输出拼成的新的整数的结果</p>
<h6>代码一：</h6>

<div class="wp_codebox"><table><tr id="p91424"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="code" id="p914code24"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//~ set实现</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;set&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> my_strcmp
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">bool</span> operator <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> lft, <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> rt<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
&nbsp;
            sum1 <span style="color: #000080;">=</span> lft <span style="color: #000040;">+</span> rt<span style="color: #008080;">;</span>
            sum2 <span style="color: #000080;">=</span> rt <span style="color: #000040;">+</span> lft<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">return</span> sum1 <span style="color: #000080;">&lt;</span> sum2<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        T sum1, sum2<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    multiset<span style="color: #000080;">&lt;</span>string, my_strcmp<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> <span style="color: #000080;">&gt;</span> strSet<span style="color: #008080;">;</span>
    string tmp<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">size_t</span> n<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>n <span style="color: #000040;">&amp;&amp;</span> n<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        strSet.<span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>n<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>tmp<span style="color: #008080;">;</span>
            strSet.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>tmp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>multiset<span style="color: #000080;">&lt;</span>string, my_strcmp<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> <span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> itr <span style="color: #000080;">=</span> strSet.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
                itr <span style="color: #000040;">!</span><span style="color: #000080;">=</span> strSet.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>itr<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #000040;">*</span>itr<span style="color: #000080;">&lt;&lt;</span>flush<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h6>代码二：</h6>

<div class="wp_codebox"><table><tr id="p91425"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
</pre></td><td class="code" id="p914code25"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//~ sort实现</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> my_strcmp
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">bool</span> operator <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> lft, <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> rt<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            sum1 <span style="color: #000080;">=</span> lft <span style="color: #000040;">+</span> rt<span style="color: #008080;">;</span>
            sum2 <span style="color: #000080;">=</span> rt <span style="color: #000040;">+</span> lft<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">return</span> sum1 <span style="color: #000080;">&lt;</span> sum2<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        T sum1, sum2<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span>
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> strVec<span style="color: #008080;">;</span>
    strVec.<span style="color: #007788;">reserve</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1000</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    string tmp<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">size_t</span> n<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>n <span style="color: #000040;">&amp;&amp;</span> n<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        strVec.<span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>n<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>tmp<span style="color: #008080;">;</span>
            strVec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>tmp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        sort<span style="color: #008000;">&#40;</span>strVec.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, strVec.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, my_strcmp<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> itr <span style="color: #000080;">=</span> strVec.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
                itr <span style="color: #000040;">!</span><span style="color: #000080;">=</span> strVec.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>itr<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #000040;">*</span>itr<span style="color: #000080;">&lt;&lt;</span>flush<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/07/integrade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Navigation</title>
		<link>http://www.dutor.net/index.php/2009/07/web-navigation/</link>
		<comments>http://www.dutor.net/index.php/2009/07/web-navigation/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 10:42:15 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[acm]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=906</guid>
		<description><![CDATA[POJ 1028：<a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1028">http://acm.pku.edu.cn/JudgeOnline/problem?id=1028</a>
模拟浏览器前进、后退、访问到某个页面的过程。又是一道水题，我什么时候才能做到水王之王的位置？
]]></description>
			<content:encoded><![CDATA[<p>POJ 1028：<a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1028">http://acm.pku.edu.cn/JudgeOnline/problem?id=1028</a><br />
模拟浏览器前进、后退、访问到某个页面的过程。又是一道水题，我什么时候才能做到水王之王的位置？</p>

<div class="wp_codebox"><table><tr id="p90626"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="code" id="p906code26"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include&lt;iostream&gt;</span>
<span style="color: #339900;">#include&lt;string&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string cmd<span style="color: #008080;">;</span>
	string stack<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">101</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">&quot;http://www.acm.org/&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> B <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>, F <span style="color: #000080;">=</span> B<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>cmd<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>cmd<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'Q'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'V'</span><span style="color: #008080;">:</span>
				<span style="color: #0000dd;">cin</span><span style="color: #000080;">&gt;&gt;</span>stack<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>B<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
				<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>stack<span style="color: #008000;">&#91;</span>B<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
				F <span style="color: #000080;">=</span> B<span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'B'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">--</span>B <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;Ignored&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
					B <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				<span style="color: #0000ff;">else</span>
					<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>stack<span style="color: #008000;">&#91;</span>B<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'F'</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>B <span style="color: #000080;">&gt;</span> F<span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;Ignored&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
					<span style="color: #000040;">--</span>B<span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				<span style="color: #0000ff;">else</span>
					<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>stack<span style="color: #008000;">&#91;</span>B<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">default</span><span style="color: #008080;">:</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/07/web-navigation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

