﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-程序描绘人生-随笔分类-算法</title><link>http://www.cppblog.com/humanchao/category/20271.html</link><description>知识改变命运，学习成就未来。</description><language>zh-cn</language><lastBuildDate>Tue, 26 Jun 2018 13:21:45 GMT</lastBuildDate><pubDate>Tue, 26 Jun 2018 13:21:45 GMT</pubDate><ttl>60</ttl><item><title>LeetCode – Median of Two Sorted Arrays - findMedianSortedArrays</title><link>http://www.cppblog.com/humanchao/archive/2018/06/26/215747.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Tue, 26 Jun 2018 05:57:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2018/06/26/215747.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/215747.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2018/06/26/215747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/215747.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/215747.html</trackback:ping><description><![CDATA[<span>There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).<br /></span><br /><div>The following code is better than most of the results returned by baidu or google. Time&nbsp;<span>complexity is O((m+n)/2), Space complexity is O(1).</span><br /><br /><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span>&nbsp;1</span>&nbsp;<span>double</span>&nbsp;findMedianSortedArrays(vector&lt;<span>int</span>&gt;&amp;&nbsp;nums1,&nbsp;vector&lt;<span>int</span>&gt;&amp;&nbsp;nums2)&nbsp;<br /><span>&nbsp;2</span>&nbsp;{<br /><span>&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int</span>&nbsp;nums1_i&nbsp;=&nbsp;0,&nbsp;nums2_i&nbsp;=&nbsp;0;&nbsp;<br /><span>&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int</span>&nbsp;mid1&nbsp;=&nbsp;0,&nbsp;mid2&nbsp;=&nbsp;0,&nbsp;count&nbsp;=&nbsp;0;<br /><span>&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>while</span>&nbsp;(nums1_i&nbsp;&lt;&nbsp;nums1.size()&nbsp;&amp;&amp;&nbsp;nums2_i&nbsp;&lt;&nbsp;nums2.size())&nbsp;<br /><span>&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span>&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if</span>&nbsp;(count++&nbsp;&gt;&nbsp;((nums1.size()&nbsp;+&nbsp;nums2.size())&nbsp;/&nbsp;2))&nbsp;&nbsp;&nbsp;&nbsp;<span>break</span>;<br /><span>&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid1&nbsp;=&nbsp;mid2;<br /><span>&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid2&nbsp;=&nbsp;(nums1[nums1_i]&nbsp;&lt;&nbsp;nums2[nums2_i]&nbsp;?&nbsp;nums1[nums1_i++]&nbsp;:&nbsp;nums2[nums2_i++]);<br /><span>10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br /><span>11</span>&nbsp;<br /><span>12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>while</span>&nbsp;(nums1_i&nbsp;&lt;&nbsp;nums1.size())&nbsp;<br /><span>13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br /><span>14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if</span>&nbsp;(count++&nbsp;&gt;&nbsp;((nums1.size()&nbsp;+&nbsp;nums2.size())&nbsp;/&nbsp;2))&nbsp;&nbsp;&nbsp;&nbsp;<span>break</span>;<br /><span>15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid1&nbsp;=&nbsp;mid2;<br /><span>16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid2&nbsp;=&nbsp;nums1[nums1_i++];<br /><span>17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br /><span>18</span>&nbsp;<br /><span>19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>while</span>&nbsp;(nums2_i&nbsp;&lt;&nbsp;nums2.size())&nbsp;<br /><span>20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br /><span>21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if</span>&nbsp;(count++&nbsp;&gt;&nbsp;((nums1.size()&nbsp;+&nbsp;nums2.size())&nbsp;/&nbsp;2))&nbsp;&nbsp;&nbsp;&nbsp;<span>break</span>;<br /><span>22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid1&nbsp;=&nbsp;mid2;<br /><span>23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid2&nbsp;=&nbsp;nums2[nums2_i++];<br /><span>24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br /><span>25</span>&nbsp;<br /><span>26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return</span>&nbsp;(nums1.size()&nbsp;+&nbsp;nums2.size())&nbsp;%&nbsp;2&nbsp;==&nbsp;0&nbsp;<br /><span>27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&nbsp;(mid1&nbsp;+&nbsp;mid2)&nbsp;/&nbsp;2.0<br /><span>28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;mid2;&nbsp;<br /><span>29</span>&nbsp;}</div></div><img src ="http://www.cppblog.com/humanchao/aggbug/215747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2018-06-26 13:57 <a href="http://www.cppblog.com/humanchao/archive/2018/06/26/215747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出LSH</title><link>http://www.cppblog.com/humanchao/archive/2018/02/24/215521.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Sat, 24 Feb 2018 05:10:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2018/02/24/215521.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/215521.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2018/02/24/215521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/215521.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/215521.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 通过这篇文章我们主要回答以下几个问题：  &nbsp;  1.&nbsp;&nbsp;&nbsp; LSH解决问题的背景，即以图片相似性搜索为例，如何解决在海量数据中进行相似性查找？  2.&nbsp;&nbsp;&nbsp; 图像相似性查找的连带问题：相似性度量，特征提取；  3.&nbsp;&nbsp;&nbsp; LSH的数学分析，即局部敏感HASH函数的数学原理，通过与、或构造提升查找的查...&nbsp;&nbsp;<a href='http://www.cppblog.com/humanchao/archive/2018/02/24/215521.html'>阅读全文</a><img src ="http://www.cppblog.com/humanchao/aggbug/215521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2018-02-24 13:10 <a href="http://www.cppblog.com/humanchao/archive/2018/02/24/215521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LSH Locality-Sensitive Hashing 局部敏感哈希算法总结</title><link>http://www.cppblog.com/humanchao/archive/2017/05/24/214952.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Wed, 24 May 2017 01:16:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2017/05/24/214952.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/214952.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2017/05/24/214952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/214952.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/214952.html</trackback:ping><description><![CDATA[直接上图<br /><br /><img src="http://wx3.sinaimg.cn/mw1024/4c191a7bly1ffw6mil8g7j21kw4qokbv.jpg" alt="" /><br />脑图源文件下载地址<br /><div><a href="http://www.cppblog.com/Files/humanchao/LSH(Locality%20Sensitive%20Hashing).zip">http://www.cppblog.com/Files/humanchao/LSH(Locality%20Sensitive%20Hashing).zip<br /><br />参考文献：<br /><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;"><strong>Website:</strong></p></a><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;"><a href="http://www.cppblog.com/Files/humanchao/LSH(Locality%20Sensitive%20Hashing).zip">[1]&nbsp;</a><a target="_blank" href="http://people.csail.mit.edu/indyk/" style="color: #ff9900; text-decoration-line: none;">http://people.csail.mit.edu/indyk/&nbsp;</a>（LSH原作者）</p><span style="color: #000000; font-family: Arial; background-color: #ffffff;">[2]&nbsp;<a target="_blank" href="http://www.mit.edu/~andoni/LSH/" style="color: #ff9900; text-decoration-line: none;">http://www.mit.edu/~andoni/LSH/</a>&nbsp;(E2LSH)</span><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;"><strong><br /></strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;"><strong>Paper:</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[1] Approximate nearest neighbor: towards removing the curse of dimensionality<br /></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[2] Similarity search in high dimensions via hashing</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[3] Locality-sensitive hashing scheme based on p-stable distributions&nbsp;</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[4] MultiProbe LSH Efficient Indexing for HighDimensional Similarity Search</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[5] Near-Optimal Hashing Algorithms for Approximate Nearest Neighbor in High Dimensions<br /><strong><br /></strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;"><strong>Tutorial:</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[1] Locality-Sensitive Hashing for Finding Nearest Neighbors</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[2] Approximate Proximity Problems in High Dimensions via Locality-Sensitive Hashing</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[3] Similarity Search in High Dimensions</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;"><strong><br /></strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;"><strong>Book:</strong></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[1] Mining of Massive Datasets<br />[2] Nearest Neighbor Methods in Learning and Vision: Theory and Practice</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;"><br /></p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;"><strong>Cdoe:</strong></p><span style="color: #000000; font-family: Arial; background-color: #ffffff;">[1] http://sourceforge.net/projects/lshkit/?source=directory<br /></span><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[2] http://tarsos.0110.be/releases/TarsosLSH/TarsosLSH-0.5/TarsosLSH-0.5-Readme.html&nbsp;</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[3] http://www.cse.ohio-state.edu/~kulis/klsh/klsh.htm&nbsp;</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[4] http://code.google.com/p/likelike/&nbsp;</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[5] https://github.com/yahoo/Optimal-LSH</p><p style="margin: 0px; padding: 0px; color: #000000; font-family: Arial; background-color: #ffffff;">[6]&nbsp;<a href="http://lib.csdn.net/base/opencv" title="OpenCV知识库" target="_blank" style="color: #df3434; text-decoration-line: none; font-weight: bold;">OpenCV</a>&nbsp;LSH（分别位于legacy module和flann module中）</p><br /><br /><br /></div><img src ="http://www.cppblog.com/humanchao/aggbug/214952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2017-05-24 09:16 <a href="http://www.cppblog.com/humanchao/archive/2017/05/24/214952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：经典的String Hash算法  </title><link>http://www.cppblog.com/humanchao/archive/2012/12/26/196690.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Wed, 26 Dec 2012 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2012/12/26/196690.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/196690.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2012/12/26/196690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/196690.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/196690.html</trackback:ping><description><![CDATA[<span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">设计高效算法往往需要使用Hash表，O(1)级的查找速度是任何别的算法无法比拟的。</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">所谓Hash，一般是一个整数，通过某种算法，可以把一个字符串"pack"成一个整数，这个数称为Hash，当然，一个整数是无法对应一个字符串的。</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">所以Hash函数是Hash表最核心的部分，对于一个Hash函数，评价其优劣的标准应为随机性或离散性，即对任意一组标本，进入Hash表每一个单元（cell）之概率的平均程度，因为这个概率越平均，两个字符串计算出的Hash值相等hash collision的可能越小，数据在表中的分布就越平均，表的空间利用率就越高。</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">Hash表的构造和冲突的不同实现方法对执行效率也有一定的影响.</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">DJBHash是一种非常流行的算法，俗称"Times33"算法。Times33的算法很简单，就是不断的乘33，原型如下</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">hash(i) = hash(i-1) * 33 + str[i]</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">Time33在效率和随机性两方面上俱佳。</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">其它常用字符串哈希函数有：</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">BKDRHash，APHash，JSHash，RSHash，SDBMHash，PJWHash，ELFHash等。BKDRHash和APHash也是比较优秀的算法。当然要根据具体应用选择合适的Hash算法，比如字符集的考虑。</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">APHash作者Arash Partow有一个页面很有参考价值，包括了各种Hash的介绍及代码。</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">http://www.partow.net/programming/hashfunctions/#RSHashFunction</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">Blizzard使用的算法比较精妙，被称为"One-Way Hash"，并且在Hash表中使用了三个哈希值(一个用来确定位置，另外两个用来校验)。</span><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><br style="line-height: 25px; color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #f6f6ed; " /><span style="color: #6e6e6e; font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #f6f6ed; ">MD5等加密算法也属于hash，不过已被中国学者找到碰撞检测的破解算法</span><img src ="http://www.cppblog.com/humanchao/aggbug/196690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2012-12-26 17:08 <a href="http://www.cppblog.com/humanchao/archive/2012/12/26/196690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：循环有序数组查找问题</title><link>http://www.cppblog.com/humanchao/archive/2012/12/26/196686.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Wed, 26 Dec 2012 08:15:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2012/12/26/196686.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/196686.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2012/12/26/196686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/196686.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/196686.html</trackback:ping><description><![CDATA[<a href="http://blog.sina.com.cn/s/blog_a2498b5b01014bsg.html">http://blog.sina.com.cn/s/blog_a2498b5b01014bsg.html<br /><br /></a><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; "><strong>题目描述：</strong></span></span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;一个循环有序数组（如：3,4,5,6,7,8,9,0,1,2），不知道其最小值的位置，要查找任一数值的位置。要求算法时间复杂度为log2(n)。</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><br /></span><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; "><strong>问题分析：</strong></span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;我们可以把循环有序数组分为左右两部分（以mid = （low+high）/ 2为界），由循环有序数组的特点知，左右两部分必有一部分是有序的，我们可以找出有序的这部分，然后看所查找元素是否在有序部分，若在，则直接对有序部分二分查找，若不在，对无序部分递归调用查找函数。</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; "><strong>代码如下：</strong></span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;#include &lt;iostream&gt;</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;using namespace std;</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;int binarySearch(int a[],int low,int high,int value)&nbsp;<wbr>&nbsp;//二分查找<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;if(low&gt;high)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;return -1;</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;int mid=(low+high)/2;</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;if(value==a[mid])<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;return mid;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;else if(value&gt;a[mid])<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;return binarySearch(a,mid+1,high,value);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;else<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;return binarySearch(a,low,mid-1,value);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;int Search(int a[],int low,int high,int value)&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;//循环有序查找函数<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;int mid=(low+high)/2;</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;if(a[mid]&gt;a[low])&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;//左有序<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;if(a[low]&lt;=value &amp;&amp; value&lt;=a[mid] )&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;//说明value在左边，直接二分查找<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;return binarySearch(a,low,mid,value);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;else&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;//value在右边<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;return Search(a,mid+1,high,value);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;else&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;//右有序<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;if(a[mid]&lt;=value &amp;&amp; value&lt;=a[high])<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;return binarySearch(a,mid,high,value);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;else<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;return Search(a,low,mid-1,value);<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;int main()<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;int a[]={3,4,5,6,7,8,9,0,1,2};</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;cout&lt;&lt;Search(a,0,9,0)&lt;&lt;endl;</span></span></p><p style="margin: 1em 0px 0.5em; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #464646; font-family: simsun; background-color: #bcd3e5; "><span style="word-wrap: normal; word-break: normal; "><span style="word-wrap: normal; word-break: normal; line-height: 19px; font-size: small; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;return 0;<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}</span></span></p><img src ="http://www.cppblog.com/humanchao/aggbug/196686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2012-12-26 16:15 <a href="http://www.cppblog.com/humanchao/archive/2012/12/26/196686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：大小端问题</title><link>http://www.cppblog.com/humanchao/archive/2012/12/26/196684.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Wed, 26 Dec 2012 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2012/12/26/196684.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/196684.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2012/12/26/196684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/196684.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/196684.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center;"></p><div style="text-align: left;"><font face="楷体_GB2312"><span style="font-size: 21px;"><strong>转自：</strong></span></font><a href="http://wenku.baidu.com/view/9e2d2f3e5727a5e9856a6167.html">http://wenku.baidu.com/view/9e2d2f3e5727a5e9856a6167.html</a><br /><font face="楷体_GB2312"><span style="font-size: 21px;"><strong><br /></strong></span></font></div><strong><span style="font-size:16.0pt;font-family: 楷体_GB2312;Times New Roman&quot;;">大小端问题</span></strong><strong></strong><p>&nbsp;</p>  <p align="left"><strong><span style="font-size:12.0pt; font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">By unanao</span></strong></p>  <p align="left"><strong><span style="font-size:12.0pt; font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&lt;sunjianjiao@gmail.com&gt;</span></strong></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">一、什么是大小端问题</span></p>  <p align="left"><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">(From</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">《</span><span style="font-size:12.0pt; font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">Computer Systems,A Programer's Perspective</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">》</span><span style="font-size:12.0pt; font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">)</span><span style="font-size: 12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">在几乎所有的机器上，多字节对象被存储为连续的字节序列，对象的地址为所使用字节序列中最低字节地址。</span></p>  <p align="left" style="text-indent: 24pt; line-height: 18pt; "><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">小端：某些机器选择在存储器中按照从最低有效字节到最高有效字节的顺序存储对象，这种最低有效字节在最前面的表示方式被称为</span><strong><em><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">小端法</span></em></strong><strong><em><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">(little endian)</span></em></strong> <span style="font-size: 12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;;">。</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">这样的存储模式有点儿类似于把数据当作字符串顺序处理：地址由小向大增加，而数据从高位往低位放；</span></p>  <p align="left" style="line-height: 18pt; "><span style="font-size:12.0pt; font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;">大端：某些机器则按照从最高有效字节到最低有效字节的顺序储存，这种最高有效字节在最前面的方式被称为</span><strong><em><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">大端法</span></em></strong><strong><em><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">(big endian)</span></em></strong> <span style="font-size: 12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;;">。</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">这种存储模式将地址的高低和数据位权有效地结合起来，高地址部分权值高，低地址部分权值低，和我们的逻辑方法一致。</span></p>  <p>&nbsp;</p>  <p>&nbsp;<span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;">举个例子来说名大小端</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">:&nbsp; </span><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;">比如一个</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">int x, </span><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;">地址为</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">0x100, </span><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;">它的值为</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">0x1234567. </span><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;">则它所占据的</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">0x100, 0x101, 0x102, 0x103</span><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;">地址组织如下图</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">:</span></p>  <p><br /><img src="http://www.cppblog.com/images/cppblog_com/humanchao/新建位图图像.jpg" width="601" height="180" alt="" /><br /><br /></p>  <p align="left" style="line-height: 18pt; "><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">二、为什么会有大小端模式之分呢？</span></p>  <p align="left" style="text-indent: 25.2pt; line-height: 18pt; "><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">这是因为在计算机系统中，我们是以字节为单位的，每个地址单元都对应着一个字节，一个字节为</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; "> 8bit</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">。但是在</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">C</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">语言中除了</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">8bit</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">的</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">char</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">之外，还有</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">16bit</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">的</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">short</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">型，</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">32bit</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">的</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">long</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">型（要看具体的编译器），另外，对于位数大于</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; "> 8</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">位的处理器，例如</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">16</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">位或者</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">32</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">位的处理器，由于寄存器宽度大于一个字节，那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">16bit</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">的</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">short</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">型</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">x</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">，在内存中的地址为</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">0x0010</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">，</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">x</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">的值为</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">0x1122</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">，那么</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">0x11</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">为高字节，</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">0x22</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">为低字节。对于</span> <span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">大端模式，就将</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">0x11</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">放在低地址中，即</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">0x0010</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">中，</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">0x22</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">放在高地址中，即</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">0x0011</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">中。小端模式，刚好相反。我们常用的</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">X86</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">结构是小端模</span> <span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">式，而</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">KEIL C51</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">则为大端模式。很多的</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">ARM</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">，</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">DSP</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">都为小端模式。有些</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; letter-spacing: 0.4pt; ">ARM</span><span style="font-size: 12pt; font-family: 楷体_GB2312; letter-spacing: 0.4pt; ">处理器还可以由硬件来选择是大端模式还是小端模式。</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;">三、如何区分大小端问题：</span></p>  <p><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;">方法</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">1</span><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;">：</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">#include &lt;stdio.h&gt;</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">int main(void)</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">{</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 1;</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char *pointer;</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pointer = (unsigned char *)&amp;i;</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(*pointer)</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("litttle_endian");</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("big endian\n");</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">}</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">C</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;">中的数据类型都是从内存的低地址向高地址扩展，取址运算</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">"&amp;"</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;">都是取低地址</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">。小端方式中（</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">i</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">占至少两个字节的长度）则</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">i</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">所分配的内存最小地址那个字节中就存着</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">1</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">，其他字节是</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">0</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">。</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">大端的话则</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">1</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">在</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">i</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">的最高地址字节处存放，</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">char</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">是一个字节，所以强制将</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">char</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">型量</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">p</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">指向</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">i</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">，</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">则</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">p</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">指向的一定是</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">i</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">的最低地址，那么就可以判断</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">p</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">中的值是不是</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">1</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">来确定是不是小端。</span></p>  <p>&nbsp;</p>  <p><span style="font-size: 12pt; font-family: 楷体_GB2312; ">方法</span><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">2</span><span style="font-size: 12pt; font-family: 楷体_GB2312; ">：</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">#include &lt;stdio.h&gt;</span></p>  <p>&nbsp;</p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">int main(void)</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">{</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union {</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; short a;</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char ch;</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } u;</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u.a = 1;</span></p>  <p>&nbsp;</p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (u.ch == 1)</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Littel endian\n");</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Big endian\n");</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p><span style="font-size: 12pt; font-family: 'Times New Roman', serif; ">}</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;">利用联合体的特点，数据成员共享内存空间，</span><span style="font-size: 12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">union</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;">中元素的起始地址都是相同的</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&#8212;&#8212;</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;">位于联合的开始。</span> <span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;">用</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">char</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;">来截取感兴趣的字节<span style="color:#2B2BD5">。</span></span></p>  <p>&nbsp;</p>  <p align="left"><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">四、需要考虑大小端（字节顺序）的情况</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;"> </span></p>  <p align="left"><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">1</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">、所写的程序需要向不同的硬件平台迁移，说不定哪一个平台是大端还是小端，为了保证可移植性，一定提前考虑好。</span></p>  <p align="left"><strong><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">2. </span></strong><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">在不同类型的机器之间通过网络传送二进制数据时。</span> <span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">一个常见的问题是当小端法机器产生的数据被发送到大端法机器或者反之时，接受程序会发现，字</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">(word)</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">里的字节</span><span style="font-size:12.0pt; font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">(byte)</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">成了反序的。为了避免这类问</span> <span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">题，网络应用程序的代码编写必须遵守已建立的关于字节顺序的规则，以确保发送方机器将它的内部表示转换成网络标准，而接受方机器则将网络标准转换为它的内部标准。</span></p>  <p align="left"><strong><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">3. </span></strong><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">当阅读表示整数的字节序列时。这通常发生在检查机器级程序时，</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">e.g.</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">：反汇编得到的一条指令：</span><span style="font-size:12.0pt;font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;"><br /> 80483bd: 01 05 64 94 04 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add %eax, 0x8049464</span></p>  <p align="left"><strong><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">3. </span></strong><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">当编写强转的类型系统的程序时。</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;;">如写入的数据为</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">u32</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;;">型，但是读取的时候却是</span><span style="font-size: 12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">char</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;;">型的。如：</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">0x1234, </span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;;">大端读取为</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">12</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;;">时，小端独到的是</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">34</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;;">。</span></p>  <p align="left"><strong><span style="font-size: 12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">六、提高程序的可移植性</span></strong><strong></strong></p>  <p align="left"><strong><span style="font-size: 12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;">使用宏编译</span></strong><strong></strong></p>  <p align="left"><strong><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">#ifdef LITTLE_ENDIAN</span></strong></p>  <p align="left"><strong><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">//</span></strong><strong><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;;">小端的代码</span></strong><strong></strong></p>  <p align="left"><strong><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">#else</span></strong></p>  <p align="left"><strong><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">//</span></strong><strong><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;;">大端的代码</span></strong><strong></strong></p>  <p align="left"><strong><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">#endif</span></strong></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt; font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;">七、大、小端之间的转换</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">1</span><span style="font-size:12.0pt;font-family:楷体_GB2312;Times New Roman&quot;;Times New Roman&quot;">、小端转换为大端</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">#include &lt;stdio.h&gt;</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">void show_byte(char *addr, int len)</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">{</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; len; i++)</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x \t", addr[i]);</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">}</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">int endian_convert(int t)</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">{</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int result;</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = 0;</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; sizeof(t); i++)</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result &lt;&lt;= 8;</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result |= (t &amp; 0xFF);</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t &gt;&gt;= 8;</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">}</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">int main(void)</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">{</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ret;</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = 0x1234567;</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show_byte((char *)&amp;i, sizeof(int));</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = endian_convert(i);</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show_byte((char *)&amp;ret, sizeof(int));</span></p>  <p>&nbsp;</p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></p>  <p><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;,&quot;serif&quot;;">}</span></p>  <p>&nbsp;</p><img src ="http://www.cppblog.com/humanchao/aggbug/196684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2012-12-26 16:06 <a href="http://www.cppblog.com/humanchao/archive/2012/12/26/196684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：模拟洗牌(扑克)程序</title><link>http://www.cppblog.com/humanchao/archive/2012/12/26/196683.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Wed, 26 Dec 2012 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2012/12/26/196683.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/196683.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2012/12/26/196683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/196683.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/196683.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://www.fredosaurus.com/notes-cpp/misc/random-shuffle.html">http://www.fredosaurus.com/notes-cpp/misc/random-shuffle.html</a><br /><br />// File&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : misc/random/deal.cpp - Randomly shuffle deck of cards.</p>  <p>// Illustrates : Shuffle algorithm, srand, rand.</p>  <p>// Improvements: Use classes for Card and Deck.</p>  <p>// Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Fred Swartz 2003-08-24, shuffle correction 2007-01-18</p>  <p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Placed in the public domain.</p>  <p>&nbsp;</p>  <p>#include &lt;iostream&gt;</p>  <p>#include &lt;cstdlib&gt;&nbsp;&nbsp; // for srand and rand</p>  <p>#include &lt;ctime&gt;&nbsp;&nbsp;&nbsp;&nbsp; // for time</p>  <p>using namespace std;</p>  <p>&nbsp;</p>  <p>int main() {</p>  <p>&nbsp;&nbsp;&nbsp; int card[52];&nbsp;&nbsp;&nbsp; // array of cards;</p>  <p>&nbsp;&nbsp;&nbsp; int n;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // number of cards to deal</p>  <p>&nbsp;&nbsp;&nbsp; srand(time(0));&nbsp; // initialize seed "randomly"</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp; </p>  <p>&nbsp;&nbsp;&nbsp; for (int i=0; i&lt;52; i++) {</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; card[i] = i;&nbsp; // fill the array in order</p>  <p>&nbsp;&nbsp;&nbsp; }</p>  <p>&nbsp;&nbsp;&nbsp; </p>  <p>&nbsp;&nbsp;&nbsp; while (cin &gt;&gt; n) {&nbsp;&nbsp;&nbsp; </p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //--- Shuffle elements by randomly exchanging each with one other.</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=0; i&lt;(52-1); i++) {</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int r = i + (rand() % (52-i)); // Random remaining position.</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int temp = card[i]; card[i] = card[r]; card[r] = temp;</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //--- Print first n cards as ints.</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int c=0; c&lt;n; c++) {</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; card[c] &lt;&lt; " ";&nbsp; // Just print number</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;</p>  <p>&nbsp;&nbsp;&nbsp; }</p>  <p>&nbsp;&nbsp; </p>  <p>&nbsp;&nbsp; return 0;</p>  <p>}</p><img src ="http://www.cppblog.com/humanchao/aggbug/196683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2012-12-26 15:59 <a href="http://www.cppblog.com/humanchao/archive/2012/12/26/196683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：海明距离</title><link>http://www.cppblog.com/humanchao/archive/2012/12/26/196680.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Wed, 26 Dec 2012 07:49:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2012/12/26/196680.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/196680.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2012/12/26/196680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/196680.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/196680.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">转自：<a href="http://blog.csdn.net/fuyangchang/article/details/5637464">http://blog.csdn.net/fuyangchang/article/details/5637464</a><br />wiki地址<a title="http://en.wikipedia.org/wiki/Hamming_distance" href="http://en.wikipedia.org/wiki/Hamming_distance" style="color: #336699; text-decoration: none; ">http://en.wikipedia.org/wiki/Hamming_distance</a></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">在信息领域，<strong>两个长度相等的字符串</strong>的海明距离是在相同位置上不同的字符的个数，也就是将一个字符串替换成另一个字符串需要的替换的次数。</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">例如：</p><ul style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><li>"<strong>toned</strong>" and "<strong>roses</strong>" is 3.</li><li><strong>1011101</strong>&nbsp;and&nbsp;<strong>1001001</strong>&nbsp;is 2.</li><li><strong>2173896</strong>&nbsp;and&nbsp;<strong>2233796</strong>&nbsp;is 3.</li></ul><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">对于二进制来说，海明距离的结果相当于&nbsp;<em>a</em>&nbsp;<a href="http://en.wikipedia.org/wiki/Exclusive_OR" style="color: #336699; text-decoration: none; ">XOR</a>&nbsp;<em>b</em>&nbsp;结果中1的个数。</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><p>python<span style="font-family:宋体;">代码如下</span></p>  <p>&nbsp;</p>  <p>def hamming_distance(s1, s2):</p>  <p>&nbsp;&nbsp;&nbsp; assert len(s1) == len(s2)</p>  <p>&nbsp;&nbsp;&nbsp; return sum(ch1 != ch2 for ch1, ch2 in zip(s1, s2))</p>  <p>&nbsp;</p>  <p>print (hamming_distance("gdad","glas"))</p>  <p><span style="font-family:宋体;">结果是</span>2</p>  <p>&nbsp;</p>  <p>C<span style="font-family:宋体;">语言代码如下</span></p>  <p>&nbsp;</p>  <p>unsigned hamdist(unsigned x, unsigned y)</p>  <p>{</p>  <p>&nbsp; unsigned dist = 0, val = x ^ y;</p>  <p>&nbsp;</p>  <p>&nbsp; // Count the number of set bits</p>  <p>&nbsp; while(val)</p>  <p>&nbsp; {</p>  <p>&nbsp;&nbsp;&nbsp; ++dist; </p>  <p>&nbsp;&nbsp;&nbsp; val &amp;= val - 1;</p>  <p>&nbsp; }</p>  <p>&nbsp;</p>  <p>&nbsp; return dist;</p>  <p>}</p>  <p>&nbsp;</p>  <p>int main()</p>  <p>{</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned x="abcdcc";</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned y="abccdd";</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned z=hamdist(x,y);</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d",z);</p>  <p>}</p></p><img src ="http://www.cppblog.com/humanchao/aggbug/196680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2012-12-26 15:49 <a href="http://www.cppblog.com/humanchao/archive/2012/12/26/196680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：MySQL索引背后的数据结构及算法原理</title><link>http://www.cppblog.com/humanchao/archive/2012/12/21/196493.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Fri, 21 Dec 2012 02:38:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2012/12/21/196493.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/196493.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2012/12/21/196493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/196493.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/196493.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://www.codinglabs.org/html/theory-of-mysql-index.htmlMySQL索引背后的数据结构及算法原理摘要本文以MySQL数据库为研究对象，讨论与数据库索引相关的一些话题。特别需要说明的是，MySQL支持诸多存储引擎，而各种存储引擎对索引的支持也各不相同，因此MySQL数据库支持多种索引类型，如BTree索引，哈希索引，全文索引等等。为了避免...&nbsp;&nbsp;<a href='http://www.cppblog.com/humanchao/archive/2012/12/21/196493.html'>阅读全文</a><img src ="http://www.cppblog.com/humanchao/aggbug/196493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2012-12-21 10:38 <a href="http://www.cppblog.com/humanchao/archive/2012/12/21/196493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: 数学之美笔记</title><link>http://www.cppblog.com/humanchao/archive/2012/09/18/191111.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Tue, 18 Sep 2012 07:04:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2012/09/18/191111.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/191111.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2012/09/18/191111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/191111.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/191111.html</trackback:ping><description><![CDATA[<pre id="link-report" style="margin-top: 0px; margin-bottom: 1.5em; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-size: 12px; line-height: 19px; font-family: Arial, Helvetica, sans-serif; color: #111111; background-color: #ffffff; "><span style="font-size: 14pt; ">转自：</span><a href="http://book.douban.com/annotation/19461092/">http://book.douban.com/annotation/19461092/</a>
<span style="font-size: 14pt; "><br /><br />       半个月前在豆瓣上看到了一本新书《数学之美》，评价很高。而因为在半年前看了《什么是数学》就对数学产生浓厚兴趣，但苦于水平不足的我便立马买了一本，希望能对数学多一些了解，并认真阅读起来。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">       令我意外并欣喜的是，这本书里边的数学内容并不晦涩难懂，而且作者为了讲述数学之美而搭配的一些工程实例都是和我学习并感兴趣的模式识别，目标分类相关算法相关联的。这让我觉得捡到了意外的宝藏。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">        书中每一个章节都或多或少是作者亲身经历过的，比如世界级教授的小故事，或者Google的搜索引擎原理，又或者是Google的云计算等。作者用其行云流水般的语言将各个知识点像讲故事一样有趣的叙述出来。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">        这本书着实让我印象深刻，所以我把笔记分享出来，希望更多和我学习研究领域一样的人会喜欢并亲自阅读这本书，并能支持作者。毕竟国内这种书实在是太少了，也希望能有更多领域内的大牛能再写出一些这种书籍来让我们共同提高。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">1.    因为需要传播信息量的增加，不同的声音并不能完全表达信息，语言便产生了。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">2.    当文字增加到没有人能完全记住所有文字时，聚类和归类就开始了。例如日代表太阳或者代表一天。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">3.    聚类会带来歧义性，但上下文可以消除歧义。信息冗余是信息安全的保障。例如罗塞塔石碑上同一信息重复三次。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">4.    最短编码原理即常用信息短编码，生僻信息长编码。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">5.    因为文字只是信息的载体而非信息本身，所以翻译是可以实现的。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">6.    2012，其实是玛雅文明采用二十进制，即四百年是一个太阳纪，而2012年恰巧是当前太阳纪的最后一年，2013年是新的太阳纪的开始，故被误传为世界末日。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">7.    字母可以看为是一维编码，而汉字可以看为二维编码。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">8.    基于统计的自然语言处理方法，在数学模型上和通信是相通的，甚至是相同的。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">9.    让计算机处理自然语言的基本问题就是为自然语言这种上下文相关的特性建立数学模型，即统计语言模型（Statistical Language Modal）。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">10.    根据大数定理（Law of Large Numbers），只要统计量足够，相对频度就等于概率。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">11.    二元模型。对于p(w1,w2,&#8230;,wn)=p(w1)p(w2|w1)p(w3|w1,w2)&#8230;p(wn|w1,w2,&#8230;,wn-1)的展开问题，因为p(w3|w1,w2)难计算，p(wn|w1,w2,&#8230;,wn-1)更难计算，马尔科夫给出了一个偷懒但是颇为有效的方法，也就是每当遇到这种情况时，就假设任意wi出现的概率只与它前面的wi-1有关，即p(s)=p(w1)p(w2|w1)p(w3|w2)&#8230;p(wi|wi-1)&#8230;p(wn|wn-1)。现在这个概率就变的简单了。对应的语言模型为2元模型（Bigram Model）。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">12.    *N元模型。wi只与前一个wi-1有关近似的过头了，所以N-1阶马尔科夫假设为p(wi|w1,w2,&#8230;,wi-1)=p(wi|wi-N+1,wi-N+2,&#8230;,wi-1)，对应的语言模型成为N元模型（N-Gram Model）。一元模型就是上下文无关模型，实际应用中更多实用的是三元模型。Google的罗塞塔翻译系统和语言搜索系统实用的是四元模型，存储于500台以上的Google服务器中。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">13.    *卡兹退避法（Katz backoff），对于频率超过一定阈值的词，它们的概率估计就是它们在语料库中的相对频度，对于频率小于这个阈值的词，它们的概率估计就小于他们的相对频度，出现次数越少，频率下调越多。对于未看见的词，也给予一个比较小的概率（即下调得到的频率总和），这样所有词的概率估计都平滑了。这就是卡兹退避法（Katz backoff）。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">14.    训练数据通常是越多越好，通过平滑过渡的方法可以解决零概率和很小概率的问题，毕竟在数据量多的时候概率模型的参数可以估计的比较准确。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">15.    利用统计语言模型进行分词，即最好的分词方法应该保证分完词后这个句子出现的概率最大。根据不同应用，汉语分词的颗粒度大小应该不同。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">16.    符合马尔科夫假设（各个状态st的概率分布只与它前一个状态st-1有关）的随即过程即成为马尔科夫过程，也称为马尔科夫链。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">17.    隐含马尔科夫模型是马尔科夫链的扩展，任意时刻t的状态st是不可见的，所以观察者没法通过观察到一个状态序列s1,s2,s3,&#8230;,sT来推测转移概率等参数。但是隐马尔科夫模型在每个时刻t会输出一个符号ot，而且ot和st相关且仅和ot相关。这个被称为独立输出假设。其中隐含的状态s1,s2,s3,&#8230;是一个典型的马尔科夫链。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">18.    隐含马尔科夫模型是机器学习主要工具之一，和几乎所有机器学习的模型工具一样，它需要一个训练算法（鲍姆-韦尔奇算法）和使用时的解码算法（维特比算法）。掌握了这两类算法，就基本上可以使用隐含马尔科夫模型这个工具了。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">19.    鲍姆-韦尔奇算法（Baum-Welch Algorithm），首先找到一组能够产生输出序列O的模型参数，这个初始模型成为Mtheta0，需要在此基础上找到一个更好的模型，假定不但可以算出这个模型产生O的概率P(O|Mtheta0)，而且能够找到这个模型产生O的所有可能的路径以及这些路径的概率。并算出一组新的模型参数theta1，从Mtheta0到Mtheta1的过程称为一次迭代。接下来从Mtheta1出发寻找更好的模型Mtheta2，并一直找下去，直到模型的质量没有明显提高为止。这样一直估计（Expectation）新的模型参数，使得输出的概率达到最大化（Maximization）的过程被称为期望值最大化（Expectation-Maximization）简称EM过程。EM过程能保证一定能收敛到一个局部最优点，但不能保证找到全局最优点。因此，在一些自然语言处理的应用中，这种无监督的鲍姆-韦尔奇算法训练处的模型比有监督的训练得到的模型效果略差。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">20.    熵，信息熵的定义为H(X)=-SumP(x)logP(x)，变量的不确定性越大，熵也越大。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">21.    一个事物内部会存在随机性，也就是不确定性，假定为U，而从外部消除这个不确定性唯一的办法是引入信息I，而需要引入的信息量取决于这个不确定性的大小，即I&gt;U才行。当I&lt;U时，这些信息可以消除一部分不确定性，U'=U-I。反之，如果没有信息，任何公示或者数字的游戏都无法排除不确定性。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">22.    信息的作用在于消除不确定性。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">23.    互信息，对两个随机事件相关性的量化度量，即随机事件X的不确定性或者说熵H(X)，在知道随机事件Y条件下的不确定性，或者说条件熵H(X|Y)之间的差异，即I(X;Y)=H(X)-H(X|Y)。所谓两个事件相关性的量化度量，即在了解了其中一个Y的前提下，对消除另一个X不确定性所提供的信息量。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">24.    相对熵（Kullback-Leibler Divergence）也叫交叉熵，对两个完全相同的函数，他们的相对熵为零；相对熵越大，两个函数差异越大，反之，相对熵越小，两个函数差异越小；对于概率分布或者概率密度函数，如果取值均大于零，相对熵可以度量两个随机分布的差异性。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">25.    弗里德里克&#183;贾里尼克（Frederek Jelinek）是自然语言处理真谛的先驱者。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">26.    技术分为术和道两种，具体的做事方法是术，做事的原理和原则是道。术会从独门绝技到普及再到落伍，追求术的人会很辛苦，只有掌握了道的本质和精髓才能永远游刃有余。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">27.    真理在形式上从来是简单的，而不是复杂和含混的。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">28.    搜索引擎不过是一张大表，表的每一行对应一个关键字，而每一个关键字后面跟着一组数字，是包含该关键词的文献序号。但当索引变的非常大的时候，这些索引需要通过分布式的方式存储到不同的服务器上。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">29.    网络爬虫（Web Crawlers），图论的遍历算法和搜索引擎的关系。互联网虽然复杂，但是说穿了其实就是一张大图&#8230;&#8230;可以把每一个网页当做一个节点，把那些超链接当做连接网页的弧。有了超链接，可以从任何一个网页出发，用图的遍历算法，自动访问到每一个网页并且把他们存储起来。完成这个功能的程序叫网络爬虫。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">30.    哥尼斯堡七桥，如果一个图能从一个顶点出发，每条边不重复的遍历一遍回到这个顶点，那么每一个顶点的度必须为偶数。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">31.    构建网络爬虫的工程要点：1.用BFS（广度优先搜索）还是DFS（深度优先搜索），一般是先下载完一个网站，再进入下一个网站，即BFS的成分多一些。2.页面的分析和URL的提取，如果有些网页明明存在，但搜索引擎并没有收录，可能的原因之一是网络爬虫中的解析程序没能成功解析网页中不规范的脚本程序。3.记录哪些网页已经下载过的URL表，可以用哈希表。最终，好的方法一般都采用了这样两个技术：首先明确每台下载服务器的分工，也就是在调度时，一看到某个URL就知道要交给哪台服务器去下载，这样就避免了很多服务器对同一个URL做出是否需要下载的判断。然后，在明确分工的基础上，判断URL是否下载就可以批处理了，比如每次向哈希表（一组独立的服务器）发送一大批询问，或者每次更新一大批哈希表的内容，这样通信的次数就大大减少了。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">32.    PageRank衡量网页质量的核心思想，在互联网上，如果一个网页被很多其他网页所链接，说明它受到普遍的承认和信赖，那么它的排名就高。同时，对于来自不同网页的链接区别对待，因为网页排名高的那些网页的链接更可靠，于是要给这些链接比较大的权重。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">33.    TF-IDF(Term Frequency / Inverse Document Frequency) ，关键词频率-逆文本频率值，其中，TF为某个网页上出现关键词的频率，IDF为假定一个关键词w在Dw个网页中出现过，那么Dw越大，w的权重越小，反之亦然，公式为log(D/Dw)。1.一个词预测主题的能力越强，权重越大，反之，权重越小。2.停止词的权重为零。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">34.    动态规划（Dynamic Programming）的原理，将一个寻找全程最优的问题分解成一个个寻找局部最优的小问题。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">35.    一个好的算法应该像轻武器中最有名的AK-47冲锋枪那样：简单、有效、可靠性好而且容易读懂（易操作）而不应该故弄玄虚。选择简单方案可以容易解释每个步骤和方法背后的道理，这样不仅便于出问题时的查错，也容易找到今后改进的目标。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">36.    在实际的分类中，可以先进行奇异值分解（得到分类结果略显粗糙但能较快得到结果），在粗分类结果的基础上，利用计算向量余弦的方法（对范围内的分类做两两计算），在粗分类结果的基础上，进行几次迭代，得到比较精确的结果。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">37.    奇异值分解（Singular Value Decomposition），在需要用一个大矩阵A来描述成千上万文章和几十上百万词的关联性时，计算量非常大，可以将A奇异值分解为X、B和Y三个矩阵，Amn=Xmm*Bmn*Ynn，X表示词和词类的相关性，Y表示文本和主题的相关性，B表示词类和主题的相关性，其中B对角线上的元素很多值相对其他的非常小，或者为零，可以省略。对关联矩阵A进行一次奇异值分解，就可以同时完成近义词分类和文章的分类，同时能得到每个主题和每个词义类之间的相关性，这个结果非常漂亮。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">38.    信息指纹。如果能够找到一种函数，将5000亿网址随即地映射到128位二进制，也就是16字节的整数空间，就称这16字节的随机数做该网址的信息指纹。信息指纹可以理解为将一段信息映射到一个多维二进制空间中的一个点，只要这个随即函数做的好，那么不同信息对应的点不会重合，因此这个二进制的数字就变成了原来信息所具有的独一无二的指纹。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">39.    判断两个集合是否相同，最笨的方法是这个集合中的元素一一比较，复杂度O(squareN)，稍好的是将元素排序后顺序比较，复杂度O(NlogN)，最完美的方法是计算这两个集合的指纹，然后直接进行比较，计算复杂度O(N)。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">40.    伪随机数产生器算法（Pseudo-Random Number Generator，PRNG），这是产生信息指纹的关键算法，通过他可以将任意长的整数转换成特定长度的伪随机数。最早的PRNG是将一个数的平方掐头去尾取中间，当然这种方法不是很随即，现在常用的是梅森旋转算法（Mersenne Twister）。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">41.    在互联网上加密要使用基于加密的伪随机数产生器（Cryptography Secure Pseudo-Random Number Generator，CSPRNG），常用的算法有MD5或者SHA-1等标准，可以将不定长的信息变成定长的128位或者160位二进制随机数。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">42.    最大熵模型（Maximum Entropy）的原理就是保留全部的不确定性，将风险降到最小。最大熵原理指出，需要对一个随机事件的概率分布进行预测时，我们的预测应当满足全部已知的条件，而对未知的情况不要做任何主观假设。在这种情况下，概率分布最均匀，预测的风险最小。I.Csiszar证明，对任何一组不自相矛盾的信息，这个最大熵模型不仅存在，而且是唯一的，此外，他们都有同一个非常简单的形式-指数函数。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">43.    通用迭代算法（Generalized Iterative Scaling，GIS）是最原始的最大熵模型的训练方法。1.假定第零次迭代的初始模型为等概率的均匀分布。2.用第N次迭代的模型来估算每种信息特征在训练数据中的分布。如果超过了实际的，就把相应的模型参数变小，反之变大。3.重复步骤2直至收敛。这是一种典型的期望值最大化（Expectation Maximization，EM）算法。IIS(Improved Iterative Scaling)比GIS缩短了一到两个数量级。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">44.    布隆过滤器实际上是一个很长的二进制向量和一系列随机映射的函数。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">45.    贝叶斯网络从数学的层面讲是一个加权的有向图，是马尔科夫链的扩展，而从知识论的层面看，贝叶斯网络克服了马尔科夫那种机械的线性的约束，它可以把任何有关联的事件统一到它的框架下面。在网络中，假定马尔科夫假设成立，即每一个状态只与和它直接相连的状态有关，而和他间接相连的状态没有直接关系，那么它就是贝叶斯网络。在网络中每个节点概率的计算，都可以用贝叶斯公式来进行，贝叶斯网络也因此得名。由于网络的每个弧都有一个可信度，贝叶斯网络也被称作信念网络（Belief Networks）。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">46.    条件随机场是计算联合概率分布的有效模型。在一个隐含马尔科夫模型中，以x1,x2,...,xn表示观测值序列，以y1,y2,...,yn表示隐含的状态序列，那么xi只取决于产生它们的状态yi,和前后的状态yi-1和yi+1都无关。显然很多应用里观察值xi可能和前后的状态都有关，如果把xi和yi-1,yi,yi+1都考虑进来，这样的模型就是条件随机场。它是一种特殊的概率图模型（Probablistic Graph Model），它的特殊性在于，变量之间要遵守马尔科夫假设，即每个状态的转移概率只取决于相邻的状态，这一点和另一种概率图模型贝叶斯网络相同，它们的不同之处在于条件随机场是无向图，而贝叶斯网络是有向图。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">47.    维特比算法（Viterbi Algoritm）是一个特殊但应用最广的动态规划算法，利用动态规划，可以解决任何一个图中的最短路径问题。它之所以重要，是因为凡是使用隐含马尔科夫模型描述的问题都可以用它来解码。1.从点S出发，对于第一个状态x1的各个节点，不妨假定有n1个，计算出S到他们的距离d(S,x1i)，其中x1i代表任意状态1的节点。因为只有一步，所以这些距离都是S到他们各自的最短距离。2.对于第二个状态x2的所有节点，要计算出从S到他们的最短距离。d(S,x2i)=min_I=1,n1_d(S,x1j)+d(x1j,x2i)，由于j有n1种可能性，需要一一计算，然后找到最小值。这样对于第二个状态的每个节点，需要n1次乘法计算。假定这个状态有n2个节点，把S这些节点的距离都算一遍，就有O(n1*n2)次运算。3.按照上述方法从第二个状态走到第三个状态一直走到最后一个状态，这样就得到整个网络从头到尾的最短路径。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">48.    扩频传输（Spread-Spectrum Transmission）和固定频率的传输相比，有三点明显的好处：1.抗干扰能力强。2.信号能量非常低，很难获取。3.扩频传输利用带宽更充分。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">49.    Google针对云计算给出的解决工具是MapReduce，其根本原理就是计算机算法上常见的分治算法（Divide-and-Conquer）。将一个大任务拆分成小的子任务，并完成子任务的计算，这个过程叫Map，将中间结果合并成最终结果，这个过程叫Reduce。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">50.    逻辑回归模型（Logistic Regression）是将一个事件出现的概率适应到一条逻辑曲线（Logistic Curve）上。典型的逻辑回归函数：f(z)=e`z/e`z+1=1/1+e`-z。逻辑曲线是一条S型曲线，其特点是开始变化快，逐渐减慢，最后饱和。逻辑自回归的好处是它的变量范围从负无穷到正无穷，而值域范围限制在0-1之间。因为值域的范围在0-1之间，这样逻辑回归函数就可以和一个概率分别联系起来了。因为自变量范围在负无穷到正无穷之间，它就可以把信号组合起来，不论组合成多大或者多小的值，最后依然能得到一个概率分布。</span><div style="margin: 0px; padding-bottom: 1em; "></div><span style="font-size: 14pt; ">51.    期望最大化算法（Expectation Maximization Algorithm），根据现有的模型，计算各个观测数据输入到模型中的计算结果，这个过程称为期望值计算过程（Expectation），或E过程；接下来，重新计算模型参数，以最大化期望值，这个过程称为最大化的过程（Maximization），或M过程。这一类算法都称为EM算法，比如隐含马尔科夫模型的训练方法Baum-Welch算法，以及最大熵模型的训练方法GIS算法。</span></pre><img src ="http://www.cppblog.com/humanchao/aggbug/191111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2012-09-18 15:04 <a href="http://www.cppblog.com/humanchao/archive/2012/09/18/191111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>收藏:汉字拼音 五笔 GB2312 GBK Unicode BIG5编码速查链接</title><link>http://www.cppblog.com/humanchao/archive/2012/09/07/189801.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Fri, 07 Sep 2012 05:15:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2012/09/07/189801.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/189801.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2012/09/07/189801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/189801.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/189801.html</trackback:ping><description><![CDATA[<a href="http://ipseeker.cn/tools/pywb.php">http://ipseeker.cn/tools/pywb.php</a>&nbsp;<img src ="http://www.cppblog.com/humanchao/aggbug/189801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2012-09-07 13:15 <a href="http://www.cppblog.com/humanchao/archive/2012/09/07/189801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重建二叉树</title><link>http://www.cppblog.com/humanchao/archive/2008/08/27/60174.html</link><dc:creator>胡满超</dc:creator><author>胡满超</author><pubDate>Wed, 27 Aug 2008 09:51:00 GMT</pubDate><guid>http://www.cppblog.com/humanchao/archive/2008/08/27/60174.html</guid><wfw:comment>http://www.cppblog.com/humanchao/comments/60174.html</wfw:comment><comments>http://www.cppblog.com/humanchao/archive/2008/08/27/60174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/humanchao/comments/commentRss/60174.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/humanchao/services/trackbacks/60174.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt;">已知前序和中序：<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;NODE&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;NODE&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pLeft;<br />&nbsp;&nbsp;&nbsp;&nbsp;NODE&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pRight;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;chValue;<br />};<br /><br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;CharInStrFirstPos(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;ch,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">str,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nLen)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pOrgStr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;str;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(nLen&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;ch&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">str)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nLen</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(nLen&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;(str&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;pOrgStr)&nbsp;:&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />}<br /><br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ReBuild_PreIn(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pPreOrder,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pInOrder,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nTreeLen,&nbsp;NODE&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">pRoot)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(pPreOrder&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;pInOrder&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;NODE&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pTemp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;NODE;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTemp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">chValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pPreOrder;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTemp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTemp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">pRoot&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pRoot&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pTemp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nTreeLen&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nLeftLen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CharInStrFirstPos(</span><span style="color: #000000;">*</span><span style="color: #000000;">pPreOrder,&nbsp;pInOrder,&nbsp;nTreeLen);<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(nLeftLen&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nRightLen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nTreeLen&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;nLeftLen&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nLeftLen&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReBuild_PreIn(pPreOrder&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;pInOrder,&nbsp;nLeftLen,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">((</span><span style="color: #000000;">*</span><span style="color: #000000;">pRoot)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nRightLen&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReBuild_PreIn(pPreOrder&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;nLeftLen&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;pInOrder&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;nLeftLen&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRightLen,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">((</span><span style="color: #000000;">*</span><span style="color: #000000;">pRoot)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></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;"><br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ReBuild_AftIn(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pAftOrder,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pInOrder,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nTreeLen,&nbsp;NODE&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">pRoot)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(pAftOrder&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;pInOrder&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;NODE&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pTemp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;NODE;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTemp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">chValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pAftOrder;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTemp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTemp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">pRoot&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pRoot&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pTemp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nTreeLen&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nLeftLen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CharInStrFirstPos(</span><span style="color: #000000;">*</span><span style="color: #000000;">pAftOrder,&nbsp;pInOrder,&nbsp;nTreeLen);<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(nLeftLen&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nRightLen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nTreeLen&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;nLeftLen&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nLeftLen&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReBuild_AftIn(pAftOrder&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;nRightLen&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;pInOrder,&nbsp;nLeftLen,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">((</span><span style="color: #000000;">*</span><span style="color: #000000;">pRoot)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pLeft));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nRightLen&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReBuild_AftIn(pAftOrder&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;pInOrder&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;nLeftLen&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRightLen,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">((</span><span style="color: #000000;">*</span><span style="color: #000000;">pRoot)</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pRight));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div>
<br />我上传了一个工VC的工程，有兴趣的朋友<a href="http://www.cppblog.com/Files/humanchao/BuildTree.rar">点此下载</a>。代码参考于《编程之美》。<br /> </span><img src ="http://www.cppblog.com/humanchao/aggbug/60174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/humanchao/" target="_blank">胡满超</a> 2008-08-27 17:51 <a href="http://www.cppblog.com/humanchao/archive/2008/08/27/60174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>