﻿<?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-储备站-文章分类-数学&amp;算法&amp;数据结构</title><link>http://www.blogjava.net/calvinlau/category/39837.html</link><description>技术储备，从这里开始</description><language>zh-cn</language><lastBuildDate>Sun, 27 Sep 2009 21:04:12 GMT</lastBuildDate><pubDate>Sun, 27 Sep 2009 21:04:12 GMT</pubDate><ttl>60</ttl><item><title>整数转字符串</title><link>http://www.blogjava.net/calvinlau/articles/296554.html</link><dc:creator>calvinlau</dc:creator><author>calvinlau</author><pubDate>Sat, 26 Sep 2009 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/296554.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/296554.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/296554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/296554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/296554.html</trackback:ping><description><![CDATA[void IntToStr(int a,char* str){<br />
&nbsp;&nbsp;&nbsp; if(a==0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *str='0';<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *(str+1)='\0';<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; char* p = str;<br />
&nbsp;&nbsp;&nbsp; if(a&lt;0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; a=a*(-1);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *p++ = '-';<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; int len = 0;<br />
&nbsp;&nbsp;&nbsp; while(a){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *p++ = a%10+'0';<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; a/=10;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ++len;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; int start = *str=='-'?1:0;<br />
&nbsp;&nbsp;&nbsp; int tmp;<br />
&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;len/2;++i){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tmp = str[start+i];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; str[start+i]=str[len+start-1-i];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; str[len+start-1-i]=tmp;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; str[len+start]='\0';<br />
}<br />
void main(){<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; char* str = new char[12];<br />
&nbsp;&nbsp;&nbsp; //IntToStr(0,str);<br />
&nbsp;&nbsp;&nbsp; IntToStr(-12340,str);<br />
&nbsp;&nbsp;&nbsp; //IntToStr(214748367,str);<br />
&nbsp;&nbsp;&nbsp; printf("%s\n",str);<br />
}<br />
<img src ="http://www.blogjava.net/calvinlau/aggbug/296554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">calvinlau</a> 2009-09-26 15:41 <a href="http://www.blogjava.net/calvinlau/articles/296554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（zz） x&amp;(x-1)表达式的意义</title><link>http://www.blogjava.net/calvinlau/articles/287331.html</link><dc:creator>calvinlau</dc:creator><author>calvinlau</author><pubDate>Sun, 19 Jul 2009 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/287331.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/287331.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/287331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/287331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/287331.html</trackback:ping><description><![CDATA[http://hi.baidu.com/zengzhaonong/blog/item/7fb884509ee30c61853524c2.html<br />
<br />
<strong>x&amp;(x-1)表达式的意义</strong><br />
<br />
<strong>求下面函数的返回值(微软) -- 统计1的个数</strong><br />
-------------------------------------<br />
int func(int x)<br />
{<br />
&nbsp;&nbsp;&nbsp; int countx = 0;<br />
&nbsp;&nbsp;&nbsp; while(x)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; countx++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = x&amp;(x-1);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return countx;<br />
}<br />
<br />
假定x = 9999<br />
10011100001111<br />
答案: 8<br />
<br />
思路: 将x转化为2进制，看含有的1的个数。<br />
注: 每执行一次x = x&amp;(x-1)，会将x用二进制表示时最右边的一个1变为0，因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0。<br />
<br />
<br />
<br />
<br />
<strong>判断一个数(x)是否是2的n次方</strong><br />
-------------------------------------<br />
#include &lt;stdio.h&gt;<br />
<br />
int func(int x)<br />
{<br />
&nbsp;&nbsp;&nbsp; if( (x&amp;(x-1)) == 0 )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br />
&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
}<br />
<br />
int main()<br />
{<br />
&nbsp;&nbsp;&nbsp; int x = 8;<br />
&nbsp;&nbsp;&nbsp; printf("%d\n", func(x));<br />
}<br />
<br />
<br />
注:<br />
(1) 如果一个数是2的n次方，那么这个数用二进制表示时其最高位为1，其余位为0。<br />
<br />
(2) == 优先级高于 &amp;<br />
<img src ="http://www.blogjava.net/calvinlau/aggbug/287331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">calvinlau</a> 2009-07-19 15:27 <a href="http://www.blogjava.net/calvinlau/articles/287331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算整数的二进制表示有多少个1</title><link>http://www.blogjava.net/calvinlau/articles/287327.html</link><dc:creator>calvinlau</dc:creator><author>calvinlau</author><pubDate>Sun, 19 Jul 2009 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/287327.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/287327.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/287327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/287327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/287327.html</trackback:ping><description><![CDATA[<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);"><br />
#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdio.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdlib.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;count_one(unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;data)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;count&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;x&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(x)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;x&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;(x</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;count;<br />
}<br />
<br />
</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;main(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;data[]&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;{</span><span style="color: rgb(0, 0, 0);">13</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">16</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">25</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">31</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">76</span><span style="color: rgb(0, 0, 0);">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;size&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">sizeof</span><span style="color: rgb(0, 0, 0);">(data)</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 255);">sizeof</span><span style="color: rgb(0, 0, 0);">(unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">size;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">%d&nbsp;has&nbsp;%d&nbsp;1s\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,data[i],count_one(data[i]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
}<br />
</span></div>
<img src ="http://www.blogjava.net/calvinlau/aggbug/287327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">calvinlau</a> 2009-07-19 14:38 <a href="http://www.blogjava.net/calvinlau/articles/287327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组循环位移</title><link>http://www.blogjava.net/calvinlau/articles/280414.html</link><dc:creator>calvinlau</dc:creator><author>calvinlau</author><pubDate>Sun, 07 Jun 2009 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/280414.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/280414.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/280414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/280414.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/280414.html</trackback:ping><description><![CDATA[给定有N个元素数组，将之循环移K位，不能使用库函数，不能使用辅助数组，要求时间复杂度为O(N)<br />
<br />
解法1：<br />
思路：<br />
（1） 整个数组倒序<br />
（2）0 - K位倒序<br />
（3）K - (N-1)位倒序<br />
<br />
代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;printArray(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[],</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n){<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">n;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d\t</span><span style="color: #000000;">"</span><span style="color: #000000;">,a[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
}<br />
<br />
</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;reverse(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[],&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;begin,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;end){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(end</span><span style="color: #000000;">-</span><span style="color: #000000;">begin</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">/</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">n;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a[begin</span><span style="color: #000000;">+</span><span style="color: #000000;">i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[begin</span><span style="color: #000000;">+</span><span style="color: #000000;">i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a[end</span><span style="color: #000000;">-</span><span style="color: #000000;">i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[end</span><span style="color: #000000;">-</span><span style="color: #000000;">i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;t;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;shift(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[],&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k){<br />
&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(n</span><span style="color: #000000;">+</span><span style="color: #000000;">k</span><span style="color: #000000;">%</span><span style="color: #000000;">n)</span><span style="color: #000000;">%</span><span style="color: #000000;">n;<br />
&nbsp;&nbsp;&nbsp;&nbsp;reverse(a,</span><span style="color: #000000;">0</span><span style="color: #000000;">,n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;reverse(a,</span><span style="color: #000000;">0</span><span style="color: #000000;">,k);<br />
&nbsp;&nbsp;&nbsp;&nbsp;reverse(a,k,n);<br />
}<br />
<br />
</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;">7</span><span style="color: #000000;">,</span><span style="color: #000000;">8</span><span style="color: #000000;">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(a)</span><span style="color: #000000;">/</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printArray(a,n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">shift(a,n,-1);</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shift(a,n,</span><span style="color: #000000;">4</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printArray(a,</span><span style="color: #000000;">8</span><span style="color: #000000;">);<br />
}</span></div>
<br />
<br />
解法2：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Output(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pBuffer,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nCount)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">pBuffer&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">nCount)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(size_t&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;nCount;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;%d&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;pBuffer[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
}<br />
<br />
</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ShiftN(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pBuffer,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nCount,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nShiftN)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">pBuffer&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">nCount&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">nShiftN)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;nShiftN&nbsp;</span><span style="color: #000000;">%=</span><span style="color: #000000;">&nbsp;nCount;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nIndex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nStart&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nIndex;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nTemp&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pBuffer[nIndex];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(size_t&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;nCount;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nIndex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(nIndex&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;nShiftN)&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;nCount;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBuffer[nIndex]&nbsp;</span><span style="color: #000000;">^=</span><span style="color: #000000;">&nbsp;nTemp&nbsp;</span><span style="color: #000000;">^=</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBuffer[nIndex]&nbsp;</span><span style="color: #000000;">^=</span><span style="color: #000000;">&nbsp;nTemp&nbsp;;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(nIndex&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;nStart)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nStart&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nIndex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nStart;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nTemp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pBuffer[nIndex];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;buffer[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(buffer)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Output(buffer,&nbsp;nCount);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ShiftN(buffer,&nbsp;nCount,&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Output(buffer,&nbsp;nCount);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
}</span></div>
<br />
<img src ="http://www.blogjava.net/calvinlau/aggbug/280414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">calvinlau</a> 2009-06-07 12:00 <a href="http://www.blogjava.net/calvinlau/articles/280414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单链表反转</title><link>http://www.blogjava.net/calvinlau/articles/279908.html</link><dc:creator>calvinlau</dc:creator><author>calvinlau</author><pubDate>Wed, 03 Jun 2009 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/279908.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/279908.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/279908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/279908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/279908.html</trackback:ping><description><![CDATA[相关定义：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> <span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;LNode{<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;e;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; LNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;next;<br />
</span><span style="color: #000000;">};<br />
&nbsp;
</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">typedef&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;LNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;LinkList;</span></div>
<br />
非递归方法：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">//l 是带头结点的单链表<br />
void</span><span style="color: #000000;">&nbsp;ReverseList(LinkList&nbsp;l){<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(l</span><span style="color: #000000;">==</span><span style="color: #000000;">NULL&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; LNode&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">p,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">q,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">r;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; q&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(&nbsp;q&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;NULL){<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;q</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;q;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;r;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; }<br />
&nbsp;
</span><span style="color: #000000;"><br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;<br />
</span><span style="color: #000000;">}</span></div>
<br />
递归方法：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">LNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;ReverseList_Recursive(LNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode,LinkList</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;l){<br />
&nbsp;
</span><span style="color: #000000;"><br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(pNode&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">NULL</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">NULL</span><span style="color: #000000;">)&nbsp;){<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode;&nbsp;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;pNode;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; }<br />
</span><span style="color: #000000;"><br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; LNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ReverseList_Recursive(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next,&nbsp;l);<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; temp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;pNode;<br />
</span><span style="color: #000000;">}</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/calvinlau/aggbug/279908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">calvinlau</a> 2009-06-03 22:47 <a href="http://www.blogjava.net/calvinlau/articles/279908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断数组中的重复元素</title><link>http://www.blogjava.net/calvinlau/articles/279490.html</link><dc:creator>calvinlau</dc:creator><author>calvinlau</author><pubDate>Mon, 01 Jun 2009 17:00:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/279490.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/279490.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/279490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/279490.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/279490.html</trackback:ping><description><![CDATA[一个数组，下标从0到n，元素为从0到n的整数。判断其中是否有重复元素<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Find_Duplicate(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[],</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n){<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;bitmap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">[n];<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;memset(bitmap,</span><span style="color: #000000;">0</span><span style="color: #000000;">,n);<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(a[i]</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">n&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;a[i]</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;bitmap[a[i]]&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitmap[a[i]]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;bitmap;<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Duplicate&nbsp;count:&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,count);<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<img src ="http://www.blogjava.net/calvinlau/aggbug/279490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">calvinlau</a> 2009-06-02 01:00 <a href="http://www.blogjava.net/calvinlau/articles/279490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）数学之美 系列二 -- 谈谈中文分词</title><link>http://www.blogjava.net/calvinlau/articles/278119.html</link><dc:creator>calvinlau</dc:creator><author>calvinlau</author><pubDate>Tue, 26 May 2009 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/278119.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/278119.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/278119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/278119.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/278119.html</trackback:ping><description><![CDATA[<h3><a name="114462952509335533">数学之美 系列二 -- 谈谈中文分词</a></h3>
http://googlechinablog.com/2006/04/blog-post_10.html
<p><span id="time114462952509335533">2006年4月10日 上午 08:10:00</span></p>
发表者: 吴军， Google 研究员 <br />
<br />
谈谈中文分词<br />
----- 统计语言模型在中文处理中的一个应用<br />
<br />
上回我们谈到<a target="_blank" href="http://googlechinablog.com/2006/04/blog-post.html">利用统计语言模型进行语言处理</a>，由于模型是建立在词的基础上的，对于中日韩等语言，首先需要进行分词。例如把句子 &#8220;中国航天官员应邀到美国与太空总署官员开会。&#8221; <br />
<br />
分成一串词：<br />
中国 / 航天 / 官员 / 应邀 / 到 / 美国 / 与 / 太空 / 总署 / 官员 / 开会。<br />
<br />
最容易想到的，也是最简单的分词办法就是查字典。这种方法最早是由北京航天航空大学的梁南元教授提出的。<br />
<br />
用 &#8220;查字典&#8221; 法，其实就是我们把一个句子从左向右扫描一遍，遇到字典里有的词就标识出来，遇到复合词（比如 &#8220;上海大学&#8221;）就找最长的词匹配，遇到不认识的字串就分割成单字词，于是简单的分词就完成了。这种简单的分词方法完全能处理上面例子中的句子。八十年代，<a target="_blank" href="http://www.cs.hit.edu.cn/cn/teacher.jsp?teacher=wangxiaolong">哈工大的王晓龙博士</a>把
它理论化，发展成最少词数的分词理论，即一句话应该分成数量最少的词串。这种方法一个明显的不足是当遇到有二义性
（有双重理解意思）的分割时就无能为力了。比如，对短语 &#8220;发展中国家&#8221;
正确的分割是&#8220;发展-中-国家&#8221;，而从左向右查字典的办法会将它分割成&#8220;发展-中国-家&#8221;，显然是错了。另外，并非所有的最长匹配都一定是正确的。比如&#8220;
上海大学城书店&#8221;的正确分词应该是 &#8220;上海-大学城-书店，&#8221; 而不是 &#8220;上海大学-城-书店&#8221;。<br />
<br />
九十年代以前，海内外不少学者试图用一些文法规则来解决分词的二义性问题，都不是很成功。90年前后，清华大学的郭进博士用统计语言模型成功解决分词二义性问题，将汉语分词的错误率降低了一个数量级。<br />
<br />
利用统计语言模型分词的方法，可以用几个数学公式简单概括如下：<br />
我们假定一个句子S可以有几种分词方法，为了简单起见我们假定有以下三种：<br />
A1, A2, A3, ..., Ak,<br />
B1, B2, B3, ..., Bm<br />
C1, C2, C3, ..., Cn<br />
<br />
其中，A1, A2, B1, B2, C1, C2 等等都是汉语的词。那么最好的一种分词方法应该保证分完词后这个句子出现的概率最大。也就是说如果 A1,A2,..., Ak 是最好的分法，那么 （P 表示概率）：<br />
P (A1, A2, A3, ..., Ak） 〉 P (B1, B2, B3, ..., Bm), 并且<br />
P (A1, A2, A3, ..., Ak） 〉 P(C1, C2, C3, ..., Cn)<br />
因此，只要我们利用上回提到的统计语言模型计算出每种分词后句子出现的概率，并找出其中概率最大的，我们就能够找到最好的分词方法。<br />
<br />
当然，这里面有一个实现的技巧。如果我们穷举所有可能的分词方法并计算出每种可能性下句子的概率，那么计算量是相当大的。因此，我们可以把它看成是一个<a target="_blank" href="http://algorithm.diy.myrice.com/algorithm/technique/dynamic_programming/chapter3.htm">动态规划</a>（Dynamic Programming) 的问题，并利用 &#8220;维特比&#8221;（<a target="_blank" href="http://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/viterbi_algorithm/s2_pg1.html">Viterbi</a>） 算法快速地找到最佳分词。<br />
<br />
在清华大学的郭进博士以后，海内外不少学者利用统计的方法，进一步完善中文分词。其中值得一提的是清华大学孙茂松教授和香港科技大学吴德凯教授的工作。<br />
<br />
需
要指出的是，语言学家对词语的定义不完全相同。比如说
&#8220;北京大学&#8221;，有人认为是一个词，而有人认为该分成两个词。一个折中的解决办法是在分词的同时，找到复合词的嵌套结构。在上面的例子中，如果一句话包含&#8220;
北京大学&#8221;四个字，那么先把它当成一个四字词，然后再进一步找出细分词 &#8220;北京&#8221; 和 &#8220;大学&#8221;。这种方法是最早是郭进在
&#8220;Computational Linguistics&#8221; （《计算机语言学》）杂志上发表的，以后不少系统采用这种方法。<br />
<br />
一般来讲，根
据不同应用，汉语分词的颗粒度大小应该不同。比如，在机器翻译中，颗粒度应该大一些，&#8220;北京大学&#8221;就不能被分成两个词。而在语音识别中，&#8220;北京大学&#8221;一般
是被分成两个词。因此，不同的应用，应该有不同的分词系统。Google 的葛显平博士和朱安博士，专门为搜索设计和实现了自己的分词系统。<br />
<br />
也
许你想不到，中文分词的方法也被应用到英语处理，主要是手写体识别中。因为在识别手写体时，单词之间的空格就不很清楚了。中文分词方法可以帮助判别英语单
词的边界。其实，语言处理的许多数学方法通用的和具体的语言无关。在 Google
内，我们在设计语言处理的算法时，都会考虑它是否能很容易地适用于各种自然语言。这样，我们才能有效地支持上百种语言的搜索。<br />
<br />
对中文分词有兴趣的读者，可以阅读以下文献：<br />
<br />
1. 梁南元 <br />
<a target="_blank" href="http://www.touchwrite.com/demo/LiangNanyuan-JCIP-1987.pdf">书面汉语自动分词系统 </a><br />
http://www.touchwrite.com/demo/LiangNanyuan-JCIP-1987.pdf<br />
<br />
2. 郭进<br />
<a target="_blank" href="http://www.touchwrite.com/demo/GuoJin-JCIP-1993.pdf">统计语言模型和汉语音字转换的一些新结果</a> <br />
http://www.touchwrite.com/demo/GuoJin-JCIP-1993.pdf<br />
<br />
3. 郭进<br />
<a target="_blank" href="http://acl.ldc.upenn.edu/J/J97/J97-4004.pdf">Critical Tokenization and its Properties</a> <br />
http://acl.ldc.upenn.edu/J/J97/J97-4004.pdf<br />
<br />
4. 孙茂松<br />
<a target="_blank" href="http://portal.acm.org/citation.cfm?coll=GUIDE&amp;dl=GUIDE&amp;id=980775">Chinese word segmentation without using lexicon and hand-crafted training data</a><br />
http://portal.acm.org/citation.cfm?coll=GUIDE&amp;dl=GUIDE&amp;id=980775

<img src ="http://www.blogjava.net/calvinlau/aggbug/278119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">calvinlau</a> 2009-05-27 00:04 <a href="http://www.blogjava.net/calvinlau/articles/278119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）数学之美 系列一 -- 统计语言模型</title><link>http://www.blogjava.net/calvinlau/articles/278118.html</link><dc:creator>calvinlau</dc:creator><author>calvinlau</author><pubDate>Tue, 26 May 2009 16:03:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/278118.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/278118.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/278118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/278118.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/278118.html</trackback:ping><description><![CDATA[<h3><a name="114399197227125143">数学之美 系列一 -- 统计语言模型</a></h3>
<p>http://googlechinablog.com/2006/04/blog-post.html</p>
<p><br />
</p>
<p><span id="time114399197227125143">2006年4月3日 上午 08:15:00</span></p>
<span style="font-style: italic;">从本周开始，我们将定期刊登 Google 科学家吴军写的《数学之美》系列文章，介绍数学在信息检索和自然语言处理中的主导作用和奇妙应用。</span><br />
<br />
发表者: 吴军, Google 研究员 <br />
<br />
前言<br />
<br />
也
许大家不相信，数学是解决信息检索和自然语言处理的最好工具。它能非常清晰地描述这些领域的实际问题并且给出漂亮的解决办法。每当人们应用数学工具解决一
个语言问题时，总会感叹数学之美。我们希望利用 Google 中文黑板报这块园地，介绍一些数学工具，以及我们是如何利用这些工具来开发
Google 产品的。<br />
<br />
系列一： 统计语言模型 (Statistical Language Models)<br />
<br />
Google
的使命是整合全球的信息，所以我们一直致力于研究如何让机器对信息、语言做最好的理解和处理。长期以来，人类一直梦想着能让机器代替人来翻译语言、识别语
音、认识文字（不论是印刷体或手写体）和进行海量文献的自动检索，这就需要让机器理解语言。但是人类的语言可以说是信息里最复杂最动态的一部分。为了解决
这个问题，人们容易想到的办法就是让机器模拟人类进行学习 - 学习人类的语法、分析语句等等。尤其是在乔姆斯基（Noam Chomsky
有史以来最伟大的语言学家）提出 &#8220;形式语言&#8221;
以后，人们更坚定了利用语法规则的办法进行文字处理的信念。遗憾的是，几十年过去了，在计算机处理语言领域，基于这个语法规则的方法几乎毫无突破。 <br />
<br />
其实早在几十年前，数学家兼信息论的祖师爷<a target="_blank" href="http://www.google.com/search?hl=zh-CN&amp;newwindow=1&amp;q=%E4%BF%A1%E6%81%AF%E8%AE%BA+%E9%A6%99%E5%86%9C+Claude&amp;btnG=%E6%90%9C%E7%B4%A2&amp;lr="> 香农</a> (Claude Shannon)就提出了用数学的办法处理自然语言的想法。遗憾的是当时的计算机条件根本无法满足大量信息处理的需要，所以他这个想法当时并没有被人们重视。七十年代初，有了大规模集成电路的快速计算机后，香农的梦想才得以实现。<br />
<br />
首先成功利用数学方法解决自然语言处理问题的是语音和语言处理大师贾里尼克 (<a target="_blank" href="http://www.clsp.jhu.edu/people/jelinek/">Fred Jelinek</a>)。当时贾里尼克在 IBM 公司做学术休假 (Sabbatical Leave)，领导了一批杰出的科学家利用大型计算机来处理人类语言问题。统计语言模型就是在那个时候提出的。<br />
<br />
给大家举个例子：在很多涉及到自然语言处理的领域，如机器翻译、语音识别、印刷体或手写体识别、拼写纠错、汉字输入和文献查询中，我们都需要知道一个文字序列是否能构成一个大家能理解的句子，显示给使用者。对这个问题，我们可以用一个简单的统计模型来解决这个问题。<br />
<br />
如
果 S 表示一连串特定顺序排列的词 w1， w2，&#8230;， wn ，换句话说，S
可以表示某一个由一连串特定顺序排练的词而组成的一个有意义的句子。现在，机器对语言的识别从某种角度来说，就是想知道S在文本中出现的可能性，也就是数
学上所说的S 的概率用 P(S) 来表示。利用条件概率的公式，S 这个序列出现的概率等于每一个词出现的概率相乘，于是P(S) 可展开为：<br />
<br />
P(S) = P(w1)P(w2|w1)P(w3| w1 w2)&#8230;P(wn|w1 w2&#8230;wn-1)<br />
<br />
其
中 P (w1) 表示第一个词w1 出现的概率；P (w2|w1)
是在已知第一个词的前提下，第二个词出现的概率；以次类推。不难看出，到了词wn，它的出现概率取决于它前面所有词。从计算上来看，各种可能性太多，无法
实现。因此我们假定任意一个词wi的出现概率只同它前面的词 wi-1 有关(即马尔可夫假设），于是问题就变得很简单了。现在，S 出现的概率就变为：<br />
<br />
P(S) = P(w1)P(w2|w1)P(w3|w2)&#8230;P(wi|wi-1)&#8230;<br />
(当然，也可以假设一个词又前面N-1个词决定，模型稍微复杂些。）<br />
<br />
接
下来的问题就是如何估计 P (wi|wi-1)。现在有了大量机读文本后，这个问题变得很简单，只要数一数这对词（wi-1,wi)
在统计的文本中出现了多少次，以及 wi-1 本身在同样的文本中前后相邻出现了多少次，然后用两个数一除就可以了,P(wi|wi-1) =
P(wi-1,wi)/ P (wi-1)。<br />
<br />
也许很多人不相信用这么简单的数学模型能解决复杂的语音识别、机器翻译等问题。其实不光是常人，就连很多语言学家都曾质疑过这种方法的有效性，但事实证明，统计语言模型比任何已知的借助某种规则的解决方法都有效。比如在 Google 的<a target="_blank" href="http://www.google.com/language_tools?hl=zh-CN">中英文自动翻译</a>中，用的最重要的就是这个统计语言模型。去年美国标准局(NIST) 对所有的机器翻译系统进行了评测，Google 的系统是不仅是全世界最好的，而且高出所有基于规则的系统很多。<br />
<br />
现
在，读者也许已经能感受到数学的美妙之处了，它把一些复杂的问题变得如此的简单。当然，真正实现一个好的统计语言模型还有许多细节问题需要解决。贾里尼克
和他的同事的贡献在于提出了统计语言模型，而且很漂亮地解决了所有的细节问题。十几年后，李开复用统计语言模型把 997
词语音识别的问题简化成了一个 20 词的识别问题，实现了有史以来第一次大词汇量非特定人连续语音的识别。<br />
<br />
我是一名科学研究人员 ，我在工作中经常惊叹于数学语言应用于解决实际问题上时的神奇。我也希望把这种神奇讲解给大家听。当然，归根结底，不管什莫样的科学方法、无论多莫奇妙的解决手段都是为人服务的。我希望 Google 多努力一分，用户就多一分搜索的喜悦。
<img src ="http://www.blogjava.net/calvinlau/aggbug/278118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">calvinlau</a> 2009-05-27 00:03 <a href="http://www.blogjava.net/calvinlau/articles/278118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>