<?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/category/program/algorithms-program/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/2011/04/recursive-iterative-quick-sort/</link>
		<comments>http://www.dutor.net/index.php/2011/04/recursive-iterative-quick-sort/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 08:43:54 +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=2575</guid>
		<description><![CDATA[　　递归是一种使用相同的方法，通过解决问题的子集以达到解决整个问题的方法，是一种使用有限代码解决“无限”计算的方法。在C/C++语言中递归表现在函数对自身的直接/间接的调用上，在实现上，递归依赖于语言的运行时调用堆栈，使用堆栈来保存每一次递归调用返回时所需要的条件。递归通常具有简洁的编码和清晰的思路，但这种简洁是有代价的。一方面，是函数调用的负担；另一方面，是堆栈占用的负担（堆栈的大小是有限的）。
　　避免这种负担的方法就是将递归转化为迭代。迭代的思想主要在于，在同一栈帧中不断使用现有数据计算出新的数据，然后使用新的数据来替换原有数据。递归于迭代可以相互转化。将递归转化为迭代需要做两方面的工作：显式地维护一个堆栈，在递归算法中堆栈的维护由编译器隐式地完成；使用迭代控制结构，完成出栈、入栈和相关的计算。]]></description>
			<content:encoded><![CDATA[<p>　　递归是一种使用相同的方法，通过解决问题的子集以达到解决整个问题的方法，是一种使用有限代码解决“无限”计算的方法。在C/C++语言中递归表现在函数对自身的直接/间接的调用上，在实现上，递归依赖于语言的运行时调用堆栈，使用堆栈来保存每一次递归调用返回时所需要的条件。递归通常具有简洁的编码和清晰的思路，但这种简洁是有代价的。一方面，是函数调用的负担；另一方面，是堆栈占用的负担（堆栈的大小是有限的）。<br />
　　避免这种负担的方法就是将递归转化为迭代。迭代的思想主要在于，在同一栈帧中不断使用现有数据计算出新的数据，然后使用新的数据来替换原有数据。递归于迭代可以相互转化。将递归转化为迭代需要做两方面的工作：显式地维护一个堆栈，在递归算法中堆栈的维护由编译器隐式地完成；使用迭代控制结构，完成出栈、入栈和相关的计算。<br />
　　以快速排序为例，递归版本的快排通常是这个样子的，</p>

<div class="wp_codebox"><table><tr id="p25751"><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
</pre></td><td class="code" id="p2575code1"><pre class="c" style="font-family:monospace;"><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>
qsort_recur<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>
        qsort_recur<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        qsort_recur<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>
        qsort_recur<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>
        qsort_recur<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></pre></td></tr></table></div>

<p>　　为了将递归排序转化为迭代排序，首先要做的就是考察需要将哪些变量保存到堆栈，这些变量何时入栈何时出栈，需要做什么计算，迭代的终止条件是什么。<br />
　　根据快速排序的核心思想（分而治之），所需要的做的“计算”就是将“区间”按照某个支点（比如区间第一个元素）分为两个子区间，然后再分别对两个子区间进行相同的操作。可见，我们需要在栈中维护的信息就是“区间”，因为在对一个区间进行“计算”时，其他区间信息需要保存。这样才能在处理完当前区间的工作之后继续处理其他区间。迭代的终止条件是什么？所有的区间都处理完了。<br />
　　下面是迭代版本的快速排序，</p>

<div class="wp_codebox"><table><tr id="p25752"><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
</pre></td><td class="code" id="p2575code2"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span>
qsort_iter<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: #666666;">//~ qsort of 'iterative version</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;">1</span><span style="color: #008000;">&#41;</span>
        <span style="color: #0000ff;">return</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> ranges<span style="color: #008080;">;</span> <span style="color: #666666;">//~ stack of ranges to be sorted</span>
    <span style="color: #0000ff;">int</span> l <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> r <span style="color: #000080;">=</span> n<span style="color: #008080;">;</span>
    ranges.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ initial range</span>
    ranges.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>r<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>ranges.<span style="color: #007788;">empty</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;">int</span> tr <span style="color: #000080;">=</span> r <span style="color: #000080;">=</span> ranges.<span style="color: #007788;">top</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> ranges.<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;">int</span> tl <span style="color: #000080;">=</span> l <span style="color: #000080;">=</span> ranges.<span style="color: #007788;">top</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> ranges.<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>r <span style="color: #000040;">-</span> l <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ range sorted</span>
            <span style="color: #0000ff;">continue</span><span style="color: #008080;">;</span>
        <span style="color: #666666;">//~ partition begins</span>
        <span style="color: #0000ff;">int</span> pivot <span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>tl<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>tr <span style="color: #000080;">&gt;</span> tl<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>tr <span style="color: #000080;">&gt;</span> tl <span style="color: #000040;">&amp;&amp;</span> a<span style="color: #008000;">&#91;</span><span style="color: #000040;">--</span>tr<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> pivot<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            a<span style="color: #008000;">&#91;</span>tl<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>tr<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>tr <span style="color: #000080;">&gt;</span> tl <span style="color: #000040;">&amp;&amp;</span> a<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>tl<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> pivot<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            a<span style="color: #008000;">&#91;</span>tr<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>tl<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        a<span style="color: #008000;">&#91;</span>tl<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> pivot<span style="color: #008080;">;</span>
        <span style="color: #666666;">//~ partition ends</span>
&nbsp;
        <span style="color: #666666;">//~ ranges pushed, with order counting for little</span>
        ranges.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> ranges.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>tl<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        ranges.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>tl<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> ranges.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>r<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>　　代码中，堆栈使用STL的stack适配器，它默认使用deque做底层存储，因此，我们的栈使用的是堆内存，因此你就不必担心stack overflow了。你可能注意到了，这个版本中也使用了不少的函数调用，但都是可以通过自己建立堆栈来消除的。再者，这里只是提供一种思路，相对于迭代的带来的所谓性能“提升”，其带来的复杂性也是不可忽视的。</p>
<p>参考：<a href="http://en.wikipedia.org/wiki/Recursion_(computer_science)#Recursion_versus_iteration" target="_blank">Recursion</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2011/04/recursive-iterative-quick-sort/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<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="p24843"><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="p2484code3"><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="p24844"><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="p2484code4"><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="p22545"><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="p2254code5"><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>[C++]临时对象的可变性</title>
		<link>http://www.dutor.net/index.php/2010/05/temp-obj-alter/</link>
		<comments>http://www.dutor.net/index.php/2010/05/temp-obj-alter/#comments</comments>
		<pubDate>Tue, 04 May 2010 12:04:19 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[Cpp]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2245</guid>
		<description><![CDATA[　　有码有真相，各位看官您上眼：
<pre lang="cpp" line="1">
int main()
{
	bar(++foo(372)); //~ 此行报错
	bar(++foo(wrap_int(372))); //~ 无错
	return 0;
}
</pre>
　　第一个bar调用中foo返回int型临时对象，想要把这个int临时对象++后传给bar，未遂。第二个bar调用中，foo返回一个包装过的int, 即wrap_int，对这个临时对象进行++(重载)，得逞。<strong>结论：C++中，基本类型（内置类型）的临时对象不可以作为左值（l-value），即不可以修改；用户自定义类型的临时对象可以作为左值。</strong>]]></description>
			<content:encoded><![CDATA[<p>　　有码有真相，各位看官您上眼：</p>

<div class="wp_codebox"><table><tr id="p22456"><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
</pre></td><td class="code" id="p2245code6"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> foo<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<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: #0000ff;">void</span> bar<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">struct</span> wrap_int
<span style="color: #008000;">&#123;</span>
	wrap_int<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>
	operator <span style="color: #0000ff;">int</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">const</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>
	wrap_int operator <span style="color: #000040;">++</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: #000040;">++</span>n<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> n<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
wrap_int foo<span style="color: #008000;">&#40;</span>wrap_int n<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: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	bar<span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>foo<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">372</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 此行报错</span>
	bar<span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>foo<span style="color: #008000;">&#40;</span>wrap_int<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">372</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: #666666;">//~ 无错</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>　　第一个bar调用中foo返回int型临时对象，想要把这个int临时对象++后传给bar，未遂。第二个bar调用中，foo返回一个包装过的int, 即wrap_int，对这个临时对象进行++(重载)，得逞。<strong>结论：C++中，基本类型（内置类型）的临时对象不可以作为左值（l-value），即不可以修改；用户自定义类型的临时对象可以作为左值。</strong><br />
　　再看：</p>

<div class="wp_codebox"><table><tr id="p22457"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code" id="p2245code7"><pre class="cpp" style="font-family:monospace;"><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><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> vec<span style="color: #008080;">;</span>
    vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    vec.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    sort<span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>vec.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, vec.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    deque<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> deq<span style="color: #008080;">;</span>
    deq.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    deq.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    deq.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    deq.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    deq.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    sort<span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>deq.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, deq.<span style="color: #007788;">end</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;">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>这段代码中，对deque的排序没有问题，而对vec的排序操作就<strong>可能</strong>造成和上例类似的错误。因为vector<int>::iterator<strong>很可能</strong>会以裸露的指针来实现，这时对vec.begin()进行++操作就会出错。而对于deque，由于其特殊的内存模型，其iterator不可能是普通的指针，也就不存在这种错误。<br />
~over</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/05/temp-obj-alter/feed/</wfw:commentRss>
		<slash:comments>0</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="p21808"><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="p2180code8"><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="p21579"><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="p2157code9"><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++]函数调用与变量定义的二义性</title>
		<link>http://www.dutor.net/index.php/2010/04/func-dec-arbitrary/</link>
		<comments>http://www.dutor.net/index.php/2010/04/func-dec-arbitrary/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 07:26:05 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[Cpp]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=2133</guid>
		<description><![CDATA[　　首先，你知道下面的语句的语义是什么吗？
<pre lang="c">
int (a);
</pre>
或许写成这样你会更明白一点：
<pre lang="c">
int (a) = 0;
</pre>
它等同于
<pre lang="c">
int a = 0;
</pre>]]></description>
			<content:encoded><![CDATA[<p>　　首先，你知道下面的语句的语义是什么吗？</p>

<div class="wp_codebox"><table><tr id="p213310"><td class="code" id="p2133code10"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>或许写成这样你会更明白一点：</p>

<div class="wp_codebox"><table><tr id="p213311"><td class="code" id="p2133code11"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>它等同于</p>

<div class="wp_codebox"><table><tr id="p213312"><td class="code" id="p2133code12"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>即，在C/C++中，声明变量时允许你在变量名周围加上一对()。这样，我们的问题就来了。看下面这个奇怪的snippet:</p>

<div class="wp_codebox"><table><tr id="p213313"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p2133code13"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> G <span style="color: #000080;">=</span> <span style="color: #208080;">0xFF</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">class</span> Mary
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    Mary<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        Mary<span style="color: #008000;">&#40;</span>G<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    Mary<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> <span style="color: #ff0000; font-style: italic;">/*Constructing... */</span><span style="color: #008000;">&#125;</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>
    Mary M<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>

<p>　　这个程序有什么问题？看似很正常。在Mary::Mary()中调用Mary::Mary(int)，让Mary::Mary(int)进行构造工作。编译运行这个程序，你会得到Segment fault的错误。为什么？因为编译器将语句Mary(G); 当成变量定义来编译了。结果就是，Mary::Mary()会被无穷递归地调用，最终造成栈溢出。如果将Mary(G);改成Mary::Mary(G);呢？这样不但无济于事，而且恰恰更具有迷惑性。<br />
　　解决方法就是，通知编译器，这不是一般的变量定义，而是一个函数调用。比如把Mary(G)换成Mary(static_cast&lt;int>G);这样编译器就不会&#8221;神经质&#8221;地一通递归了。<br />
　　<strong>当变量的定义和函数的调用产生二义性时，编译器默认的行为是将其当成变量的定义来解释。</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2010/04/func-dec-arbitrary/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>常用的几个字符串Hash函数</title>
		<link>http://www.dutor.net/index.php/2009/11/string-hash/</link>
		<comments>http://www.dutor.net/index.php/2009/11/string-hash/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 07:47:11 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[Hash]]></category>
		<category><![CDATA[字符串]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1670</guid>
		<description><![CDATA[　　对最简单的SDBMHash(char*)做了一个简单的测试。随机生成200个长度为31的字符串，利用SDBM得到一个Hash值，然后用直接取余法插入长度为113的HashSet，为简单起见，只是将HashSet对应的位置进行加一。
<pre lang="cpp" line="1">
// SDBM Hash Function
unsigned int
SDBMHash (char *str)
{
    unsigned int hash = 0;
    while (*str)
      {
	  hash = (*str++) + (hash << 6) + (hash << 16) - hash;
      }
    return (hash &#038; 0x7FFFFFFF);
}
</pre>]]></description>
			<content:encoded><![CDATA[
<div class="wp_codebox"><table><tr id="p167014"><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
</pre></td><td class="code" id="p1670code14"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// RS Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span>
RSHash <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> b <span style="color: #000080;">=</span> <span style="color: #0000dd;">378551</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">63689</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <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><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
	  hash <span style="color: #000080;">=</span> hash <span style="color: #000040;">*</span> a <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	  a <span style="color: #000040;">*</span><span style="color: #000080;">=</span> b<span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// JS Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span>
JSHash <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">1315423911</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
	  hash <span style="color: #000040;">^</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&gt;&gt;</span> <span style="color: #0000dd;">2</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: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// P. J. Weinberger Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span>
PJWHash <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> BitsInUnignedInt <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">sizeof</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span>
							    <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color: #0000dd;">8</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> ThreeQuarters <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>BitsInUnignedInt <span style="color: #000040;">*</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">/</span> <span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> OneEighth <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#40;</span>BitsInUnignedInt <span style="color: #000040;">/</span> <span style="color: #0000dd;">8</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> HighBits <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#40;</span><span style="color: #208080;">0xFFFFFFFF</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span>
	<span style="color: #008000;">&#40;</span>BitsInUnignedInt <span style="color: #000040;">-</span> OneEighth<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> test <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><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
	  hash <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> OneEighth<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>test <span style="color: #000080;">=</span> hash <span style="color: #000040;">&amp;</span> HighBits<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
	    <span style="color: #008000;">&#123;</span>
		hash <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">^</span> <span style="color: #008000;">&#40;</span>test <span style="color: #000080;">&gt;&gt;</span> ThreeQuarters<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;</span> <span style="color: #008000;">&#40;</span>~HighBits<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;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// ELF Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span>
ELFHash <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> x <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><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
	  hash <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>x <span style="color: #000080;">=</span> hash <span style="color: #000040;">&amp;</span> 0xF0000000L<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
	    <span style="color: #008000;">&#123;</span>
		hash <span style="color: #000040;">^</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">&gt;&gt;</span> <span style="color: #0000dd;">24</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		hash <span style="color: #000040;">&amp;</span><span style="color: #000080;">=</span> ~x<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: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// BKDR Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span>
BKDRHash <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> seed <span style="color: #000080;">=</span> <span style="color: #0000dd;">131</span><span style="color: #008080;">;</span>	<span style="color: #666666;">// 31 131 1313 13131 131313 etc..</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <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><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
	  hash <span style="color: #000080;">=</span> hash <span style="color: #000040;">*</span> seed <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</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: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// SDBM Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span>
SDBMHash <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <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><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
	  hash <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">6</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">16</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> hash<span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// DJB Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span>
DJBHash <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">5381</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
	  hash <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</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: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// AP Hash Function</span>
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span>
APHash <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> hash <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">*</span>str<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;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>i <span style="color: #000040;">&amp;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
	    <span style="color: #008000;">&#123;</span>
		hash <span style="color: #000040;">^</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">7</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">^</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">^</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&gt;&gt;</span> <span style="color: #0000dd;">3</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: #0000ff;">else</span>
	    <span style="color: #008000;">&#123;</span>
		hash <span style="color: #000040;">^</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>~<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">11</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">^</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>str<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">^</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000080;">&gt;&gt;</span> <span style="color: #0000dd;">5</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;">return</span> <span style="color: #008000;">&#40;</span>hash <span style="color: #000040;">&amp;</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>　　对最简单的SDBMHash(char*)做了一个简单的测试。随机生成200个长度为31的字符串，利用SDBM得到一个Hash值，然后用直接取余法插入长度为113的HashSet，为简单起见，只是将HashSet对应的位置进行加一。</p>

<div class="wp_codebox"><table><tr id="p167015"><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
</pre></td><td class="code" id="p1670code15"><pre class="cpp" style="font-family:monospace;">&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> N <span style="color: #000080;">=</span> <span style="color: #0000dd;">32</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> str<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> HashSet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">113</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> RandStr<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> str, <span style="color: #0000ff;">const</span> <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> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</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>
		str<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">'a'</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">rand</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">26</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	str<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</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>
	<span style="color: #0000dd;">srand</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">time</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> count <span style="color: #000080;">=</span> <span style="color: #0000dd;">200</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> count<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		RandStr<span style="color: #008000;">&#40;</span>str, N<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		HashSet<span style="color: #008000;">&#91;</span>SDBMHash<span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span><span style="color: #000040;">%</span><span style="color:#800080;">113</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">FILE</span><span style="color: #000040;">*</span> out <span style="color: #000080;">=</span> <span style="color: #0000dd;">fopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;./result.txt&quot;</span>, <span style="color: #FF0000;">&quot;w&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #666666;">//~ FILE* out = stdout;</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;">113</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: #0000dd;">fprintf</span><span style="color: #008000;">&#40;</span>out, <span style="color: #FF0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, HashSet<span style="color: #008000;">&#91;</span>i<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;">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>　　测试效果还是很不错的，相当均匀了已经。<br />
<div class="wp-caption aligncenter" style="width: 650px"><img alt="HashTest Diagram" src="http://www.dutor.net/files/images/HashTest.png" title="HashTest Diagram" width="640" height="480" /><p class="wp-caption-text">HashTest Diagram</p></div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/11/string-hash/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="p166316"><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="p1663code16"><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="p165817"><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="p1658code17"><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/10/minimum-heap/</link>
		<comments>http://www.dutor.net/index.php/2009/10/minimum-heap/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 13:48:23 +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=1396</guid>
		<description><![CDATA[　　一个最小堆的C++模板。什么东西都想封装成类，做成模板，即使它仅仅就是一个普通的函数，尤其是用到一些全局的对象时，觉得封装成类看起来更紧凑一点，使用起来也更方便更顺手一些。这个最小堆模板实现了以下几个小特性：
　　容量不足时，能够动态地调整大小；
　　可以用一个数组来初始化，并建立最小堆；
　　没有复制构造，^*^.]]></description>
			<content:encoded><![CDATA[<p>　　一个最小堆的C++模板。什么东西都想封装成类，做成模板，即使它仅仅就是一个普通的函数，尤其是用到一些全局的对象时，觉得封装成类看起来更紧凑一点，使用起来也更方便更顺手一些。这个最小堆模板实现了以下几个小特性：<br />
　　容量不足时，能够动态地调整大小；<br />
　　可以用一个数组来初始化，并建立最小堆；<br />
　　没有复制构造，^*^.</p>

<div class="wp_codebox"><table><tr id="p139618"><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
</pre></td><td class="code" id="p1396code18"><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;">class</span> Heap
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        <span style="color: #666666;">//~ 构造容量n的堆</span>
        Heap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> n <span style="color: #000080;">=</span> <span style="color: #0000dd;">64</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #666666;">//~ 以数组构造</span>
        Heap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">*</span> beg, <span style="color: #0000ff;">const</span> T<span style="color: #000040;">*</span> end<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        ~Heap<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> pHeap<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span>
        <span style="color: #666666;">//~ 添加元素</span>
        <span style="color: #0000ff;">void</span> push<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> item<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #666666;">//~ 返回并删除堆顶元素</span>
        T pop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #666666;">//~ 返回堆顶元素的引用</span>
        T<span style="color: #000040;">&amp;</span> top<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">const</span><span style="color: #008080;">;</span><span style="color: #666666;">//! 不允许修改！</span>
        <span style="color: #0000ff;">size_t</span> size<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span><span style="color: #666666;">//~ 当前元素个数</span>
        <span style="color: #0000ff;">size_t</span> capacity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span><span style="color: #666666;">//~ 当前容量</span>
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">void</span> resize<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//~ 重新调整堆容量</span>
        <span style="color: #0000ff;">void</span> adjust<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//~ 调整以i为根的子树为最小堆</span>
        T <span style="color: #000040;">*</span> pHeap<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">size_t</span> _size<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">size_t</span> _capacity<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</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>
Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Heap</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> n<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> pHeap<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">new</span> T<span style="color: #008000;">&#91;</span>n<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    _size <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    _capacity <span style="color: #000080;">=</span> n<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</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>
Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Heap</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">*</span> beg,<span style="color: #0000ff;">const</span> T<span style="color: #000040;">*</span> end<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    _capacity <span style="color: #000080;">=</span> _size <span style="color: #000080;">=</span> end <span style="color: #000040;">-</span> beg<span style="color: #008080;">;</span>
    pHeap <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>
    <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> _size<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>beg<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> _size <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">//~ 调用adjust(int)构造最小堆</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</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>
        adjust<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</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;">void</span> Heap<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><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> item<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//~ 容量不足时重新分配空间</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>_size <span style="color: #000080;">==</span> _capacity<span style="color: #008000;">&#41;</span>
        resize<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    _size<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> _size <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">//~ 通过上溯寻找合适的插入位置</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>i <span style="color: #000040;">&amp;&amp;</span> pHeap<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> item<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> pHeap<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        i <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><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: #008000;">&#125;</span>
    pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> item<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</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>
T Heap<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: #666666;">//~ assert(_size);</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>_size <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">exit</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    T rt <span style="color: #000080;">=</span> pHeap<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: #666666;">//~ 先将堆尾元素置顶，然后重建</span>
    pHeap<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> pHeap<span style="color: #008000;">&#91;</span><span style="color: #000040;">--</span>_size<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>_size<span style="color: #008000;">&#41;</span>
        adjust<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> rt<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</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>
T<span style="color: #000040;">&amp;</span> Heap<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: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// assert(_size);</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>_size <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">exit</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> pHeap<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: #008000;">&#125;</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;">size_t</span> Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> _size<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</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;">size_t</span> Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">capacity</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> _capacity<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</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;">void</span> Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">resize</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    T <span style="color: #000040;">*</span> org <span style="color: #000080;">=</span> pHeap<span style="color: #008080;">;</span>
    <span style="color: #666666;">//~ 调整容量</span>
    _capacity <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #000040;">*</span>_capacity <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    pHeap <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> T<span style="color: #008000;">&#91;</span>_capacity<span style="color: #008000;">&#93;</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> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> _size<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> org<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: #0000dd;">delete</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> org<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</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;">void</span> Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">adjust</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//~ 重建以i为根的最小堆，假定其左右子树已是最小堆</span>
    <span style="color: #0000ff;">size_t</span> minpos<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span> <span style="color: #000040;">*</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;</span> _size<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        minpos <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span> <span style="color: #000040;">*</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">2</span> <span style="color: #000080;">&lt;</span> _size <span style="color: #000040;">&amp;&amp;</span> pHeap<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #000040;">*</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
            minpos <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #000040;">*</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>pHeap<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #000040;">*</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> pHeap<span style="color: #008000;">&#91;</span>minpos<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
            minpos <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #000040;">*</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>minpos <span style="color: #000080;">==</span> i<span style="color: #008000;">&#41;</span>
            <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
        swap<span style="color: #008000;">&#40;</span>pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, pHeap<span style="color: #008000;">&#91;</span>minpos<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        i <span style="color: #000080;">=</span> minpos<span style="color: #008080;">;</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/10/minimum-heap/feed/</wfw:commentRss>
		<slash:comments>1</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="p116119"><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="p1161code19"><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/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="p106120"><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="p1061code20"><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="p104821"><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="p1048code21"><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>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="p102922"><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="p1029code22"><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/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="p91423"><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="p914code23"><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="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
46
47
</pre></td><td class="code" id="p914code24"><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="p90625"><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="p906code25"><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>
		<item>
		<title>连续正整数分解</title>
		<link>http://www.dutor.net/index.php/2009/07/integer-decompose/</link>
		<comments>http://www.dutor.net/index.php/2009/07/integer-decompose/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 06:38:49 +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=889</guid>
		<description><![CDATA[ZOJ上的一道题(illusive chase)让我憋了一整天才AC了，而且用了224行，最后优化到115行！我真真是没救了，也只能做做小儿科的题目了！sucks……这里有上次百度之星的一道水题……
<h6>题目描述：</h6>
一个正整数有可能可以被表示为n(n>=2)个连续正整数之和，如：
<pre>
15=1+2+3+4+5
15=4+5+6
15=7+8
</pre>
]]></description>
			<content:encoded><![CDATA[<p>ZOJ上的一道题(illusive chase)让我憋了一整天才AC了，而且用了224行，最后优化到115行！我真真是没救了，也只能做做小儿科的题目了！sucks……这里有上次百度之星的一道水题……</p>
<h6>题目描述：</h6>
<p>一个正整数有可能可以被表示为n(n>=2)个连续正整数之和，如：</p>
<pre>
15=1+2+3+4+5
15=4+5+6
15=7+8
</pre>
<p>请编写程序，根据输入的任何一个正整数，找出符合这种要求的所有连续正整数序列。</p>
<h6>输入数据：</h6>
<p>一个正整数，以命令行参数的形式提供给程序。</p>
<h6>输出数据：</h6>
<p>在标准输出上打印出符合题目描述的全部正整数序列，每行一个序列，每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列，按各序列的最小正整数的大小从小到大打印各序列。此外，序列不允许重复，序列内的整数用一个空格分隔。如果没有符合要求的序列，输出“NONE”。<br />
例如，对于15，其输出结果是：</p>
<pre>
1 2 3 4 5
4 5 6
7 8
</pre>
<p>对于16，其输出结果是：<br />
NONE</p>
<h6>代码：</h6>

<div class="wp_codebox"><table><tr id="p88926"><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
</pre></td><td class="code" id="p889code26"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cmath&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: #0000ff;">int</span> argn, <span style="color: #0000ff;">char</span><span style="color: #000040;">**</span> str<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> N <span style="color: #000080;">=</span> <span style="color: #0000dd;">atoi</span><span style="color: #008000;">&#40;</span>str<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: #0000ff;">if</span><span style="color: #008000;">&#40;</span>N <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">2</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;NONE&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>
	<span style="color: #0000ff;">int</span> sum<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> bingo <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><span style="color: #0000ff;">int</span> n <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">sqrt</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">float</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">8</span><span style="color: #000040;">*</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</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: #000040;">/</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> n <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>n<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		sum <span style="color: #000080;">=</span> n<span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>n<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><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: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>N<span style="color: #000040;">-</span>sum<span style="color: #008000;">&#41;</span><span style="color: #000040;">%</span>n <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			bingo <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;">1</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>i <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>N<span style="color: #000040;">-</span>sum<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span>n<span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">' '</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>endl<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><span style="color: #000040;">!</span>bingo<span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;NONE&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</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/07/integer-decompose/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>快速排序C++实现</title>
		<link>http://www.dutor.net/index.php/2009/06/quick_sort/</link>
		<comments>http://www.dutor.net/index.php/2009/06/quick_sort/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 03:47:06 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[Cpp]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=825</guid>
		<description><![CDATA[<pre lang="cpp" line="1">
class quick_sort
{
public:
	typedef int T;
	explicit quick_sort(T* src, int beg, int end);
private:
	void sub_sort(int beg, int end);
	T* m_src;
};
</pre>]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 290px"><img alt="快速排序" src="http://upload.wikimedia.org/wikipedia/commons/6/6a/Sorting_quicksort_anim.gif" title="quick_sort" width="280" height="214" /><p class="wp-caption-text">快速排序</p></div>

<div class="wp_codebox"><table><tr id="p82527"><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
</pre></td><td class="code" id="p825code27"><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;ctime&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;">class</span> quick_sort
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">int</span> T<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">explicit</span> quick_sort<span style="color: #008000;">&#40;</span>T<span style="color: #000040;">*</span> src, <span style="color: #0000ff;">int</span> beg, <span style="color: #0000ff;">int</span> end<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;">void</span> sub_sort<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> beg, <span style="color: #0000ff;">int</span> end<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	T<span style="color: #000040;">*</span> m_src<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
quick_sort<span style="color: #008080;">::</span><span style="color: #007788;">quick_sort</span><span style="color: #008000;">&#40;</span>quick_sort<span style="color: #008080;">::</span><span style="color: #007788;">T</span> <span style="color: #000040;">*</span>src, <span style="color: #0000ff;">int</span> beg, <span style="color: #0000ff;">int</span> end<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>m_src<span style="color: #008000;">&#40;</span>src<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">srand</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">time</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	sub_sort<span style="color: #008000;">&#40;</span>beg, end<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">void</span> quick_sort<span style="color: #008080;">::</span><span style="color: #007788;">sub_sort</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> beg, <span style="color: #0000ff;">int</span> end<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> beg <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span>, j <span style="color: #000080;">=</span> end<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>end <span style="color: #000080;">&lt;=</span> beg<span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
	T piv <span style="color: #000080;">=</span> m_src<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">rand</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">%</span><span style="color: #008000;">&#40;</span>end<span style="color: #000040;">-</span>beg<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> beg<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: #008080;">;</span> <span style="color: #008080;">;</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>m_src<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> piv<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>piv <span style="color: #000080;">&lt;</span> m_src<span style="color: #008000;">&#91;</span><span style="color: #000040;">--</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> i <span style="color: #000080;">&gt;=</span> j<span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		swap<span style="color: #008000;">&#40;</span>m_src<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, m_src<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>
	sub_sort<span style="color: #008000;">&#40;</span>beg, i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	sub_sort<span style="color: #008000;">&#40;</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, end<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
&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>
	<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> n <span style="color: #000080;">=</span> <span style="color: #0000dd;">20</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> src<span style="color: #008000;">&#91;</span>n<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> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		src<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> n <span style="color: #000040;">-</span> i<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	quick_sort<span style="color: #008000;">&#40;</span>src, <span style="color: #0000dd;">0</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>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>src<span style="color: #008000;">&#91;</span>i<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: #666666;">//system(&quot;pause&quot;);</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/06/quick_sort/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>有意思的排序视频</title>
		<link>http://www.dutor.net/index.php/2009/06/funny-sort/</link>
		<comments>http://www.dutor.net/index.php/2009/06/funny-sort/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 02:47:15 +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=823</guid>
		<description><![CDATA[分别演示了冒泡排序和快速排序。最有意思的是里面的机器人，神态相当的可笑！
<object width="420" height="363"><param name="movie" value="http://www.tudou.com/v/htKY1-Rj9ZE"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><param name="wmode" value="opaque"></param><embed src="http://www.tudou.com/v/htKY1-Rj9ZE" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="420" height="363"></embed></object>]]></description>
			<content:encoded><![CDATA[<p>分别演示了冒泡排序和快速排序。最有意思的是里面的机器人，神态相当的可笑！<br />
<object width="420" height="363"><param name="movie" value="http://www.tudou.com/v/htKY1-Rj9ZE"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><param name="wmode" value="opaque"></param><embed src="http://www.tudou.com/v/htKY1-Rj9ZE" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="420" height="363"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/06/funny-sort/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>并行计算相关词汇</title>
		<link>http://www.dutor.net/index.php/2009/05/parrell-compute-terms/</link>
		<comments>http://www.dutor.net/index.php/2009/05/parrell-compute-terms/#comments</comments>
		<pubDate>Sun, 24 May 2009 23:03:43 +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=552</guid>
		<description><![CDATA[<strong>1、 并行计算：</strong>

<blockquote>并行计算是指同时对多个任务或多条指令、或对多个数据项进行处理。完成此项处理的计算机系统称为并行计算机系统，它是将多个处理器通过网络连接以一定的方式有序地组织起来。</blockquote>]]></description>
			<content:encoded><![CDATA[<p>
<strong>1、 并行计算：</strong></p>
<blockquote><p>并行计算是指同时对多个任务或多条指令、或对多个数据项进行处理。完成此项处理的计算机系统称为并行计算机系统，它是将多个处理器通过网络连接以一定的方式有序地组织起来。</p></blockquote>
<p><strong>2、 指令流：</strong></p>
<blockquote><p>机器执行的指令序列；</p></blockquote>
<p><strong>3、 数据流：</strong></p>
<blockquote><p>由指令流调用的数据序列，包括输入数据和中间结果。</p></blockquote>
<p><strong>4、 SIMD计算机：</strong></p>
<blockquote><p>有一个控制部件和许多处理单元,所有的处理单元在控制部件的统一控制下工作。控制部件向所有的处理单元广播同一条指令，所有的处理单元同时执行这条指令，但是每个处理单元操作的数据不同。
</p></blockquote>
<p><strong>5、 MIMD计算机</strong></p>
<blockquote><p>没有统一的控制部件，含有多个处理器，各处理器可以独立地执行不同的指令，每个处理器都有控制部件，各处理器通过互连网络进行通信。</p></blockquote>
<p><strong>6、 并行向量处理机（PVP）</strong></p>
<blockquote><p>在并行向量处理机中有少量专门定制的向量处理器。每个向量处理器有很高的处理能力。并行向量处理机通过向量处理和多个向量处理器并行处理两条途径来提高处理能力。</p></blockquote>
<p><strong><br />
7、 大规模并行处理机（MPP）</strong></p>
<blockquote><p>大规模并行处理机一般指规模非常大的并行计算机系统，含有成千上万个处理器。它一般采用分布的存储器，存储器一般为处理器私有，各处理器之间用消息传递的方式通信。大规模并行处理机的互连网络一般是专门设计定制的。</p></blockquote>
<p><strong>8、 分布式共享存储器多处理机（DSM）</strong></p>
<blockquote><p>分布式共享存储器多处理机的主要特点是它的存储器在物理上是分布在各个结点中的，但是通过硬件和软件为用户提供一个单一地址的编程空间，即形成一个虚拟的共享存储器。它通过高速缓存目录支持分布高速缓存的一致性。</p></blockquote>
<p><strong>9、 机群(COW或NOW)</strong></p>
<blockquote><p> 是由高档商品微机（包括工作站）用高速商品互连网络（有的商用机群也使用定制的网络）连接而成，每个结点都是一台完整的计算机（可能没有鼠标、显示器等外设）。</p></blockquote>
<p><strong>10、 对称多处理机（SMP）</strong></p>
<blockquote><p>对称多处理机的最大特点是其中的各处理器完全平等，无主从之分。所有的处理器都可以访问任何存储单元和I/O设备。存储器一般使用共享存储器，只有一个地址空间。因为使用共享存储器，通信可用共享变量（读写同一内存单元）来实现。</p></blockquote>
<p><strong>11、 UMA </strong></p>
<blockquote><p>UMA是Uniform Memory Access（均匀存储访问）模型的缩写。在这种并行机中所有的处理器均匀共享物理存储器。所有处理器访问任何存储字需要相同的时间（此即为均匀存储访问名称的来源）。每台处理器可以有私有高速缓存。UMA结构适用于通用或分时应用。</p></blockquote>
<p><strong>12、 NUMA</strong></p>
<blockquote><p>NUMA是Nonuniform Memory Access（非均匀存储访问）模型的缩写。在NUMA中，共享存储器在物理上是分布的，所有的本地存储器构成了全局地址空间。NUMA与UMA的区别在于处理器访问本地存储器和群内共享存储器比访问远程存储器或全局共享存储器快。</p></blockquote>
<p><strong>13、 COMA</strong></p>
<blockquote><p> COMA是Cache-Only Memory Architecture（全高速缓存存储结构）模型的缩写。COMA实际是NUMA的一种特例，将NUMA中的分布存储器换成高速缓存就得到了 COMA。在COMA中，每个结点上没有存储层次结构，所有的高速缓存构成了全局地址空间。访问远程高速缓存要借助分布的高速缓存目录。</p></blockquote>
<p><strong>14、 CC-NUMA</strong></p>
<blockquote><p>CC-NUMA是Cache-Coherent Nonuniform Memory Access（高速缓存一致性非均匀存储访问）模型的缩写。CC-NUMA结构的并行机实际上是将一些SMP机作为结点互连起来而构成的并行机，绝大多数商用CC-NUMA多处理机系统使用基于目录的高速缓存一致性协议；它的存储器在物理上是分布的，所有的局部存储器构成了共享的全局地址空间。</p></blockquote>
<p><strong>15、 NORMA</strong></p>
<blockquote><p>NORMA是No-Remote Memory Access（非远程存储访问）模型的缩写。在NORMA中，所有的存储器都是处理器私有的，仅能由其处理器访问。各处理器之间通过消息传递方式通信。</p></blockquote>
<p><strong>16、 静态网络（Static Networks）</strong></p>
<blockquote><p> 静态网络是指结点间有着固定连接通路且在程序执行期间，这种连接保持不变的网络</p></blockquote>
<p><strong>17、 动态网络（Dynamic Networks）</strong></p>
<blockquote><p>动态网络是用开关单元构成的，可按应用程序的要求动态地改变连接状态的网络</p></blockquote>
<p><strong>18、 互连函数 </strong></p>
<blockquote><p>为了反映不同互连网络的连接特性，每种互连网络可以用一组互连函数来描述。用整数 分别表示互连网络的 个输入端和 个输出端。记互连函数为 ，它表示输入端 与输出端 相连。</p></blockquote>
<p><strong>19、 总线 </strong></p>
<blockquote><p>总线（Bus）实际上是连接处理器、存储器和I/O等外围设备的一组导线和插座。总线的一个特点是：它在某一时刻只能用于一对源和目的之间传输数据。当有多对源和目的请求使用总线时，必须由总线仲裁逻辑进行总线仲裁，即确定先为哪一对源和目的服务。</p></blockquote>
<p><strong>20、 交叉开关</strong></p>
<blockquote><p> 交叉开关（Crossbar Switcher）是一种高带宽网络，它可以在输入端和输出端之间建立动态连接，在每个输入端和输入端的交叉点上都有交叉点开关。该开关可以根据需要置为“开”或“关”状态，从而使不同的输入端和输出端导通。 交叉开关允许 对源和目的同时用互不重叠的通道进行通信，也允许一个输入端向多个输出端同时发送信息。在并行系统中，交叉开关可以用来连接处理器和处理器，也可以用来连接处理器和存储器。</p></blockquote>
<p><strong>21、 多级互连网络</strong></p>
<blockquote><p> 为了构造大型网络，可以把交叉开关级联起来，构成多级互连网络（Multistage Interconnection Network, MIN）</p></blockquote>
<p><strong>22、 消息（Message）</strong></p>
<blockquote><p>  是结点间通信的逻辑单位。它由任意数目的长度固定的包组成。</p></blockquote>
<p><strong>23、 包（Packet）</strong></p>
<blockquote><p> 是包含寻径目的地址的基本单位。包的长度由使用的协议决定。由于不同的包可能异步地到达目的结点，因此属于一个消息的每个包需要一个唯一的序号，以便在目的结点可以将包按照正确的顺序重新装配起来。</p></blockquote>
<p><strong>24、 片（flit）</strong></p>
<blockquote><p>将包分成一些固定长度的片（flit），寻径信息和序号形成头片，其余的片是数据片。</p></blockquote>
<p><strong>25、 网络寻径算法</strong></p>
<blockquote><p>决定消息从源结点到目的结点的路径的算法称为网络寻径算法。</p></blockquote>
<p><strong>26、 存储转发（Store-and-Forward）</strong></p>
<blockquote><p>为一种寻径方式，在这种方式下，消息被分成包来传送，包是信息传输的基本单位。包从源结点通过一系列中间结点到达目的结点，每个结点有一个包缓冲区。当包到达一个中间结点A时，A把整个包全部接收下来放入其包缓冲区中，然后在寻径算法的控制下选择下一个中间结点B，当从A到B的通道空闲并且B的包缓冲区可用时，A把包发向B。不断地存储和转发，包就可以到达目的结点。所有的包到达目的结点后，目的结点再把包组装成原来的消息。</p></blockquote>
<p><strong>27、 虫蚀寻径（Wormhole）</strong></p>
<blockquote><p>是寻径的一种方式。包被分成更小的片进行传输，头片包含了这个包的所有寻径信息，其它片是数据片。与结点相连的硬件寻径器中有片缓冲区。同一个包中所有的片像不可分离的同伴一样以流水方式顺序地传送。</p></blockquote>
<p><strong>28、 单播（unicast）</strong></p>
<blockquote><p>  一对一的通信模式，一个源结点发送消息到一个目的结点种通信。</p></blockquote>
<p><strong>29、 选播（multicast）</strong></p>
<blockquote><p>一到多的通信模式，一个源结点发送同一个消息到多个目的结点</p></blockquote>
<p><strong>30、 广播（broadcast）  </strong></p>
<blockquote><p>一到全体的通信模式，一个源结点发送同一个消息到全部结点</p></blockquote>
<p><strong>31、 会议（conference）</strong></p>
<blockquote><p>  即多对多的通信模式。</p></blockquote>
<p><strong>32、 数据并行性 </strong></p>
<blockquote><p> 是并行性的一种表现行为，并行在不同的数据上进行相同的操作。</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/05/parrell-compute-terms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Felicia&#8217;s LCD</title>
		<link>http://www.dutor.net/index.php/2009/05/felicias-lcd/</link>
		<comments>http://www.dutor.net/index.php/2009/05/felicias-lcd/#comments</comments>
		<pubDate>Mon, 18 May 2009 12:15:32 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=499</guid>
		<description><![CDATA[<strong>题目描述：</strong>


<blockquote>Felicia的LCD当然与众不同，她的显示器是有许多许多坏点的，此外，
她的显示器只能显示两种颜色（黑和白，分别对应亮与暗），显示器中任意相邻的点不能同时亮，
一次你遇到漂亮的Felicia，你被迷倒了，于是你想帮助她换一台新的LCD，
但她却考你能算出她的LCD一共能够显示出多少种不同的图案，
智慧的你能不能完成这个任务呢？
</blockquote>]]></description>
			<content:encoded><![CDATA[<p><strong>题目描述：</strong></p>
<blockquote><p>Felicia的LCD当然与众不同，她的显示器是有许多许多坏点的，此外，<br />
她的显示器只能显示两种颜色（黑和白，分别对应亮与暗），显示器中任意相邻的点不能同时亮，<br />
一次你遇到漂亮的Felicia，你被迷倒了，于是你想帮助她换一台新的LCD，<br />
但她却考你能算出她的LCD一共能够显示出多少种不同的图案，<br />
智慧的你能不能完成这个任务呢？
</p></blockquote>
<p><strong>输入：</strong></p>
<blockquote><p>第一行依次为 m n(1<=m,n<=12)<br />
之后是一个m*n(m行n列)的01数字矩阵，1表示好点，0表示坏点</p></blockquote>
<p><strong>输出：</strong></p>
<blockquote><p>输出一个数x,为Felicia的LCD一共能够显示出的图案数 mod 100,000,000 的结果</p></blockquote>
<p><strong>样例输入：</strong></p>
<blockquote><p>2 3<br />
1 1 1<br />
0 1 0</p></blockquote>
<p><strong>样例输出：</strong></p>
<blockquote><p>9</p></blockquote>
<p><strong>代码：</strong></p>

<div class="wp_codebox"><table><tr id="p49928"><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
</pre></td><td class="code" id="p499code28"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//本题代码由卧龙孔明提供，十分感谢！</span>
<span style="color: #339900;">#include&lt;stdio.h&gt;</span>
<span style="color: #339900;">#include&lt;string.h&gt;</span>
<span style="color: #339900;">#define mod 100000000</span>
<span style="color: #0000ff;">int</span> limit<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> base<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">400</span><span style="color: #008000;">&#93;</span>, num<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> dp<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #0000dd;">12</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> map<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">12</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> m, n<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> dfs<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> depth, <span style="color: #0000ff;">int</span> st<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>depth <span style="color: #000080;">==</span> n<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>dp<span style="color: #008000;">&#91;</span>depth<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>st<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> dp<span style="color: #008000;">&#91;</span>depth<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>st<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> ans <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</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>num<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;">if</span><span style="color: #008000;">&#40;</span>base<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;</span> limit<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>base<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;</span> base<span style="color: #008000;">&#91;</span>st<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span>base<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">|</span> map<span style="color: #008000;">&#91;</span>depth<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> map<span style="color: #008000;">&#91;</span>depth<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            ans <span style="color: #000040;">+</span><span style="color: #000080;">=</span> dfs<span style="color: #008000;">&#40;</span>depth <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>, i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            ans <span style="color: #000040;">%</span><span style="color: #000080;">=</span> mod<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
    dp<span style="color: #008000;">&#91;</span>depth<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>st<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> ans<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> ans<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> i, j, f<span style="color: #008080;">;</span>
    num <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</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: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #0000dd;">12</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        f <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>j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">12</span><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: #0000ff;">if</span><span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #000080;">&lt;&lt;</span>j<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">&amp;&amp;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #008000;">&#40;</span>j<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;">&#41;</span><span style="color: #000040;">&amp;&amp;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                f <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>f<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            base<span style="color: #008000;">&#91;</span>num<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
            num <span style="color: #000040;">++</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: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> i, j, t<span style="color: #008080;">;</span>
    init<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><span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d %d&quot;</span>, <span style="color: #000040;">&amp;</span>n, <span style="color: #000040;">&amp;</span>m<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">EOF</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>dp, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>dp<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        limit <span style="color: #000080;">=</span> <span style="color: #208080;">0xFFFFFFFF</span><span style="color: #008080;">;</span>
        limit <span style="color: #000040;">-</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #000080;">&lt;&lt;</span>m<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: #008080;">;</span>
        <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</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> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            map<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: #0000ff;">for</span><span style="color: #008000;">&#40;</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>m<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;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>, <span style="color: #000040;">&amp;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                map<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;&lt;=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
                map<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, dfs<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</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: #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/05/felicias-lcd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>二进制串转换为十进制</title>
		<link>http://www.dutor.net/index.php/2009/05/binary-series-to-decimal-series/</link>
		<comments>http://www.dutor.net/index.php/2009/05/binary-series-to-decimal-series/#comments</comments>
		<pubDate>Mon, 11 May 2009 22:42:17 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=422</guid>
		<description><![CDATA[<strong>描述：</strong>


<blockquote>      本程序可以将一个3000位的二进制串转化成十进制串
</blockquote>]]></description>
			<content:encoded><![CDATA[<p><strong>描述：</strong></p>
<blockquote><p>      本程序可以将一个3000位的二进制串转化成十进制串
</p></blockquote>
<p><strong>代码：</strong></p>

<div class="wp_codebox"><table><tr id="p42229"><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
</pre></td><td class="code" id="p422code29"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;fstream&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;time.h&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<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>
    <span style="color: #0000ff;">clock_t</span> start<span style="color: #000080;">=</span><span style="color: #0000dd;">clock</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   <span style="color: #666666;">//统计时间</span>
&nbsp;
    ifstream in<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;abc.txt&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>string s<span style="color: #008080;">;</span> getline<span style="color: #008000;">&#40;</span>in,s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>     <span style="color: #666666;">//读取二进制数</span>
        <span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">904</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#125;</span>,t<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>   <span style="color: #666666;">//三千位的二进制数都为1时最大，转换后约为2.46e+903,所以取数组904足够</span>
        <span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">904</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>     <span style="color: #666666;">//数组的每一位放置十进制的一位数，从a[0]到a[903]依次为个位、十位、百位...</span>
        a<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;">1</span><span style="color: #008080;">;</span>   <span style="color: #666666;">//数组初值全为零，第一位为2的0次方，等于1，所以a[0]赋值为1</span>
        reverse<span style="color: #008000;">&#40;</span>s.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,s.<span style="color: #007788;">end</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: #666666;">//倒置字符串s,数组最低位也为二进制数的最低位,方便求和</span>
        <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> k<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> k<span style="color: #000080;">&lt;</span>s.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>     <span style="color: #666666;">//开始从k=0位读取字符s[k](从原数字的最低位开始)</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>s<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #FF0000;">'1'</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>         <span style="color: #666666;">//等于'0'时，2的k次方为0</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>t<span style="color: #008080;">;</span> i<span style="color: #000080;">&lt;</span>k<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: #666666;">//求2的k次方，每次循环乘2，共乘k-t次,t为保留的上次a[i]累计</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><span style="color: #0000dd;">904</span><span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//每一位都乘2</span>
                        a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">2</span><span style="color: #000040;">*</span>a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>      
                    t<span style="color: #000080;">=</span>k<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><span style="color: #0000dd;">904</span><span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>     <span style="color: #666666;">//检查从a[0]到a[903]每位是不是都是个位数</span>
                        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">&gt;=</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span>
                        <span style="color: #008000;">&#123;</span>       <span style="color: #666666;">//超过10就要进位</span>
                            a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>     <span style="color: #666666;">//j位大于10进1</span>
                            a<span style="color: #008000;">&#91;</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> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>   <span style="color: #666666;">//下位即j+1位要加1</span>
                        <span style="color: #008000;">&#125;</span>
                <span style="color: #008000;">&#125;</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><span style="color: #0000dd;">904</span><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: #666666;">//b数组为求和数组，初值为0</span>
                    b<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>       <span style="color: #666666;">//将此次k位上的2的k次方数的大小与b求和</span>
                    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">&gt;=</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        b<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>b<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
                        b<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>b<span style="color: #008000;">&#91;</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: #0000dd;">1</span><span style="color: #008080;">;</span>
                    <span style="color: #008000;">&#125;</span><span style="color: #666666;">//大于10进1，下一位加1</span>
                <span style="color: #008000;">&#125;</span> 
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0000ff;">int</span> w<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;">903</span><span style="color: #008080;">;</span> i<span style="color: #000080;">&gt;=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>     <span style="color: #666666;">//w为统计此3000位二进制数转化为十进制后的位数</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                w<span style="color: #000080;">=</span>i<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;">//从最高位开始，遇到非0数结束</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>w<span style="color: #008080;">;</span> i<span style="color: #000080;">&gt;=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>   <span style="color: #666666;">//输出结果，注意是从高位开始输出</span>
                <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span>b<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
            <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span>endl <span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;十进制位数为： &quot;</span> <span style="color: #000080;">&lt;&lt;</span>w<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;&lt;</span>endl <span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>   <span style="color: #666666;">//输出转化后的十进制数位数</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;Time used ：&quot;</span> <span style="color: #000080;">&lt;&lt;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">clock</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>start<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #0000ff;">CLOCKS_PER_SEC</span> <span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>   <span style="color: #666666;">//输出耗用时间,64个3000位的测试时间为12秒</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>

<p>[warning]This is <em>original</em> article, you could copy it freely with my site links!<br />此日志为dutor原创，您可以自由转载，添加原文链接我将万分感激！[/warning]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/05/binary-series-to-decimal-series/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

