<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Programming Life with Music &#187; 算法导论</title>
	<atom:link href="http://jackaldire.com/tag/intorduction-to-algorithm/feed/" rel="self" type="application/rss+xml" />
	<link>http://jackaldire.com</link>
	<description>JackalDire &#039;s Blog</description>
	<lastBuildDate>Tue, 13 Jul 2010 08:29:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Fibonacci数的巧妙求法</title>
		<link>http://jackaldire.com/200905/smart-way-to-solve-fibonacci/</link>
		<comments>http://jackaldire.com/200905/smart-way-to-solve-fibonacci/#comments</comments>
		<pubDate>Wed, 06 May 2009 11:32:34 +0000</pubDate>
		<dc:creator>JackalDire</dc:creator>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[Fibonacci]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[算法导论]]></category>

		<guid isPermaLink="false">http://jackaldire.com/?p=25</guid>
		<description><![CDATA[看MIT算法导论视频真是收获不蜚，今天学会了求Fibonacci数最快的方法～ Fibonacci（斐波那契）数列小学生都知道的，求Fibonacci数也不是什么难事，可以用递推式一步一步推(线性)。有没有更快的方法呢，你可能马上就想到了通项公式: 这个公式要算一个数的n次方，由于一个数的n次方可以由一个分治算法在logn时间内得到： 所以这个算法时间复杂度是O(logn)的。推导没有错误，但是忽略了一个问题：精度。无理数只能近似表示，所以无理数的乘方是有误差的，而且误差越乘越大，所以需要足够多的有效位数才能保证最后的答案是正确的。由于是取最近的整数，只要误差超过0.5，结果就会出错。如果n很大，比如说1亿，这个算法就得几乎不可到正确结果。而下面的算法则避开了这个问题。 设Fibonacci数列的第n个数是Fn，则有： 好吧，一个2*2的matrix就解决问题，真是精妙的算法。这个公式可以轻松的用数学归纳法验证。由于计算过程中都是整数，所以不会出现精度问题。两个2＊2的矩阵相乘复杂度O(1)，矩阵的乘方也可用上面的分治算法求得，所以 T(n) ＝ T(n/2) + O(1)，由主定理解得 T(n) = O(logn)。 MIT的算法导论课程视频和讲义VeryCD上有：Click me.  主讲老师就是《算法导论》的主要作者之一：Charles E. Leiseson (中文版封底上有他的照片)，讲得非常好，通俗易懂，还可以顺带练习英语听力～～强烈推荐 Related Post 快速排序详细分析 (4) [备忘]倒置字符串中的单词 (0) [一道面试题]含有*的字符串匹配问题 (5)]]></description>
			<content:encoded><![CDATA[<p id="fp">看MIT算法导论视频真是收获不蜚，今天学会了求Fibonacci数最快的方法～</p>
<p style="text-indent:2em">Fibonacci（斐波那契）数列小学生都知道的，求Fibonacci数也不是什么难事，可以用递推式一步一步推(线性)。有没有更快的方法呢，你可能马上就想到了通项公式:</p>
<p style="text-indent: 2em; text-align: center;"><img class="aligncenter" title="Fibonacci" src="http://upload.wikimedia.org/math/f/f/4/ff4f4e93fa405071492981a63678442c.png" alt="" width="278" height="39" /><img src="file:///tmp/moz-screenshot-1.jpg" alt="" /><img src="file:///tmp/moz-screenshot.jpg" alt="" /></p>
<p style="text-indent:2em">这个公式要算一个数的n次方，由于一个数的n次方可以由一个分治算法在logn时间内得到：<img class="size-full wp-image-27 aligncenter" title="a" src="http://jackaldire.com/wordpress/wp-content/uploads/2009/05/a.png" alt="a" width="324" height="63" /></p>
<p style="text-indent:2em">
<p><span id="more-25"></span></p>
<p style="text-indent:2em">所以这个算法时间复杂度是O(logn)的。推导没有错误，但是忽略了一个问题：精度。无理数只能近似表示，所以无理数的乘方是有误差的，而且误差越乘越大，所以需要足够多的有效位数才能保证最后的答案是正确的。由于是取最近的整数，只要误差超过0.5，结果就会出错。如果n很大，比如说1亿，这个算法就得几乎不可到正确结果。而下面的算法则避开了这个问题。</p>
<p style="text-indent:2em">设Fibonacci数列的第n个数是Fn，则有：</p>
<p style="text-indent:2em"><img class="aligncenter size-full wp-image-29" title="21" src="http://jackaldire.com/wordpress/wp-content/uploads/2009/05/21.png" alt="21" width="217" height="77" />好吧，一个2*2的matrix就解决问题，真是精妙的算法。这个公式可以轻松的用数学归纳法验证。由于计算过程中都是整数，所以不会出现精度问题。两个2＊2的矩阵相乘复杂度O(1)，矩阵的乘方也可用上面的分治算法求得，所以 T(n) ＝ T(n/2) + O(1)，由主定理解得 T(n) = O(logn)。</p>
<p style="text-indent:2em">MIT的算法导论课程视频和讲义VeryCD上有：<a href="http://www.verycd.com/topics/87348/" target="_blank">Click me</a>.  主讲老师就是《算法导论》的主要作者之一：Charles E. Leiseson (中文版封底上有他的照片)，讲得非常好，通俗易懂，还可以顺带练习英语听力～～强烈推荐</p>

	<h4>Related Post</h4>
	<ul class="st-related-posts">
	<li><a href="http://jackaldire.com/200908/quick-sort-analysis/" title="快速排序详细分析 (2009年08月27日)">快速排序详细分析</a> (4)</li>
	<li><a href="http://jackaldire.com/200908/reverse-token/" title="[备忘]倒置字符串中的单词 (2009年08月18日)">[备忘]倒置字符串中的单词</a> (0)</li>
	<li><a href="http://jackaldire.com/200911/string-matching-with-wildcard/" title="[一道面试题]含有*的字符串匹配问题 (2009年11月25日)">[一道面试题]含有*的字符串匹配问题</a> (5)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://jackaldire.com/200905/smart-way-to-solve-fibonacci/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
