﻿<?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++博客-mengkai-随笔分类-algorithm</title><link>http://www.cppblog.com/mengkai/category/17832.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 26 May 2012 04:29:11 GMT</lastBuildDate><pubDate>Sat, 26 May 2012 04:29:11 GMT</pubDate><ttl>60</ttl><item><title>装载 从决策树学习谈到贝叶斯分类算法、EM、HMM </title><link>http://www.cppblog.com/mengkai/archive/2012/05/21/175628.html</link><dc:creator>mengkai</dc:creator><author>mengkai</author><pubDate>Mon, 21 May 2012 12:14:00 GMT</pubDate><guid>http://www.cppblog.com/mengkai/archive/2012/05/21/175628.html</guid><wfw:comment>http://www.cppblog.com/mengkai/comments/175628.html</wfw:comment><comments>http://www.cppblog.com/mengkai/archive/2012/05/21/175628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mengkai/comments/commentRss/175628.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mengkai/services/trackbacks/175628.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 源地址：http://blog.csdn.net/v_july_v/article/details/7577684http://blog.csdn.net/v_july_v/article/details/6142146 数据挖掘领域十大经典算法初探&nbsp;&nbsp;&nbsp; 第一篇：从决策树学习谈到贝叶斯分类算法、EM、HMM引言&nbsp; &nbsp; 最近在面...&nbsp;&nbsp;<a href='http://www.cppblog.com/mengkai/archive/2012/05/21/175628.html'>阅读全文</a><img src ="http://www.cppblog.com/mengkai/aggbug/175628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mengkai/" target="_blank">mengkai</a> 2012-05-21 20:14 <a href="http://www.cppblog.com/mengkai/archive/2012/05/21/175628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个关于递归相当的斐波那契数列的各种解法</title><link>http://www.cppblog.com/mengkai/archive/2011/10/26/159141.html</link><dc:creator>mengkai</dc:creator><author>mengkai</author><pubDate>Wed, 26 Oct 2011 09:46:00 GMT</pubDate><guid>http://www.cppblog.com/mengkai/archive/2011/10/26/159141.html</guid><wfw:comment>http://www.cppblog.com/mengkai/comments/159141.html</wfw:comment><comments>http://www.cppblog.com/mengkai/archive/2011/10/26/159141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mengkai/comments/commentRss/159141.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mengkai/services/trackbacks/159141.html</trackback:ping><description><![CDATA[<div><span style="font-size: 12px;">对于斐波那契数列的求解过程的几种方法的比较</span></div><div><span style="font-size: 12px;">（1）最基本的方法：递归实现，使用公式为f[n] = f[n-1] + f[n-2];递归</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">结束条件是f[1]=1，f[2]=1。</span></div><div><span style="font-size: 12px;">（2）数组实现：空间复杂度和时间复杂度都是O（N），效率一般，比递归来</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">的快。</span></div><div><span style="font-size: 12px;">（3）vector&lt;int&gt;实现，时间复杂度是O(N)，空间复杂度O(1)，但是不知道</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">效率会高不高，当然vector有自己的属性会占用资源。</span></div><div><span style="font-size: 12px;">（4）queue&lt;int&gt;实现，当然队列数组更适合实现斐波那契数列，时间复杂度</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">和空间复杂度和vector一样。但是queue太合适这里了，</span></div><div><span style="font-size: 12px;">f(n)=f(n-1)+f(n-2)，f(n)只和f(n-1)和f(n-2)有关，f(n)入队列后，f(n-</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">2)就可以出队列了。</span></div><div><span style="font-size: 12px;">（5）迭代实现：迭代效率最高，时间复杂度是O(N)，空间复杂度是O(1)，</span></div><div><span style="font-size: 12px;">（6）百度的提供的一种公式法。 &nbsp; 由于double类型的精度还不够，所以程</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">序算出来的结果会有误差，如果把公式展开计算，得出的结果就是正确的。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">具体代码如下：</span></div><div><span style="font-size: 12px;">//递归</span></div><div><span style="font-size: 12px;">int fib1(int num)</span></div><div><span style="font-size: 12px;">{</span></div><div><span style="font-size: 12px;">if(num&lt;1)</span></div><div><span style="font-size: 12px;">return &nbsp;-1;</span></div><div><span style="font-size: 12px;">if(num == 1 || num == 2)</span></div><div><span style="font-size: 12px;">return 1;</span></div><div><span style="font-size: 12px;">return f(n-1)+f(n-2);</span></div><div><span style="font-size: 12px;">}</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">//数组实现</span></div><div><span style="font-size: 12px;">int fib2(int num)</span></div><div><span style="font-size: 12px;">{</span></div><div><span style="font-size: 12px;">if(num&lt;1)</span></div><div><span style="font-size: 12px;">return &nbsp;-1;</span></div><div><span style="font-size: 12px;">if(num&lt;3)</span></div><div><span style="font-size: 12px;">{</span></div><div><span style="font-size: 12px;">return 1;</span></div><div><span style="font-size: 12px;">}</span></div><div><span style="font-size: 12px;">int *a = new int[num];</span></div><div><span style="font-size: 12px;">a[0] = a[1] = 1;</span></div><div><span style="font-size: 12px;">for(int i = 2;i&lt;num;i++)</span></div><div><span style="font-size: 12px;">a[i] = a[i-1] + a[i-2];</span></div><div><span style="font-size: 12px;">int ret = a[num-1];</span></div><div><span style="font-size: 12px;">delete[] a;</span></div><div><span style="font-size: 12px;">return ret;</span></div><div><span style="font-size: 12px;">}</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">//vector&lt;int&gt;</span></div><div><span style="font-size: 12px;">int fib3(int num)</span></div><div><span style="font-size: 12px;">{</span></div><div><span style="font-size: 12px;">if(num&lt;1)</span></div><div><span style="font-size: 12px;">return &nbsp;-1;</span></div><div><span style="font-size: 12px;">vector&lt;int&gt;a(2,1);</span></div><div><span style="font-size: 12px;">a.reserve(3);</span></div><div><span style="font-size: 12px;">for(int i = 2;i&lt;num;i++)</span></div><div><span style="font-size: 12px;">{</span></div><div><span style="font-size: 12px;">a.insert(a.begin(),a.at(0)+a.at(1));</span></div><div><span style="font-size: 12px;">a.pop_back();</span></div><div><span style="font-size: 12px;">}</span></div><div><span style="font-size: 12px;">return a.at(0);</span></div><div><span style="font-size: 12px;">}</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">//queue&lt;int&gt;实现</span></div><div><span style="font-size: 12px;">int fib4(int num)</span></div><div><span style="font-size: 12px;">{</span></div><div><span style="font-size: 12px;">if(num&lt;1)</span></div><div><span style="font-size: 12px;">return &nbsp;-1;</span></div><div><span style="font-size: 12px;">queue&lt;int&gt;q;</span></div><div><span style="font-size: 12px;">q.push(1);</span></div><div><span style="font-size: 12px;">q.push(1);</span></div><div><span style="font-size: 12px;">for(int i = 2;i&lt;num;i++)</span></div><div><span style="font-size: 12px;">{</span></div><div><span style="font-size: 12px;">q.push(q.front()+q.back());</span></div><div><span style="font-size: 12px;">q.pop();</span></div><div><span style="font-size: 12px;">}</span></div><div><span style="font-size: 12px;">return q.pop();</span></div><div><span style="font-size: 12px;">}</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">//迭代实现</span></div><div><span style="font-size: 12px;">int fib5(int num)</span></div><div><span style="font-size: 12px;">{</span></div><div><span style="font-size: 12px;">int i,a=1,b = 1,c = 1;</span></div><div><span style="font-size: 12px;">if(num&lt;1)</span></div><div><span style="font-size: 12px;">return &nbsp;-1;</span></div><div><span style="font-size: 12px;">for(i = 2;i&lt;num;i++)</span></div><div><span style="font-size: 12px;">{</span></div><div><span style="font-size: 12px;">c= a + b;</span></div><div><span style="font-size: 12px;">a = b;</span></div><div><span style="font-size: 12px;">b = c;</span></div><div><span style="font-size: 12px;">}</span></div><div><span style="font-size: 12px;">return c;</span></div><div><span style="font-size: 12px;">}</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">//公式实现</span></div><div><span style="font-size: 12px;">int fib6(int num)</span></div><div><span style="font-size: 12px;">{</span></div><div><span style="font-size: 12px;">double gh = sqrt((double)5);</span></div><div><span style="font-size: 12px;">return pow(1+(1+gh),n-pow(1-gh))/(pow((double)2,n)*gh);</span></div><div><span style="font-size: 12px;">}</span></div><img src ="http://www.cppblog.com/mengkai/aggbug/159141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mengkai/" target="_blank">mengkai</a> 2011-10-26 17:46 <a href="http://www.cppblog.com/mengkai/archive/2011/10/26/159141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>这几天看了一些关于递归的算法，现在我也自己写个关于递归的总结，</title><link>http://www.cppblog.com/mengkai/archive/2011/10/22/158889.html</link><dc:creator>mengkai</dc:creator><author>mengkai</author><pubDate>Sat, 22 Oct 2011 13:22:00 GMT</pubDate><guid>http://www.cppblog.com/mengkai/archive/2011/10/22/158889.html</guid><description><![CDATA[递归算法：基本含义，一个函数或者数学结构，如果在其定义或说明内部直接或间接得出现对其本身的引用，或者是为了描述问题的某一个状态，必须要用它的上一个状态，而描述上一个状态，又必须用到它的上一个状态，这种定义，称为递归或递归定义。在程序设计上，当函数直接调用本身或者间接调用本身，称为递归调用。<br /><span style="font-family: 宋体; font-size: 10.5pt; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">递归的最简单应用：通过各项关系及初值求数列的某一项。</span><br />（1）
<p style="text-indent: 21pt"><span style="font-family: 宋体">比如阶乘数列</span></p>
<p style="text-indent: 21pt">1<span style="font-family: 宋体">、</span>2<span style="font-family: 宋体">、</span>6<span style="font-family: 宋体">、</span>24<span style="font-family: 宋体">、</span>120<span style="font-family: 宋体">、</span>720<span style="font-family: 宋体">&#8230;&#8230;</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">如果用上面的方式来描述它，应该是：</span></p>
<p style="text-indent: 21pt"><span style="position: relative; top: 16pt"></span></p>，程序实现<br />int fun(int x)<br />{<br />&nbsp;&nbsp;&nbsp;if(x == 1)<br />&nbsp;&nbsp;&nbsp;return 1;<br />&nbsp;&nbsp;&nbsp;return n*fun(n-1);<br />}<br />(2)找出组合数<br /><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 23px; font-family: simsun; font-size: 14px" class="Apple-style-span">找出从自然数1、2、&#8230;&#8230;、n中任取r个数的所有组合。例如n=5，r=3的所有组合为： &nbsp;<span class="Apple-converted-space">&nbsp;</span><br /><br />&nbsp; &nbsp; &nbsp; （1）5、4、3 &nbsp; &nbsp; （2）5、4、2 &nbsp; &nbsp; （3）5、4、1<span class="Apple-converted-space">&nbsp;</span><br />&nbsp; &nbsp; &nbsp; （4）5、3、2 &nbsp; &nbsp; （5）5、3、1 &nbsp; &nbsp; （6）5、2、1<span class="Apple-converted-space">&nbsp;</span><br />&nbsp; &nbsp; &nbsp; （7）4、3、2 &nbsp; &nbsp; （8）4、3、1 &nbsp; &nbsp; （9）4、2、1<span class="Apple-converted-space">&nbsp;</span><br />&nbsp; &nbsp; &nbsp; （10）3、2、1<span class="Apple-converted-space">&nbsp;<br />如何实现呢？<br />首先分析10个组合，我们可以采用递归来实现，假设函数为combo(int m,int n);为找到自然数1-m中任取K个数组合，当第一个数选定后，后面的k-1个数是从m-1各数中选择得到。我们发现这将是将m选k个数转换为m-1个数中选k-1个数的组合数。为了解决此问题，我们可以定义个数组A，数组的第一个元素为k，约定函数将确定的k个数字的组合第一个数放在A[k]中，当一个组合求出后，才将数组A的一个组合输出，第一个数可以是m-k，函数将确定组合的第一个数放入数组后，有两种可能的选择，因还未到顶组合的其余元素，继续递归确定，或因一确定了组合的全部元素，输出这个组合，<br />具体代码：<br />//递归求解组合数<br />#define&nbsp; MAX 100<br />int a[MAX];<br />void combo(int m,int k)<br />{<br />&nbsp;int i,j;<br />&nbsp;for (i = m;i&gt;=k;i--)<br />&nbsp;{<br />&nbsp;&nbsp;a[k] = i;<br />&nbsp;&nbsp;if (k&gt;1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;comb(m-1,k-1);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;for (j = a[0];j&gt;0;j--)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%4d",a[j]);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;printf("\n");<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}<br /><br />更多的练习，<br />
<p>前几天在博客园看到有人面试时，遇到递归算法题，一时手痒就解了一个。顺便网上又找来几个，也实现了。给大家分享一下，开阔一下思路，没准你明天面试就能用上。</p>
<p>1、编写一个方法用于验证指定的字符串是否为反转字符，返回true和false。请用递归算法实现。（反转字符串样式为"abcdedcba"）</p>
<p>2、一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30个是多少</p>
<p>3、一列数的规则如下: 1、12、123、1234、12345、123456......,求第n个数的递归算法（n&lt;=9）。</p>
<p>4、将一整数逆序，如987654321变为123456789。</p>
<p>5、<span>一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种?</span></p><br /></span></span></span><img src ="http://www.cppblog.com/mengkai/aggbug/158889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mengkai/" target="_blank">mengkai</a> 2011-10-22 21:22 <a href="http://www.cppblog.com/mengkai/archive/2011/10/22/158889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 程序员面试100题之八：不要被阶乘吓倒</title><link>http://www.cppblog.com/mengkai/archive/2011/09/29/157133.html</link><dc:creator>mengkai</dc:creator><author>mengkai</author><pubDate>Thu, 29 Sep 2011 05:51:00 GMT</pubDate><guid>http://www.cppblog.com/mengkai/archive/2011/09/29/157133.html</guid><wfw:comment>http://www.cppblog.com/mengkai/comments/157133.html</wfw:comment><comments>http://www.cppblog.com/mengkai/archive/2011/09/29/157133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mengkai/comments/commentRss/157133.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mengkai/services/trackbacks/157133.html</trackback:ping><description><![CDATA[<div>对于阶乘是个很有意思的函数，给定一个整数，那么它的阶乘是多少那？而它末尾有多少个0，<br />对于这个问题，是不是要直接计算N!？如果溢出怎么办，我们如何快速的找到该题的结果？首先要思考的N!= M*10^E。在N之前你需要看看那几个的成绩满足即可，比如2*5=10，所有2和5乘积就可以得到一个10，于是由于能被2整除的整数的频率要高于能被5整除的，所以我们可以取5考即可。<br />方法一从1开始到N，算出符合要求的个数。int result=0;<br />for(i = 1;i&lt;=N;i++)<br />{<br />&nbsp;&nbsp;&nbsp;j = i;<br />&nbsp;&nbsp;&nbsp;while(j%5 == 0)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result++;<span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 12px/18px Consolas, 'Courier New', Courier, mono, serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="border-bottom-style: none; padding-bottom: 0px; border-right-style: none; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-style: none; color: rgb(0,130,0); border-left-style: none; padding-top: 0px" class="comment">//统计N的阶乘中那些能够被5整除的因子的个数</span><span style="border-bottom-style: none; padding-bottom: 0px; border-right-style: none; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-style: none; color: black; border-left-style: none; padding-top: 0px">&nbsp;&nbsp;</span></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j/5;<br />&nbsp;&nbsp;&nbsp;}<br />}<br />或者是while(N)<br />{<br />&nbsp;&nbsp;&nbsp;result+=N/5;<br />&nbsp;&nbsp;&nbsp;N/=5;<br />}<br /><br />类似可以求解二进制的问题，比如求N!的二进制中最低位1的位置。<br />由于N!中含有质数2的个数。等于N/2+N/4+N/8....1.<br />int lowOfone(int n)<br />{<br />int result = 0;<br />while (n)<br /><br />{<br />n&gt;&gt;=1;<br />result+=n;<br />}<br />return result;<br />}<br />对于<span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 16px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">给定整数n，判断它是否为2的方幂（解答提示：n&gt;0&amp;&amp;（（n&amp;（n-1））==0））。<span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"> 
<p><span style="font-size: 16px">转载：<br />【N!二进制的解法二】</span></p>
<p><span style="font-size: 16px">N！含有质因数2的个数，还等于N减去N的二进制表示中1的数目。我们还可以通过这个规律来求解。</span></p>
<p><span style="font-size: 16px">下面对这个规律进行举例说明，假设 N = 11011，那么N!中含有质因数2的个数为 N/2 + N/4 + N/8 + N/16 + &#8230;</span></p>
<p><span style="font-size: 16px">即： 1101 + 110 + 11 + 1</span></p>
<p><span style="font-size: 16px">=（1000 + 100 + 1）</span></p>
<p><span style="font-size: 16px">+（100 + 10）</span></p>
<p><span style="font-size: 16px">+（10 + 1）</span></p>
<p><span style="font-size: 16px">+ 1</span></p>
<p><span style="font-size: 16px">=（1000 + 100+ 10 + 1）+（100 + 10 + 1）+ 1</span></p>
<p><span style="font-size: 16px">= 1111 + 111 + 1</span></p>
<p><span style="font-size: 16px">=（10000 -1）+（1000 - 1）+（10-1）+（1-1）</span></p>
<p><span style="font-size: 16px">= 11011-N二进制表示中1的个数</span></p>
<p><span style="font-size: 16px">小结<br />任意一个长度为m的二进制数N可以表示为N = b[1] + b[2] * 2 + b[3] * 22 + &#8230; + b[m] * 2(m-1)，其中b [ i ]表示此二进制数第i位上的数字（1或0）。所以，若最低位b[1]为1，则说明N为奇数；反之为偶数，将其除以2，即等于将整个二进制数向低位移一位。</span></p></span><br /><br /></span></div><img src ="http://www.cppblog.com/mengkai/aggbug/157133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mengkai/" target="_blank">mengkai</a> 2011-09-29 13:51 <a href="http://www.cppblog.com/mengkai/archive/2011/09/29/157133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>