﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xan walking &amp; thinking-随笔分类-Algorithms</title><link>http://www.blogjava.net/xan/category/32224.html</link><description>学习 思考 实践</description><language>zh-cn</language><lastBuildDate>Fri, 03 Oct 2008 06:43:40 GMT</lastBuildDate><pubDate>Fri, 03 Oct 2008 06:43:40 GMT</pubDate><ttl>60</ttl><item><title>N! 的位数</title><link>http://www.blogjava.net/xan/archive/2008/10/03/232199.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Fri, 03 Oct 2008 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/10/03/232199.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/232199.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/10/03/232199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/232199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/232199.html</trackback:ping><description><![CDATA[数N的位数 [lgN] + 1<br />
N! = N*(N-1)*...*1<br />
位数 [lgN!]+1=lg(N(N-1)...1)+1 = (lgN+lg(N-1)+...+lg1) + 1
<img src ="http://www.blogjava.net/xan/aggbug/232199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-10-03 14:20 <a href="http://www.blogjava.net/xan/archive/2008/10/03/232199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速排序</title><link>http://www.blogjava.net/xan/archive/2008/10/03/232195.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Fri, 03 Oct 2008 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/10/03/232195.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/232195.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/10/03/232195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/232195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/232195.html</trackback:ping><description><![CDATA[<p>实践中最快的已知排序算法, O(NlogN),最坏O(N<sup>2</sup>)<br />
loop:<br />
1. 如果S中元素个数为0或者1,返回<br />
2. 取S中任意元素v为枢纽<br />
3. 将S中余下元素按&gt;v 和 &lt;v分成两个不同部分<br />
4. 对这两个部分快速排序<br />
<br />
枢纽元选择:<br />
一般采用S中起始,结束,中间位置的三个值的中值为枢纽元 (三数中值分割法)</p>
<img src ="http://www.blogjava.net/xan/aggbug/232195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-10-03 14:10 <a href="http://www.blogjava.net/xan/archive/2008/10/03/232195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]中国剩余公理+扩展欧几里德算法</title><link>http://www.blogjava.net/xan/archive/2008/09/26/231280.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Fri, 26 Sep 2008 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/09/26/231280.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/231280.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/09/26/231280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/231280.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/231280.html</trackback:ping><description><![CDATA[[reference: <a href="http://en.wikipedia.org/wiki/Chinese_remainder_theorem">http://en.wikipedia.org/wiki/Chinese_remainder_theorem</a> &amp; <a href="http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm">http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm</a> ]<br />
<p>Suppose <em>n</em><sub>1</sub>, <em>n</em><sub>2</sub>, &#8230;, <em>n</em><sub><em>k</em></sub> are positive <a title="Integer" href="http://en.wikipedia.org/wiki/Integer">integers</a> which are <a title="Pairwise coprime" href="http://en.wikipedia.org/wiki/Pairwise_coprime">pairwise coprime</a>. Then, for any given integers <em>a</em><sub>1</sub>,<em>a</em><sub>2</sub>, &#8230;, <em>a</em><sub><em>k</em></sub>, there exists an integer <em>x</em> solving the system of simultaneous congruences</p>
<dl>
<dd><img class="tex" alt="\begin{align}&#10; x &amp;\equiv a_1 \pmod{n_1} \\&#10; x &amp;\equiv a_2 \pmod{n_2} \\&#10;   &amp;\vdots \\&#10; x &amp;\equiv a_k \pmod{n_k}&#10;\end{align}" src="http://upload.wikimedia.org/math/4/b/a/4ba21deba1d9581961b07463e1107eec.png" /> </dd></dl>
<p>Furthermore, all solutions <em>x</em> to this system are congruent modulo the product <em>N</em> = <em>n</em><sub>1</sub><em>n</em><sub>2</sub>&#8230;<em>n</em><sub><em>k</em></sub>.</p>
<p>Hence <img class="tex" alt="x \equiv y \pmod{n_i}" src="http://upload.wikimedia.org/math/e/b/8/eb8afbf0cfba230ae1569a482d84bbc6.png" /> for all <img class="tex" alt="1\leq i \leq k" src="http://upload.wikimedia.org/math/9/2/b/92b68727874952b96de54cfb2c27839c.png" />, if and only if <img class="tex" alt="x \equiv y \pmod{N}" src="http://upload.wikimedia.org/math/5/2/0/52003e89af842fa5bbd441682c5cdb00.png" />.</p>
<p>Sometimes, the simultaneous congruences can be solved even if the <em>n<sub>i</sub>'</em>s are not pairwise coprime. A solution <em>x</em> exists if and only if:</p>
<dl>
<dd><img class="tex" alt="a_i \equiv a_j \pmod{\gcd(n_i,n_j)} \qquad \mbox{for all }i\mbox{ and }j . \,\! " src="http://upload.wikimedia.org/math/8/2/c/82c836223302ea999989259adf4cfc41.png" /> </dd></dl>
<p>All solutions <em>x</em> are then congruent modulo the <a title="Least common multiple" href="http://en.wikipedia.org/wiki/Least_common_multiple">least common multiple</a> of the <em>n<sub>i</sub></em>.</p>
<p>Versions of the Chinese remainder theorem were also known to <a title="Brahmagupta" href="http://en.wikipedia.org/wiki/Brahmagupta">Brahmagupta</a> (7th century), and appear in <a title="Fibonacci" href="http://en.wikipedia.org/wiki/Fibonacci">Fibonacci</a>'s <a title="Liber Abaci" href="http://en.wikipedia.org/wiki/Liber_Abaci">Liber Abaci</a> (1202).</p>
<p><a id="A_constructive_algorithm_to_find_the_solution" name="A_constructive_algorithm_to_find_the_solution"></a></p>
<h2><span class="editsection">[<a title="Edit section: A constructive algorithm to find the solution" href="http://en.wikipedia.org/w/index.php?title=Chinese_remainder_theorem&amp;action=edit&amp;section=2">edit</a>]</span> <span class="mw-headline">A constructive algorithm to find the solution</span></h2>
<p>This algorithm only treats the situations where the <span class="texhtml"><em>n</em><sub><em>i</em></sub></span>'s are coprime. The <a title="Method of successive substitution" href="http://en.wikipedia.org/wiki/Method_of_successive_substitution">method of successive substitution</a> can often yield solutions to simultaneous congruences, even when the moduli are not pairwise coprime.</p>
<p>Suppose, as above, that a solution is needed to the system of congruences:</p>
<dl>
<dd><img class="tex" alt="x \equiv a_i \pmod{n_i} \quad\mathrm{for}\; i = 1, \ldots, k." src="http://upload.wikimedia.org/math/a/5/d/a5dee55ec39dbe7d4d27a3fcb9b7991a.png" /> </dd></dl>
<p>Again, to begin, the product <img class="tex" alt=" N=n_1n_2\ldots n_k" src="http://upload.wikimedia.org/math/e/8/3/e83438320fb0d3da79d9ae260e2bf722.png" /> is defined. Then a solution <em>x</em> can be found as follows.</p>
<p>For each <em>i</em>&nbsp;the integers <span class="texhtml"><em>n</em><sub><em>i</em></sub></span> and <span class="texhtml"><em>N</em> / <em>n</em><sub><em>i</em></sub></span> are coprime. Using the <a title="Extended Euclidean algorithm" href="http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm">extended Euclidean algorithm</a> we can therefore find integers <span class="texhtml"><em>r</em><sub><em>i</em></sub></span> and <span class="texhtml"><em>s</em><sub><em>i</em></sub></span> such that <span class="texhtml"><em>r</em><sub><em>i</em></sub><em>n</em><sub><em>i</em></sub> + <em>s</em><sub><em>i</em></sub><em>N</em> / <em>n</em><sub><em>i</em></sub> = 1</span>. Then, choosing the label <span class="texhtml"><em>e</em><sub><em>i</em></sub> = <em>s</em><sub><em>i</em></sub><em>N</em> / <em>n</em><sub><em>i</em></sub></span>, the above expression becomes:</p>
<dl>
<dd><img class="tex" alt=" r_i n_i + e_i = 1 \,\! " src="http://upload.wikimedia.org/math/e/d/8/ed849a11aa3063572b33504a7891fce0.png" /> </dd></dl>
<p>Consider <span class="texhtml"><em>e</em><sub><em>i</em></sub></span>. The above equation guarantees that its remainder, when divided by <span class="texhtml"><em>n</em><sub><em>i</em></sub></span>, must be 1. On the other hand, since it is formed as <span class="texhtml"><em>s</em><sub><em>i</em></sub><em>N</em> / <em>n</em><sub><em>i</em></sub></span>, the presence of <span class="texhtml"><em>N</em></span> guarantees that it's evenly divisible by any <span class="texhtml"><em>n</em><sub><em>j</em></sub></span> so long as <img class="tex" alt="j\ne i" src="http://upload.wikimedia.org/math/c/c/f/ccf5f455f5de788b5d5eeaf339059de1.png" />.</p>
<dl>
<dd><img class="tex" alt="e_i \equiv 1 \pmod{n_i} \quad \mathrm{and} \quad e_i \equiv 0 \pmod{n_j} \quad \mathrm{for} ~ i \ne j" src="http://upload.wikimedia.org/math/9/f/7/9f75407c9bf00ff00be37507d73ab745.png" /> </dd></dl>
<p>Because of this, combined with the multiplication rules allowed in congruences, one solution to the system of simultaneous congruences is:</p>
<dl>
<dd><img class="tex" alt=" x = \sum_{i=1}^k a_i e_i.\! " src="http://upload.wikimedia.org/math/d/1/7/d170bf63489dc824fe92feb100928965.png" /> </dd></dl>
<p>For example, consider the problem of finding an integer <em>x</em> such that</p>
<dl>
<dd><img class="tex" alt="x \equiv 2 \pmod{3}, \,\! " src="http://upload.wikimedia.org/math/1/3/9/139ebbb04538bf66cc09ae13cd719ab8.png" />
<dd><img class="tex" alt="x \equiv 3 \pmod{4}, \,\! " src="http://upload.wikimedia.org/math/b/3/c/b3c58532d18b8c1270eb4cdcb4e847c5.png" />
<dd><img class="tex" alt="x \equiv 1 \pmod{5}. \,\! " src="http://upload.wikimedia.org/math/9/9/4/994b801a574b0426e93ff5314c613247.png" /> </dd></dl>
<p>Using the <a title="Extended Euclidean algorithm" href="http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm">extended Euclidean algorithm</a> for 3 and 4&#215;5 = 20, we find (&#8722;13) &#215; 3 + 2 &#215; 20 = 1, i.e. <em>e</em><sub>1</sub> = 40. Using the Euclidean algorithm for 4 and 3&#215;5 = 15, we get (&#8722;11) &#215; 4 + 3 &#215; 15 = 1. Hence, <em>e</em><sub>2</sub> = 45. Finally, using the Euclidean algorithm for 5 and 3&#215;4 = 12, we get 5 &#215; 5 + (&#8722;2) &#215; 12 = 1, meaning <em>e</em><sub>3</sub> = &#8722;24. A solution <em>x</em> is therefore 2 &#215; 40 + 3 &#215; 45 + 1 &#215; (&#8722;24) = 191. All other solutions are congruent to 191 modulo 60, (3 &#215; 4 &#215; 5 = 60) which means that they are all congruent to 11 modulo 60.</p>
<p>NOTE: There are multiple implementations of the <a title="Extended Euclidean algorithm" href="http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm">extended Euclidean algorithm</a> which will yield different sets of <span class="texhtml"><em>e</em><sub>1</sub></span>, <span class="texhtml"><em>e</em><sub>2</sub></span>, and <span class="texhtml"><em>e</em><sub>3</sub></span>. These sets however will produce the same solution i.e. 11 modulo 60.</p>
<br />
<span style="color: red">extended Enclidean algorithm</span><br />
<h2><span class="editsection">[<a title="Edit section: Informal formulation of the algorithm" href="http://en.wikipedia.org/w/index.php?title=Extended_Euclidean_algorithm&amp;action=edit&amp;section=1">edit</a>]</span> <span class="mw-headline">Informal formulation of the algorithm</span></h2>
<table class="wikitable" style="position: relative" align="left">
    <tbody>
        <tr>
            <th>Dividend</th>
            <th>Divisor</th>
            <th>Quotient</th>
            <th>Remainder</th>
        </tr>
        <tr>
            <td>120</td>
            <td>23</td>
            <td>5</td>
            <td>5</td>
        </tr>
        <tr>
            <td>23</td>
            <td>5</td>
            <td>4</td>
            <td>3</td>
        </tr>
        <tr>
            <td>5</td>
            <td>3</td>
            <td>1</td>
            <td>2</td>
        </tr>
        <tr>
            <td>3</td>
            <td>2</td>
            <td>1</td>
            <td>1</td>
        </tr>
        <tr>
            <td>2</td>
            <td>1</td>
            <td>2</td>
            <td>0</td>
        </tr>
    </tbody>
</table>
<p>It is assumed that the reader is already familiar with <a class="mw-redirect" title="Euclid's algorithm" href="http://en.wikipedia.org/wiki/Euclid%27s_algorithm">Euclid's algorithm</a>.</p>
<p>To illustrate the extension of the Euclid's algorithm, consider the computation of gcd(120,&nbsp;23), which is shown on the table on the left. Notice that the quotient in each division is recorded as well alongside the remainder.</p>
<p>In this case, the remainder in the fourth line (which is equal to 1) indicates that the gcd is 1; that is, 120 and 23 are <a title="Coprime" href="http://en.wikipedia.org/wiki/Coprime">coprime</a> (also called relatively prime). For the sake of simplicity, the example chosen is a coprime pair; but the more general case of gcd other than 1 also works similarly.</p>
<p>There are two methods to proceed, both using the <a title="Division algorithm" href="http://en.wikipedia.org/wiki/Division_algorithm">division algorithm</a>, which will be discussed separately.</p>
<p><a id="The_iterative_method" name="The_iterative_method"></a></p>
<h3><span class="editsection">[<a title="Edit section: The iterative method" href="http://en.wikipedia.org/w/index.php?title=Extended_Euclidean_algorithm&amp;action=edit&amp;section=2">edit</a>]</span> <span class="mw-headline">The iterative method</span></h3>
<p>This method computes expressions of the form <span class="texhtml"><em>r</em><sub><em>i</em></sub> = <em>a</em><em>x</em><sub><em>i</em></sub> + <em>b</em><em>y</em><sub><em>i</em></sub></span> for the remainder in each step <span class="texhtml"><em>i</em></span> of the Euclidean algorithm. Each <a title="Modulo operation" href="http://en.wikipedia.org/wiki/Modulo_operation">modulus</a> can be written in terms of the previous two remainders and their whole quotient as follows:</p>
<dl>
<dd><span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span></dd></dl>
<p>By substitution, this gives:</p>
<dl>
<dd><span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>
<dd><span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span></dd></dl>
<p>The first two values are the initial arguments to the algorithm:</p>
<dl>
<dd><span class="texhtml"><em>r</em><sub>1</sub> = <em>a</em> = <em>a</em>(1) + <em>b</em>(0)</span>
<dd><span class="texhtml"><em>r</em><sub>2</sub> = <em>b</em> = <em>a</em>(0) + <em>b</em>(1)</span> </dd></dl>
<p>The expression for the last non-zero remainder gives the desired results since this method computes every remainder in terms of <em>a</em> and <em>b</em>, as desired.</p>
<p><strong>Example:</strong> Compute the GCD of 120 and 23.</p>
<p>The computation proceeds as follows:</p>
<table class="wikitable">
    <tbody>
        <tr>
            <th>Step</th>
            <th>Quotient</th>
            <th>Remainder</th>
            <th>Substitute</th>
            <th>Combine terms</th>
        </tr>
        <tr>
            <td>1</td>
            <td></td>
            <td>120</td>
            <td></td>
            <td>120 = 120 * 1 + 23 * 0</td>
        </tr>
        <tr>
            <td>2</td>
            <td></td>
            <td>23</td>
            <td></td>
            <td>23 = 120 * 0 + 23 * 1</td>
        </tr>
        <tr>
            <td>3</td>
            <td>5</td>
            <td>5 = 120 - 23 * 5</td>
            <td>5 = (120 * 1 + 23 * 0) - (120 * 0 + 23 * 1) * 5</td>
            <td>5 = 120 * 1 + 23 * -5</td>
        </tr>
        <tr>
            <td>4</td>
            <td>4</td>
            <td>3 = 23 - 5 * 4</td>
            <td>3 = (120 * 0 + 23 * 1) - (120 * 1 + 23 * -5) * 4</td>
            <td>3 = 120 * -4 + 23 * 21</td>
        </tr>
        <tr>
            <td>5</td>
            <td>1</td>
            <td>2 = 5 - 3 * 1</td>
            <td>2 = (120 * 1 + 23 * -5) - (120 * -4 + 23 * 21) * 1</td>
            <td>2 = 120 * 5 + 23 * -26</td>
        </tr>
        <tr>
            <td>6</td>
            <td>1</td>
            <td>1 = 3 - 2 * 1</td>
            <td>1 = (120 * -4 + 23 * 21) - (120 * 5 + 23 * -26) * 1</td>
            <td>1 = 120 * -9 + 23 * 47</td>
        </tr>
        <tr>
            <td>7</td>
            <td>2</td>
            <td>0</td>
            <td align="center" colspan="3"><em>End of algorithm</em></td>
        </tr>
    </tbody>
</table>
<p>The last line reads 1&nbsp;=&nbsp;&#8722;9&#215;120&nbsp;+&nbsp;47&#215;23, which is the required solution: <em>x</em>&nbsp;=&nbsp;&#8722;9 and <em>y</em>&nbsp;=&nbsp;47.</p>
<p>This also means that &#8722;9 is the <a title="Multiplicative inverse" href="http://en.wikipedia.org/wiki/Multiplicative_inverse">multiplicative inverse</a> of 120 modulo 23, and that 47 is the multiplicative inverse of 23 modulo 120.</p>
<dl>
<dd>&#8722;9 &#215; 120 &#8801; 1 <strong>mod</strong> 23 and also 47 &#215; 23 &#8801; 1 <strong>mod</strong> 120. </dd></dl>
<p><a id="The_recursive_method" name="The_recursive_method"></a></p>
<h3><span class="editsection">[<a title="Edit section: The recursive method" href="http://en.wikipedia.org/w/index.php?title=Extended_Euclidean_algorithm&amp;action=edit&amp;section=3">edit</a>]</span> <span class="mw-headline">The recursive method</span></h3>
<p>This method attempts to solve the original equation directly, by reducing the dividend and divisor gradually, from the first line to the last line, which can then be substituted with trivial value and work backward to obtain the solution.</p>
<p>Consider the original equation:</p>
<table class="wikitable">
    <tbody>
        <tr>
            <td>120</td>
            <td>x</td>
            <td>+</td>
            <td>23</td>
            <td>y</td>
            <td>=</td>
            <td>1</td>
        </tr>
        <tr>
            <td>(5&#215;23+5)</td>
            <td>x</td>
            <td>+</td>
            <td>23</td>
            <td>y</td>
            <td>=</td>
            <td>1</td>
        </tr>
        <tr>
            <td>23</td>
            <td>(5x+y)</td>
            <td>+</td>
            <td>5</td>
            <td>x</td>
            <td>=</td>
            <td>1</td>
        </tr>
        <tr>
            <td align="center" colspan="7">...</td>
        </tr>
        <tr>
            <td>1</td>
            <td>a</td>
            <td>+</td>
            <td>0</td>
            <td>b</td>
            <td>=</td>
            <td>1</td>
        </tr>
    </tbody>
</table>
<p>Notice that the equation remains unchanged after decomposing the original dividend in terms of the divisor plus a remainder, and then regrouping terms. If we have a solution to the equation in the second line, then we can work backward to find x and y as required. Although we don't have the solution yet to the second line, notice how the magnitude of the terms decreased (120 and 23 to 23 and 5). Hence, if we keep applying this, eventually we'll reach the last line, which obviously has (1,0) as a trivial solution. Then we can work backward and gradually find out x and y.</p>
<table class="wikitable">
    <tbody>
        <tr>
            <th>Dividend</th>
            <th>=</th>
            <th>Quotient</th>
            <th>x</th>
            <th>Divisor</th>
            <th>+</th>
            <th>Remainder</th>
        </tr>
        <tr>
            <td>120</td>
            <td>=</td>
            <td>5</td>
            <td>x</td>
            <td>23</td>
            <td>+</td>
            <td>5</td>
        </tr>
        <tr>
            <td>23</td>
            <td>=</td>
            <td>4</td>
            <td>x</td>
            <td>5</td>
            <td>+</td>
            <td>3</td>
        </tr>
        <tr>
            <td align="center" colspan="7">...</td>
        </tr>
    </tbody>
</table>
<p>For the purpose of explaining this method, the full working will not be shown. Instead some of the repeating steps will be described to demonstrate the principle behind this method.</p>
<p>Start by rewriting each line from the first table with division algorithm, focusing on the dividend this time (because we'll be substituting the dividend).</p>
<table class="wikitable" style="position: relative" align="left">
    <tbody>
        <tr>
            <td>120</td>
            <td>x<sub>0</sub></td>
            <td>+</td>
            <td>23</td>
            <td>y<sub>0</sub></td>
            <td>=</td>
            <td>1</td>
        </tr>
        <tr>
            <td>(5&#215;23+5)</td>
            <td>x<sub>0</sub></td>
            <td>+</td>
            <td>23</td>
            <td>y<sub>0</sub></td>
            <td>=</td>
            <td>1</td>
        </tr>
        <tr>
            <td>23</td>
            <td>(5x<sub>0</sub>+y<sub>0</sub>)</td>
            <td>+</td>
            <td>5</td>
            <td>x<sub>0</sub></td>
            <td>=</td>
            <td>1</td>
        </tr>
        <tr>
            <td>23</td>
            <td>x<sub>1</sub></td>
            <td>+</td>
            <td>5</td>
            <td>y<sub>1</sub></td>
            <td>=</td>
            <td>1</td>
        </tr>
        <tr>
            <td>(4&#215;5+3)</td>
            <td>x<sub>1</sub></td>
            <td>+</td>
            <td>5</td>
            <td>y<sub>1</sub></td>
            <td>=</td>
            <td>1</td>
        </tr>
        <tr>
            <td>5</td>
            <td>(4x<sub>1</sub>+y<sub>1</sub>)</td>
            <td>+</td>
            <td>3</td>
            <td>x<sub>1</sub></td>
            <td>=</td>
            <td>1</td>
        </tr>
        <tr>
            <td>5</td>
            <td>x<sub>2</sub></td>
            <td>+</td>
            <td>3</td>
            <td>y<sub>2</sub></td>
            <td>=</td>
            <td>1</td>
        </tr>
    </tbody>
</table>
<table style="position: relative" align="left">
    <tbody>
        <tr>
            <td>
            <ol>
                <li>Assume that we were given x<sub>2</sub>=2 and y<sub>2</sub>=-3 already, which is indeed a valid solution.
                <li>x<sub>1</sub>=y<sub>2</sub>=-3
                <li>Solve 4x<sub>1</sub>+y<sub>1</sub>=x<sub>2</sub> by substituting x<sub>1</sub>=-3, which gives y<sub>1</sub>=2-4(-3)=14
                <li>x<sub>0</sub>=y<sub>1</sub>=14
                <li>Solve 5x<sub>0</sub>+y<sub>0</sub>=x<sub>1</sub> by substituting x<sub>0</sub>=14, so y<sub>0</sub>=-3-5(14)=-73 </li>
            </ol>
            </td>
        </tr>
    </tbody>
</table>
<p><br clear="all" />
</p>
<p><a id="The_table_method" name="The_table_method"></a></p>
<h3><span class="editsection">[<a title="Edit section: The table method" href="http://en.wikipedia.org/w/index.php?title=Extended_Euclidean_algorithm&amp;action=edit&amp;section=4">edit</a>]</span> <span class="mw-headline">The table method</span></h3>
<p>The table method is probably the simplest method to carry out with a pencil and paper. It is similar to the recursive method, although it does not directly require algebra to use and only requires working in one direction. The main idea is to think of the equation chain <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>as a sequence of divisors <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>. In the running example we have the sequence 120, 23, 5, 3, 2, 1. Any element in this chain can be written as a linear combination of the original <span class="texhtml"><em>x</em></span> and <span class="texhtml"><em>y</em></span>, most notably, the last element, <span class="texhtml">gcd(<em>x</em>,<em>y</em>)</span>, can be written in this way. The table method involves keeping a table of each divisor, written as a linear combination. The algorithm starts with the table as follows:</p>
<table class="wikitable" style="position: relative" align="center">
    <tbody>
        <tr>
            <td>a</td>
            <td>b</td>
            <td>d</td>
        </tr>
        <tr>
            <td>1</td>
            <td>0</td>
            <td>120</td>
        </tr>
        <tr>
            <td>0</td>
            <td>1</td>
            <td>23</td>
        </tr>
    </tbody>
</table>
<p>The elements in the <span class="texhtml"><em>d</em></span> column of the table will be the divisors in the sequence. Each <span class="texhtml"><em>d</em><sub><em>i</em></sub></span> can be represented as the linear combination <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>. The <span class="texhtml"><em>a</em></span> and <span class="texhtml"><em>b</em></span> values are obvious for the first two rows of the table, which represent <span class="texhtml"><em>x</em></span> and <span class="texhtml"><em>y</em></span> themselves. To compute <span class="texhtml"><em>d</em><sub><em>i</em></sub></span> for any <span class="texhtml"><em>i</em> &gt; 2</span>, notice that <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>. Suppose <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>. Then it must be that <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>and <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>. This is easy to verify algebraically with a simple substitution.</p>
<p>Actually carrying out the table method though is simpler than the above equations would indicate. To find the third row of the table in the example, just notice that 120 divided by 23 goes 5 times plus a remainder. This gives us k, the multiplying factor for this row. Now, each value in the table is the value two rows above it, minus k times the value immediately above it. This correctly leads to <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>, <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>, and <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>. After repeating this method to find each line of the table (note that the remainder written in the table and the multiplying factor are two different numbers!), the final values for <span class="texhtml"><em>a</em></span> and <span class="texhtml"><em>b</em></span> will solve <span class="tex" style="display: inline-block; font-size: 0px; border-left-color: black; background-image: none; border-bottom-color: black; vertical-align: middle; border-top-color: black; border-right-color: black"></span>:</p>
<table class="wikitable" style="position: relative" align="center">
    <tbody>
        <tr>
            <td>a</td>
            <td>b</td>
            <td>d</td>
        </tr>
        <tr>
            <td>1</td>
            <td>0</td>
            <td>120</td>
        </tr>
        <tr>
            <td>0</td>
            <td>1</td>
            <td>23</td>
        </tr>
        <tr>
            <td>1</td>
            <td>-5</td>
            <td>5</td>
        </tr>
        <tr>
            <td>-4</td>
            <td>21</td>
            <td>3</td>
        </tr>
        <tr>
            <td>5</td>
            <td>-26</td>
            <td>2</td>
        </tr>
        <tr>
            <td>-9</td>
            <td>47</td>
            <td>1</td>
        </tr>
    </tbody>
</table>
<p>This method is simple, requiring only the repeated application of one rule, and leaves the answer in the final row of the table with no backtracking. Note also that if you end up with a negative number as the answer for the factor of, in this case <em>b</em>, you will then need to add the modulus in order to make it work as a modular inverse (instead of just taking the absolute value of <em>b</em>). I.e. if it returns a negative number, don't just flip the sign, but add in the other number to make it work. Otherwise it will give you the modular inverse yielding negative one.</p>
<br />
<img src ="http://www.blogjava.net/xan/aggbug/231280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-09-26 13:19 <a href="http://www.blogjava.net/xan/archive/2008/09/26/231280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]LCS</title><link>http://www.blogjava.net/xan/archive/2008/06/16/208331.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Mon, 16 Jun 2008 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/06/16/208331.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/208331.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/06/16/208331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/208331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/208331.html</trackback:ping><description><![CDATA[<h2>最长公共子序列问题LCS</h2>
<h3>参考解答</h3>
<p>动态规划算法可有效地解此问题。下面我们按照动态规划算法设计的各个步骤来设计一个解此问题的有效算法。</p>
<h4>1.最长公共子序列的结构</h4>
<p>解最长公共子序列问题时最容易想到的算法是穷举搜索法，即对X的每一个子序列，检查它是否也是Y的子序列，从而确定它是否为X和Y的公共子序列，并
且在检查过程中选出最长的公共子序列。X的所有子序列都检查过后即可求出X和Y的最长公共子序列。X的一个子序列相应于下标序列{1, 2, &#8230;,
m}的一个子序列，因此，X共有2<sup>m</sup>个不同子序列，从而穷举搜索法需要指数时间。</p>
<p>事实上，最长公共子序列问题也有最优子结构性质，因为我们有如下定理：</p>
<p><strong>定理: </strong>LCS的最优子结构性质</p>
<p>设序列X=&lt;x<sub>1</sub>, x<sub>2</sub>, &#8230;, x<sub>m</sub>&gt;和Y=&lt;y<sub>1</sub>, y<sub>2</sub>, &#8230;, y<sub>n</sub>&gt;的一个最长公共子序列Z=&lt;z<sub>1</sub>, z<sub>2</sub>, &#8230;, z<sub>k</sub>&gt;，则：</p>
<blockquote>
<ol>
    <li>若x<sub>m</sub>=y<sub>n</sub>，则z<sub>k</sub>=x<sub>m</sub>=y<sub>n</sub>且Z<sub>k-1</sub>是X<sub>m-1</sub>和Y<sub>n-1</sub>的最长公共子序列；
    </li>
    <li>若x<sub>m</sub>&#8800;y<sub>n</sub>且z<sub>k</sub>&#8800;x<sub>m ，</sub>则Z是X<sub>m-1</sub>和Y的最长公共子序列；
    </li>
    <li>若x<sub>m</sub>&#8800;y<sub>n</sub>且z<sub>k</sub>&#8800;y<sub>n</sub> ，则Z是X和Y<sub>n-1</sub>的最长公共子序列。 </li>
</ol>
</blockquote>
<p>其中X<sub>m-1</sub>=&lt;x<sub>1</sub>, x<sub>2</sub>, &#8230;, x<sub>m-1</sub>&gt;，Y<sub>n-1</sub>=&lt;y<sub>1</sub>, y<sub>2</sub>, &#8230;, y<sub>n-1</sub>&gt;，Z<sub>k-1</sub>=&lt;z<sub>1</sub>, z<sub>2</sub>, &#8230;, z<sub>k-1</sub>&gt;。</p>
<p><strong>证明</strong></p>
<ol>
    <li>用反证法。若z<sub>k</sub>&#8800;x<sub>m</sub>，则&lt;z<sub>1</sub>, z<sub>2</sub>, &#8230;, z<sub>k </sub>,x<sub>m </sub>&gt;是X和Y的长度为k十1的公共子序列。这与Z是X和Y的一个最长公共子序列矛盾。因此，必有z<sub>k</sub>=x<sub>m</sub>=y<sub>n</sub>。由此可知Z<sub>k-1</sub>是X<sub>m-1</sub>和Y<sub>n-1</sub>的一个长度为k-1的公共子序列。若X<sub>m-1</sub>和Y<sub>n-1</sub>有一个长度大于k-1的公共子序列W，则将x<sub>m</sub>加在其尾部将产生X和Y的一个长度大于k的公共子序列。此为矛盾。故Z<sub>k-1</sub>是X<sub>m-1</sub>和Y<sub>n-1</sub>的一个最长公共子序列。
    </li>
    <li>由于z<sub>k</sub>&#8800;x<sub>m</sub>，Z是X<sub>m-1</sub>和Y的一个公共子序列。若X<sub>m-1</sub>和Y有一个长度大于k的公共子序列W，则W也是X和Y的一个长度大于k的公共子序列。这与Z是X和Y的一个最长公共子序列矛盾。由此即知Z是X<sub>m-1</sub>和Y的一个最长公共子序列。
    </li>
    <li>与 2.类似。 </li>
</ol>
<p>这个定理告诉我们，两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列。因此，最长公共子序列问题具有<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter3.htm#optimality">最优子结构性质</a>。</p>
<h4>2.子问题的递归结构</h4>
<p>由最长公共子序列问题的最优子结构性质可知，要找出X=&lt;x<sub>1</sub>, x<sub>2</sub>, &#8230;, x<sub>m</sub>&gt;和Y=&lt;y<sub>1</sub>, y<sub>2</sub>, &#8230;, y<sub>n</sub>&gt;的最长公共子序列，可按以下方式递归地进行：当x<sub>m</sub>=y<sub>n</sub>时，找出X<sub>m-1</sub>和Y<sub>n-1</sub>的最长公共子序列，然后在其尾部加上x<sub>m</sub>(=y<sub>n</sub>)即可得X和Y的一个最长公共子序列。当x<sub>m</sub>&#8800;y<sub>n</sub>时，必须解两个子问题，即找出X<sub>m-1</sub>和Y的一个最长公共子序列及X和Y<sub>n-1</sub>的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。</p>
<p>由此递归结构容易看到最长公共子序列问题具有<a href="http://algorithm.myrice.com/algorithm/technique/dynamic_programming/chapter3.htm#repeate">子问题重叠性质</a>。例如，在计算X和Y的最长公共子序列时，可能要计算出X和Y<sub>n-1</sub>及X<sub>m-1</sub>和Y的最长公共子序列。而这两个子问题都包含一个公共子问题，即计算X<sub>m-1</sub>和Y<sub>n-1</sub>的最长公共子序列。</p>
<p>与矩阵连乘积最优计算次序问题类似，我们来建立子问题的最优值的递归关系。用c[i,j]记录序列X<sub>i</sub>和Y<sub>j</sub>的最长公共子序列的长度。其中X<sub>i</sub>=&lt;x<sub>1</sub>, x<sub>2</sub>, &#8230;, x<sub>i</sub>&gt;，Y<sub>j</sub>=&lt;y<sub>1</sub>, y<sub>2</sub>, &#8230;, y<sub>j</sub>&gt;。当i=0或j=0时，空序列是X<sub>i</sub>和Y<sub>j</sub>的最长公共子序列，故c[i,j]=0。其他情况下，由<a href="http://algorithm.myrice.com/problems/problem_set/LCS/solution.htm#th">定理</a>可建立递归关系如下：</p>
<p><a href="http://www.jjstudent.cn/oi/UploadFiles_3305/200712/20071217230131610.jpg" target="_blank"><img onmousewheel="return bbimg(this)" src="http://www.jjstudent.cn/oi/UploadFiles_3305/200712/20071217230131610.jpg" onload="resizepic(this)" alt="" border="0" height="99" width="517" />&nbsp;</a></p>
<h4>3.计算最优值</h4>
<p>直接利用(2.2)式容易写出一个计算c[i,j]的递归算法，但其计算时间是随输入长度指数增长的。由于在所考虑的子问题空间中，总共只有<em>&#952;</em>(<em>m*n</em>)个不同的子问题，因此，用动态规划算法自底向上地计算最优值能提高算法的效率。</p>
<p>计算最长公共子序列长度的动态规划算法LCS_LENGTH(X,Y)以序列X=&lt;x<sub>1</sub>, x<sub>2</sub>, &#8230;, x<sub>m</sub>&gt;和Y=&lt;y<sub>1</sub>, y<sub>2</sub>, &#8230;, y<sub>n</sub>&gt;作为输入。输出两个数组c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]存储X<sub>i</sub>与Y<sub>j</sub>的最长公共子序列的长度，b[i,j]记录指示c[i,j]的值是由哪一个子问题的解达到的，这在构造最长公共子序列时要用到。最后，X和Y的最长公共子序列的长度记录于c[m,n]中。</p>
<pre>Procedure LCS_LENGTH(X,Y);<br />
begin<br />
m:=length[X];<br />
n:=length[Y];<br />
for i:=1 to m do c[i,j]:=0;<br />
for j:=1 to n do c[0,j]:=0;<br />
for i:=1 to m do<br />
for j:=1 to n do<br />
if x[i]=y[j] then<br />
begin<br />
c[i,j]:=c[i-1,j-1]+1;<br />
b[i,j]:="↖";<br />
end<br />
else if c[i-1,j]&#8805;c[i,j-1] then<br />
begin<br />
c[i,j]:=c[i-1,j];<br />
b[i,j]:="&#8593;";<br />
end<br />
else<br />
begin<br />
c[i,j]:=c[i,j-1];<br />
b[i,j]:="&#8592;"<br />
end;<br />
return(c,b);<br />
end;</pre>
<p>由于每个数组单元的计算耗费<em>&#927;</em>(1)时间，算法LCS_LENGTH耗时<em>&#927;</em>(<em>mn</em>)。</p>
<h4>4.构造最长公共子序列</h4>
<p>由算法LCS_LENGTH计算得到的数组b可用于快速构造序列X=&lt;x<sub>1</sub>, x<sub>2</sub>, &#8230;, x<sub>m</sub>&gt;和Y=&lt;y<sub>1</sub>, y<sub>2</sub>, &#8230;, y<sub>n</sub>&gt;的最长公共子序列。首先从b[m,n]开始，沿着其中的箭头所指的方向在数组b中搜索。当b[i,j]中遇到"↖"时，表示X<sub>i</sub>与Y<sub>j</sub>的最长公共子序列是由X<sub>i-1</sub>与Y<sub>j-1</sub>的最长公共子序列在尾部加上x<sub>i</sub>得到的子序列；当b[i,j]中遇到"&#8593;"时，表示X<sub>i</sub>与Y<sub>j</sub>的最长公共子序列和X<sub>i-1</sub>与Y<sub>j</sub>的最长公共子序列相同；当b[i,j]中遇到"&#8592;"时，表示X<sub>i</sub>与Y<sub>j</sub>的最长公共子序列和X<sub>i</sub>与Y<sub>j-1</sub>的最长公共子序列相同。</p>
<p>下面的算法LCS(b,X,i,j)实现根据b的内容打印出X<sub>i</sub>与Y<sub>j</sub>的最长公共子序列。通过算法的调用LCS(b,X,length[X],length[Y])，便可打印出序列X和Y的最长公共子序列。</p>
<pre>Procedure LCS(b,X,i,j);<br />
begin<br />
if i=0 or j=0 then return;<br />
if b[i,j]="↖" then<br />
begin<br />
LCS(b,X,i-1,j-1);<br />
print(x[i]); {打印x[i]}<br />
end<br />
else if b[i,j]="&#8593;" then LCS(b,X,i-1,j) <br />
else LCS(b,X,i,j-1);<br />
end; </pre>
<p>在算法LCS中，每一次的递归调用使i或j减1，因此算法的计算时间为<em>O</em>(m+n)。</p>
<p>例如，设所给的两个序列为X=&lt;A，B，C，B，D，A，B&gt;和Y=&lt;B，D，C，A，B，A&gt;。由算法LCS_LENGTH和LCS计算出的结果如图2所示。</p>
<div align="center">
<center>
<table border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td align="center" valign="middle" width="30"><br />
            </td>
            <td align="center" valign="middle">j</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">3</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">4</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">5</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">6</td>
            <td align="center" valign="middle"><br />
            </td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30">i</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">y<sub>j</sub></td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">B</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">D</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">C</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">A</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">B</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">A</td>
            <td align="center" valign="middle"><br />
            </td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">┌</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">┐</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30">0</td>
            <td align="center" valign="middle">x<sub>i</sub></td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30">1</td>
            <td align="center" valign="middle">A</td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle">&#8592;</td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30">2</td>
            <td align="center" valign="middle">B</td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle">&#8592;</td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle">&#8592;</td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle">&#8592;</td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30">3</td>
            <td align="center" valign="middle">C</td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle">&#8592;</td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30">4</td>
            <td align="center" valign="middle">B</td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">3</td>
            <td align="center" valign="middle">&#8592;</td>
            <td align="center" valign="middle">3</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30">5</td>
            <td align="center" valign="middle">D</td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">3</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">3</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30">6</td>
            <td align="center" valign="middle">A</td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">3</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">3</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">4</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">↖</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">&#8593;</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30">7</td>
            <td align="center" valign="middle">B</td>
            <td align="center" valign="middle">│</td>
            <td align="center" valign="middle">0</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">1</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">2</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">3</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">4</td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">5</td>
            <td align="center" valign="middle">│</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="30"><br />
            </td>
            <td align="center" valign="middle"><br />
            </td>
            <td align="center" valign="middle">└</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">─</td>
            <td align="center" valign="middle">┘</td>
        </tr>
    </tbody>
</table>
</center></div>
<p align="center"><font size="2">图2&nbsp;&nbsp; 算法LCS的计算结果</font></p>
<h4>5.算法的改进</h4>
<p>对于一个具体问题，按照一般的算法设计策略设计出的算法，往往在算法的时间和空间需求上还可以改进。这种改进，通常是利用具体问题的一些特殊性。</p>
<p>例如，在算法LCS_LENGTH和LCS中，可进一步将数组b省去。事实上，数组元素c[i,j]的值仅由c[i-1,j-1]，c[i-1,
j]和c[i,j-1]三个值之一确定，而数组元素b[i,j]也只是用来指示c[i,j]究竟由哪个值确定。因此，在算法LCS中，我们可以不借助于数
组b而借助于数组c本身临时判断c[i,j]的值是由c[i-1,j-1]，c[i-1,j]和c[i,j-1]中哪一个数值元素所确定，代价是<em>&#927;</em>(1)时间。既然b对于算法LCS不是必要的，那么算法LCS_LENGTH便不必保存它。这一来，可节省<em>&#952;</em>(mn)的空间，而LCS_LENGTH和LCS所需要的时间分别仍然是<em>&#927;</em>(mn)和<em>&#927;</em>(m+n)。不过，由于数组c仍需要<em>&#927;</em>(mn)的空间，因此这里所作的改进，只是在空间复杂性的常数因子上的改进。</p>
<p>另外，如果只需要计算最长公共子序列的长度，则算法的空间需求还可大大减少。事实上，在计算c[i,j]时，只用到数组c的第i行和第i-1行。因此，只要用2行的数组空间就可以计算出最长公共子序列的长度。更进一步的分析还可将空间需求减至min(m, n)。</p>
 <img src ="http://www.blogjava.net/xan/aggbug/208331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-06-16 14:47 <a href="http://www.blogjava.net/xan/archive/2008/06/16/208331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>