﻿<?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++博客-Work-文章分类-结构与算法</title><link>http://www.cppblog.com/lonelycastle/category/17714.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 29 Oct 2012 03:12:50 GMT</lastBuildDate><pubDate>Mon, 29 Oct 2012 03:12:50 GMT</pubDate><ttl>60</ttl><item><title>[转] 计算机科学中最重要的32个算法</title><link>http://www.cppblog.com/lonelycastle/articles/193878.html</link><dc:creator>lonelycastle</dc:creator><author>lonelycastle</author><pubDate>Thu, 25 Oct 2012 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/lonelycastle/articles/193878.html</guid><wfw:comment>http://www.cppblog.com/lonelycastle/comments/193878.html</wfw:comment><comments>http://www.cppblog.com/lonelycastle/articles/193878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lonelycastle/comments/commentRss/193878.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lonelycastle/services/trackbacks/193878.html</trackback:ping><description><![CDATA[A*就足够让我头疼了 更不要说隐马尔科夫...<br /><p style="margin: 0px 0px 0.8em; padding: 0px; line-height: 1.4; color: #333333; font-family: Tahoma, Verdana, STHeiTi, simsun, sans-serif; background-color: #ffffff; "></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />奥地利符号计算研究所（Research&nbsp;Institute&nbsp;for&nbsp;Symbolic&nbsp;Computation，简称RISC）做了一个调查，投票选出32个最重要的算法：<br /><br />A*&nbsp;搜索算法&#8212;&#8212;图形搜索算法，从给定起点到给定终点计算出路径。其中使用了一种启发式的估算，为每个节点估算通过该节点的最佳路径，并以之为各个地点排定次序。算法以得到的次序访问这些节点。因此，A*搜索算法是最佳优先搜索的范例。<br />集束搜索（又名定向搜索，Beam&nbsp;Search）&#8212;&#8212;最佳优先搜索算法的优化。使用启发式函数评估它检查的每个节点的能力。不过，集束搜索只能在每个深度中发现最前面的m个最符合条件的节点，m是固定数字&#8212;&#8212;集束的宽度。<br />二分查找（Binary&nbsp;Search）&#8212;&#8212;在线性数组中找特定值的算法，每个步骤去掉一半不符合要求的数据。<br />分支界定算法（Branch&nbsp;and&nbsp;Bound）&#8212;&#8212;在多种最优化问题中寻找特定最优化解决方案的算法，特别是针对离散、组合的最优化。<br />Buchberger算法&#8212;&#8212;一种数学算法，可将其视为针对单变量最大公约数求解的欧几里得算法和线性系统中高斯消元法的泛化。<br />数据压缩&#8212;&#8212;采取特定编码方案，使用更少的字节数（或是其他信息承载单元）对信息编码的过程，又叫来源编码。<br />Diffie-Hellman密钥交换算法&#8212;&#8212;一种加密协议，允许双方在事先不了解对方的情况下，在不安全的通信信道中，共同建立共享密钥。该密钥以后可与一个对称密码一起，加密后续通讯。<br />Dijkstra算法&#8212;&#8212;针对没有负值权重边的有向图，计算其中的单一起点最短算法。<br />离散微分算法（Discrete&nbsp;differentiation）<br />动态规划算法（Dynamic&nbsp;Programming）&#8212;&#8212;展示互相覆盖的子问题和最优子架构算法<br />欧几里得算法（Euclidean&nbsp;algorithm）&#8212;&#8212;计算两个整数的最大公约数。最古老的算法之一，出现在公元前300前欧几里得的《几何原本》。<br />期望-最大算法（Expectation-maximization&nbsp;algorithm，又名EM-Training）&#8212;&#8212;在统计计算中，期望-最大算法在概率模型中寻找可能性最大的参数估算值，其中模型依赖于未发现的潜在变量。EM在两个步骤中交替计算，第一步是计算期望，利用对隐藏变量的现有估计值，计算其最大可能估计值；第二步是最大化，最大化在第一步上求得的最大可能值来计算参数的值。<br />快速傅里叶变换（Fast&nbsp;Fourier&nbsp;transform，FFT）&#8212;&#8212;计算离散的傅里叶变换（DFT）及其反转。该算法应用范围很广，从数字信号处理到解决偏微分方程，到快速计算大整数乘积。<br />梯度下降（Gradient&nbsp;descent）&#8212;&#8212;一种数学上的最优化算法。<br />哈希算法（Hashing）<br />堆排序（Heaps）<br />Karatsuba乘法&#8212;&#8212;需要完成上千位整数的乘法的系统中使用，比如计算机代数系统和大数程序库，如果使用长乘法，速度太慢。该算法发现于1962年。<br />LLL算法（Lenstra-Lenstra-Lovasz&nbsp;&nbsp;lattice&nbsp;reduction）&#8212;&#8212;以格规约（lattice）基数为输入，输出短正交向量基数。LLL算法在以下公共密钥加密方法中有大量使用：背包加密系统（knapsack）、有特定设置的RSA加密等等。<br />最大流量算法（Maximum&nbsp;flow）&#8212;&#8212;该算法试图从一个流量网络中找到最大的流。它优势被定义为找到这样一个流的值。最大流问题可以看作更复杂的网络流问题的特定情况。最大流与网络中的界面有关，这就是最大流-最小截定理（Max-flow&nbsp;min-cut&nbsp;theorem）。Ford-Fulkerson&nbsp;能找到一个流网络中的最大流。<br />合并排序（Merge&nbsp;Sort）<br />牛顿法（Newton's&nbsp;method）&#8212;&#8212;求非线性方程（组）零点的一种重要的迭代法。<br />Q-learning学习算法&#8212;&#8212;这是一种通过学习动作值函数（action-value&nbsp;function）完成的强化学习算法，函数采取在给定状态的给定动作，并计算出期望的效用价值，在此后遵循固定的策略。Q-leanring的优势是，在不需要环境模型的情况下，可以对比可采纳行动的期望效用。<br />两次筛法（Quadratic&nbsp;Sieve）&#8212;&#8212;现代整数因子分解算法，在实践中，是目前已知第二快的此类算法（仅次于数域筛法Number&nbsp;Field&nbsp;Sieve）。对于110位以下的十位整数，它仍是最快的，而且都认为它比数域筛法更简单。<br />RANSAC&#8212;&#8212;是&#8220;RANdom&nbsp;SAmple&nbsp;Consensus&#8221;的缩写。该算法根据一系列观察得到的数据，数据中包含异常值，估算一个数学模型的参数值。其基本假设是：数据包含非异化值，也就是能够通过某些模型参数解释的值，异化值就是那些不符合模型的数据点。<br />RSA&#8212;&#8212;公钥加密算法。首个适用于以签名作为加密的算法。RSA在电商行业中仍大规模使用，大家也相信它有足够安全长度的公钥。<br />Schnhage-Strassen算法&#8212;&#8212;在数学中，Schnhage-Strassen算法是用来完成大整数的乘法的快速渐近算法。其算法复杂度为：O(N&nbsp;log(N)&nbsp;log(log(N)))，该算法使用了傅里叶变换。<br />单纯型算法（Simplex&nbsp;Algorithm）&#8212;&#8212;在数学的优化理论中，单纯型算法是常用的技术，用来找到线性规划问题的数值解。线性规划问题包括在一组实变量上的一系列线性不等式组，以及一个等待最大化（或最小化）的固定线性函数。<br />奇异值分解（Singular&nbsp;value&nbsp;decomposition，简称SVD）&#8212;&#8212;在线性代数中，SVD是重要的实数或复数矩阵的分解方法，在信号处理和统计中有多种应用，比如计算矩阵的伪逆矩阵（以求解最小二乘法问题）、解决超定线性系统（overdetermined&nbsp;linear&nbsp;systems）、矩阵逼近、数值天气预报等等。<br />求解线性方程组（Solving&nbsp;a&nbsp;system&nbsp;of&nbsp;linear&nbsp;equations）&#8212;&#8212;线性方程组是数学中最古老的问题，它们有很多应用，比如在数字信号处理、线性规划中的估算和预测、数值分析中的非线性问题逼近等等。求解线性方程组，可以使用高斯&#8212;约当消去法（Gauss-Jordan&nbsp;elimination），或是柯列斯基分解（&nbsp;Cholesky&nbsp;decomposition）。<br />Strukturtensor算法&#8212;&#8212;应用于模式识别领域，为所有像素找出一种计算方法，看看该像素是否处于同质区域（&nbsp;homogenous&nbsp;region），看看它是否属于边缘，还是是一个顶点。<br />合并查找算法（Union-find）&#8212;&#8212;给定一组元素，该算法常常用来把这些元素分为多个分离的、彼此不重合的组。不相交集（disjoint-set）的数据结构可以跟踪这样的切分方法。合并查找算法可以在此种数据结构上完成两个有用的操作：<br />查找：判断某特定元素属于哪个组。<br />合并：联合或合并两个组为一个组。<br />维特比算法（Viterbi&nbsp;algorithm）&#8212;&#8212;寻找隐藏状态最有可能序列的动态规划算法，这种序列被称为维特比路径，其结果是一系列可以观察到的事件，特别是在隐藏的Markov模型中。<br /></span><span style="color: #008000; ">*/</span></div><p>&nbsp;</p> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/lonelycastle/aggbug/193878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lonelycastle/" target="_blank">lonelycastle</a> 2012-10-25 23:39 <a href="http://www.cppblog.com/lonelycastle/articles/193878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 计算机科学中最重要的32个算法</title><link>http://www.cppblog.com/lonelycastle/articles/193877.html</link><dc:creator>lonelycastle</dc:creator><author>lonelycastle</author><pubDate>Thu, 25 Oct 2012 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/lonelycastle/articles/193877.html</guid><wfw:comment>http://www.cppblog.com/lonelycastle/comments/193877.html</wfw:comment><comments>http://www.cppblog.com/lonelycastle/articles/193877.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lonelycastle/comments/commentRss/193877.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lonelycastle/services/trackbacks/193877.html</trackback:ping><description><![CDATA[A*就足够让我头疼了 更不要说隐马尔科夫...<br /><p style="margin: 0px 0px 0.8em; padding: 0px; line-height: 1.4; color: #333333; font-family: Tahoma, Verdana, STHeiTi, simsun, sans-serif; background-color: #ffffff; "></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />奥地利符号计算研究所（Research&nbsp;Institute&nbsp;for&nbsp;Symbolic&nbsp;Computation，简称RISC）做了一个调查，投票选出32个最重要的算法：<br /><br />A*&nbsp;搜索算法&#8212;&#8212;图形搜索算法，从给定起点到给定终点计算出路径。其中使用了一种启发式的估算，为每个节点估算通过该节点的最佳路径，并以之为各个地点排定次序。算法以得到的次序访问这些节点。因此，A*搜索算法是最佳优先搜索的范例。<br />集束搜索（又名定向搜索，Beam&nbsp;Search）&#8212;&#8212;最佳优先搜索算法的优化。使用启发式函数评估它检查的每个节点的能力。不过，集束搜索只能在每个深度中发现最前面的m个最符合条件的节点，m是固定数字&#8212;&#8212;集束的宽度。<br />二分查找（Binary&nbsp;Search）&#8212;&#8212;在线性数组中找特定值的算法，每个步骤去掉一半不符合要求的数据。<br />分支界定算法（Branch&nbsp;and&nbsp;Bound）&#8212;&#8212;在多种最优化问题中寻找特定最优化解决方案的算法，特别是针对离散、组合的最优化。<br />Buchberger算法&#8212;&#8212;一种数学算法，可将其视为针对单变量最大公约数求解的欧几里得算法和线性系统中高斯消元法的泛化。<br />数据压缩&#8212;&#8212;采取特定编码方案，使用更少的字节数（或是其他信息承载单元）对信息编码的过程，又叫来源编码。<br />Diffie-Hellman密钥交换算法&#8212;&#8212;一种加密协议，允许双方在事先不了解对方的情况下，在不安全的通信信道中，共同建立共享密钥。该密钥以后可与一个对称密码一起，加密后续通讯。<br />Dijkstra算法&#8212;&#8212;针对没有负值权重边的有向图，计算其中的单一起点最短算法。<br />离散微分算法（Discrete&nbsp;differentiation）<br />动态规划算法（Dynamic&nbsp;Programming）&#8212;&#8212;展示互相覆盖的子问题和最优子架构算法<br />欧几里得算法（Euclidean&nbsp;algorithm）&#8212;&#8212;计算两个整数的最大公约数。最古老的算法之一，出现在公元前300前欧几里得的《几何原本》。<br />期望-最大算法（Expectation-maximization&nbsp;algorithm，又名EM-Training）&#8212;&#8212;在统计计算中，期望-最大算法在概率模型中寻找可能性最大的参数估算值，其中模型依赖于未发现的潜在变量。EM在两个步骤中交替计算，第一步是计算期望，利用对隐藏变量的现有估计值，计算其最大可能估计值；第二步是最大化，最大化在第一步上求得的最大可能值来计算参数的值。<br />快速傅里叶变换（Fast&nbsp;Fourier&nbsp;transform，FFT）&#8212;&#8212;计算离散的傅里叶变换（DFT）及其反转。该算法应用范围很广，从数字信号处理到解决偏微分方程，到快速计算大整数乘积。<br />梯度下降（Gradient&nbsp;descent）&#8212;&#8212;一种数学上的最优化算法。<br />哈希算法（Hashing）<br />堆排序（Heaps）<br />Karatsuba乘法&#8212;&#8212;需要完成上千位整数的乘法的系统中使用，比如计算机代数系统和大数程序库，如果使用长乘法，速度太慢。该算法发现于1962年。<br />LLL算法（Lenstra-Lenstra-Lovasz&nbsp;&nbsp;lattice&nbsp;reduction）&#8212;&#8212;以格规约（lattice）基数为输入，输出短正交向量基数。LLL算法在以下公共密钥加密方法中有大量使用：背包加密系统（knapsack）、有特定设置的RSA加密等等。<br />最大流量算法（Maximum&nbsp;flow）&#8212;&#8212;该算法试图从一个流量网络中找到最大的流。它优势被定义为找到这样一个流的值。最大流问题可以看作更复杂的网络流问题的特定情况。最大流与网络中的界面有关，这就是最大流-最小截定理（Max-flow&nbsp;min-cut&nbsp;theorem）。Ford-Fulkerson&nbsp;能找到一个流网络中的最大流。<br />合并排序（Merge&nbsp;Sort）<br />牛顿法（Newton's&nbsp;method）&#8212;&#8212;求非线性方程（组）零点的一种重要的迭代法。<br />Q-learning学习算法&#8212;&#8212;这是一种通过学习动作值函数（action-value&nbsp;function）完成的强化学习算法，函数采取在给定状态的给定动作，并计算出期望的效用价值，在此后遵循固定的策略。Q-leanring的优势是，在不需要环境模型的情况下，可以对比可采纳行动的期望效用。<br />两次筛法（Quadratic&nbsp;Sieve）&#8212;&#8212;现代整数因子分解算法，在实践中，是目前已知第二快的此类算法（仅次于数域筛法Number&nbsp;Field&nbsp;Sieve）。对于110位以下的十位整数，它仍是最快的，而且都认为它比数域筛法更简单。<br />RANSAC&#8212;&#8212;是&#8220;RANdom&nbsp;SAmple&nbsp;Consensus&#8221;的缩写。该算法根据一系列观察得到的数据，数据中包含异常值，估算一个数学模型的参数值。其基本假设是：数据包含非异化值，也就是能够通过某些模型参数解释的值，异化值就是那些不符合模型的数据点。<br />RSA&#8212;&#8212;公钥加密算法。首个适用于以签名作为加密的算法。RSA在电商行业中仍大规模使用，大家也相信它有足够安全长度的公钥。<br />Schnhage-Strassen算法&#8212;&#8212;在数学中，Schnhage-Strassen算法是用来完成大整数的乘法的快速渐近算法。其算法复杂度为：O(N&nbsp;log(N)&nbsp;log(log(N)))，该算法使用了傅里叶变换。<br />单纯型算法（Simplex&nbsp;Algorithm）&#8212;&#8212;在数学的优化理论中，单纯型算法是常用的技术，用来找到线性规划问题的数值解。线性规划问题包括在一组实变量上的一系列线性不等式组，以及一个等待最大化（或最小化）的固定线性函数。<br />奇异值分解（Singular&nbsp;value&nbsp;decomposition，简称SVD）&#8212;&#8212;在线性代数中，SVD是重要的实数或复数矩阵的分解方法，在信号处理和统计中有多种应用，比如计算矩阵的伪逆矩阵（以求解最小二乘法问题）、解决超定线性系统（overdetermined&nbsp;linear&nbsp;systems）、矩阵逼近、数值天气预报等等。<br />求解线性方程组（Solving&nbsp;a&nbsp;system&nbsp;of&nbsp;linear&nbsp;equations）&#8212;&#8212;线性方程组是数学中最古老的问题，它们有很多应用，比如在数字信号处理、线性规划中的估算和预测、数值分析中的非线性问题逼近等等。求解线性方程组，可以使用高斯&#8212;约当消去法（Gauss-Jordan&nbsp;elimination），或是柯列斯基分解（&nbsp;Cholesky&nbsp;decomposition）。<br />Strukturtensor算法&#8212;&#8212;应用于模式识别领域，为所有像素找出一种计算方法，看看该像素是否处于同质区域（&nbsp;homogenous&nbsp;region），看看它是否属于边缘，还是是一个顶点。<br />合并查找算法（Union-find）&#8212;&#8212;给定一组元素，该算法常常用来把这些元素分为多个分离的、彼此不重合的组。不相交集（disjoint-set）的数据结构可以跟踪这样的切分方法。合并查找算法可以在此种数据结构上完成两个有用的操作：<br />查找：判断某特定元素属于哪个组。<br />合并：联合或合并两个组为一个组。<br />维特比算法（Viterbi&nbsp;algorithm）&#8212;&#8212;寻找隐藏状态最有可能序列的动态规划算法，这种序列被称为维特比路径，其结果是一系列可以观察到的事件，特别是在隐藏的Markov模型中。<br /></span><span style="color: #008000; ">*/</span></div><p>&nbsp;</p> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/lonelycastle/aggbug/193877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lonelycastle/" target="_blank">lonelycastle</a> 2012-10-25 23:39 <a href="http://www.cppblog.com/lonelycastle/articles/193877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL的内存管理&lt;转&gt;</title><link>http://www.cppblog.com/lonelycastle/articles/156149.html</link><dc:creator>lonelycastle</dc:creator><author>lonelycastle</author><pubDate>Sun, 18 Sep 2011 15:46:00 GMT</pubDate><guid>http://www.cppblog.com/lonelycastle/articles/156149.html</guid><wfw:comment>http://www.cppblog.com/lonelycastle/comments/156149.html</wfw:comment><comments>http://www.cppblog.com/lonelycastle/articles/156149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lonelycastle/comments/commentRss/156149.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lonelycastle/services/trackbacks/156149.html</trackback:ping><description><![CDATA[ref.&nbsp;<a href="http://blog.chinaunix.net/space.php?uid=17102734&amp;do=blog&amp;id=2830234">http://blog.chinaunix.net/space.php?uid=17102734&amp;do=blog&amp;id=2830234<br /><br />S</a>TL为每个容器指定了空间配置器SGI？<br />它是双层的 第一层为malloc &amp; free 当区块大小超过128字节时 调用第一层配置器<br />第二层为内存池链表 一共维护16个不同sizeof的链表 从8Byte到128Byte<div class="vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/lonelycastle/aggbug/156149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lonelycastle/" target="_blank">lonelycastle</a> 2011-09-18 23:46 <a href="http://www.cppblog.com/lonelycastle/articles/156149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于数组的几个题</title><link>http://www.cppblog.com/lonelycastle/articles/156088.html</link><dc:creator>lonelycastle</dc:creator><author>lonelycastle</author><pubDate>Sun, 18 Sep 2011 01:40:00 GMT</pubDate><guid>http://www.cppblog.com/lonelycastle/articles/156088.html</guid><wfw:comment>http://www.cppblog.com/lonelycastle/comments/156088.html</wfw:comment><comments>http://www.cppblog.com/lonelycastle/articles/156088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lonelycastle/comments/commentRss/156088.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lonelycastle/services/trackbacks/156088.html</trackback:ping><description><![CDATA[求整形数组中满足两数之和为sum的数值对<br />&nbsp;&nbsp;&nbsp;1. 最直观的想法是两个for循环遍历两数之和 如果有=sum 输出 。O(n^2)<br />&nbsp;&nbsp;&nbsp;2. 如果<span style="background-color: yellow; ">先排序</span>，则会简单很多<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;排序后 用两个指针指ij向数组头尾 然后头尾相加 &gt;sum则j-- &lt;sum则i++ O(NlogN+N/2)<br />&nbsp;&nbsp;&nbsp;3. 排序 然后设b=sum-a[i] 然后二分查找b O(NlogN+NlogN)<br />&nbsp;&nbsp;&nbsp;大概如此 关键在于 排序使问题变得很简单 复杂度从N^2下降到NlogN了<br />ref.&nbsp;<a href="http://blog.csdn.net/hopestar2/article/details/4658669">http://blog.csdn.net/hopestar2/article/details/4658669</a><br /><br />发帖水王<br />&nbsp; &nbsp;思路1：排序-&gt;一次遍历知最大次数 O(NlogN)<br />&nbsp;&nbsp;&nbsp;思路2：<div></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数组中有个数字出现的次数超过了数组长度的一半。也就是说，<span style="background-color: yellow; ">有个数字出现的次数比其他所有数字出现次数的和还要多。</span>因此我们可以考虑在遍历数组的时候保存两个值：一个是数组中的一个数字，一个是次数。当我们遍历到下一个数字的时候，如果下一个数字和我们之前保存的数字相同，则次数加1。如果下一个数字和我们之前保存的数字不同，则次数减1。如果次数为零，我们需要保存下一个数字，并把次数设为1。由于我们要找的数字出现的次数比其他所有数字出现的次数之和还要多，那么要找的数字肯定是最后一次把次数设为1时对应的数字。O(N)!!<br /><div>ref.&nbsp;<a href="http://hc6900.blog.163.com/blog/static/11666002720112296329410/">http://hc6900.blog.163.com/blog/static/11666002720112296329410/<br /><br /></a><div>第一个只出现一次的字符<br />&nbsp;&nbsp;&nbsp;没有思路的思路：对数组每个元素 遍历数组 记录它出现的次数 &gt;1则continue O(N^2)</div>&nbsp;&nbsp;&nbsp;思路1：由于是字符 所以可以按照ascii排序 然后遍历之 O(NlogN+N)<br />&nbsp;&nbsp;&nbsp;思路2：HASH 先<span style="background-color: yellow; ">建一HASH表</span> 每个acsii为1个key 然后遍历以记录各字符的次数 然后遍历寻找最大值 O(N+N)<br /><div>ref.&nbsp;<a href="http://zhedahht.blog.163.com/blog/static/25411174200722191722430/">http://zhedahht.blog.163.com/blog/static/25411174200722191722430/<br /><br /></a><a href="http://blog.csdn.net/yysdsyl/article/details/5419482" title="面试题精选（86）：O(lgn)时间内找出有序数组中某个元素出现的次数">O(lgN)时间内找出有序数组中某个元素出现的次数<br /></a>既然数组已然有序 那么最直接的想法就是遍历 但时间复杂度为O(N)<br />若要O(lgN) 那应该想到<span style="background-color: yellow; color: red; ">二叉树</span>！！ 于是&nbsp;binary_search找到指定元素，然后左右查询，得到出现的次数k，但其时间复杂度为O(lgn)+k。<br /><div>可通过改进binary_search，做两次查找，一次得到指定元素的起始出现位置，一次得到终止出现位置。<br />ref.&nbsp;<a href="http://blog.csdn.net/yysdsyl/article/details/5419482">http://blog.csdn.net/yysdsyl/article/details/5419482<br /><br /></a>大数相加<br />&nbsp; &nbsp;思路:存为数组然后对位相加<br />&nbsp; &nbsp; &nbsp; tmpSum=a[i]+b[i];<br />&nbsp; &nbsp; &nbsp; sum[i]+=tmpSum%10;<br />&nbsp; &nbsp; &nbsp; sum[i+1]+=tmpSum/10;<br /><a href="http://blog.csdn.net/yysdsyl/article/details/5419482"><br /></a>今天被人人网电面的一个题目:<br />字符串数组 去掉空格<br /><span style="background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;期待回答: </span><span style="background-color: yellow; ">递归之<br />&nbsp;&nbsp;&nbsp;遇到这种题 一定不可以妄想先把空格标识出来再做处理<br />&nbsp;&nbsp;&nbsp;而每次遇到空格都把后面所有向前挪也是不可取的<br /></span><span style="background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;思路2: 遍历过程中每次遇到一个空格 就把后面第一个不是空格的元素挪到空格的位置 继续<br /><div>递归和非递归思路如下:<br /><div><div>#include &lt;stdio.h&gt;</div><div>#include &lt;stdlib.h&gt;</div><div>#include &lt;string.h&gt;</div><div></div><div>//#define STR "ab c &nbsp;efg &nbsp;"</div><div></div><div>void No_recurse(char *STR)</div><div>{</div><div>&nbsp; &nbsp; char *p=NULL, *q=NULL, *tmp=NULL;</div><div>&nbsp; &nbsp; for (p=STR,q=STR; *p!='\0'; p++)</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (*p==' '||*p=='\t')</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (p!=q)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *q = *p;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *p = ' ';</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; q++;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; *q='\0';</div><div>&nbsp; &nbsp; //printf("%s\n", STR);</div><div>}</div><div></div><div>void Recurse(char *p, char *q)</div><div>{</div><div>&nbsp; &nbsp; if (*p == '\0')</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; *q = '\0';</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; if (*p==' '||*p=='\t')</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Recurse(p+1, q);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; if (p!=q)</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; *q = *p;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; *p = ' ';</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; Recurse(p+1, q+1);</div><div>&nbsp; &nbsp; return;</div><div>}</div><div></div><div>int main()</div><div>{</div><div>&nbsp; &nbsp;char STR[20]= "ab c &nbsp;efg &nbsp;";</div><div></div><div>&nbsp; &nbsp;Recurse(STR, STR);</div><div>&nbsp; &nbsp;//No_recurse(STR);</div><div></div><div>&nbsp; &nbsp;printf("%s\n", STR);</div><div></div><div>&nbsp; &nbsp;return 0;</div><div>}</div></div></div></span><span style="background-color: yellow; "></span></div></div><div></div><a href="http://hc6900.blog.163.com/blog/static/11666002720112296329410/"></a></div><div></div><div></div><div></div> <div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div> <div></div> <div></div><div></div><div></div><div></div><div class="vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div> <div class="vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div> <div class="vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div> <div class="vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/lonelycastle/aggbug/156088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lonelycastle/" target="_blank">lonelycastle</a> 2011-09-18 09:40 <a href="http://www.cppblog.com/lonelycastle/articles/156088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于单链表的几道题</title><link>http://www.cppblog.com/lonelycastle/articles/155460.html</link><dc:creator>lonelycastle</dc:creator><author>lonelycastle</author><pubDate>Fri, 09 Sep 2011 08:33:00 GMT</pubDate><guid>http://www.cppblog.com/lonelycastle/articles/155460.html</guid><wfw:comment>http://www.cppblog.com/lonelycastle/comments/155460.html</wfw:comment><comments>http://www.cppblog.com/lonelycastle/articles/155460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lonelycastle/comments/commentRss/155460.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lonelycastle/services/trackbacks/155460.html</trackback:ping><description><![CDATA[1. 给单链表排序<br />2. 单链表反置<br />3. 删除特定元素（指针指定）<br />4. 找出中间元素<br />5. 判断链表中是否有环<br /><br />参考答案<br /><a href="http://www.cppblog.com/koson/archive/2010/04/21/113142.html">http://www.cppblog.com/koson/archive/2010/04/21/113142.html<br /></a><div><a href="http://blog.csdn.net/hojor/article/details/6227304">http://blog.csdn.net/hojor/article/details/6227304</a></div><a href="http://www.cppblog.com/koson/archive/2010/04/21/113142.html"></a><div class="vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/lonelycastle/aggbug/155460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lonelycastle/" target="_blank">lonelycastle</a> 2011-09-09 16:33 <a href="http://www.cppblog.com/lonelycastle/articles/155460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>