您的位置:首页 > 编程语言

连载:编写高效代码(8) 空间换时间——我们总是在走,却忘了停留

2011-12-06 19:06 405 查看
时间和空间的关系,是霍金这种智商的人要研究的东西,我们只需要知道,在编程时,空间是可以换时间的,时间也是可以换空间的。
李开复在他的自传《世界因你不同》中描述了他小时候在美国学校里的一个故事,老师出了道题:“谁知道1/7等于多少?”小开复马上大声回答:“0.142857”,老师和同学们都惊呼开复是个天才,其实事实情况是,开复以前在台湾时就记下了这个答案。这就是一个典型的以空间(存储)换时间的例子。

再举一个编程的例子:打印0~40的Fibonacci序列。

Fibonacci序列:

F(n) = 1, n = 0 或1

F(n) = F(n–1)+F(n–2) n >1

代码如下:

int f(int n)

{

if(n<=1)

{

return 1;

}

return  f(n-1) + f(n-2);

}

int main()

{

int result;

int i;

for(i=0; i < 40; i++)

{

result = f(i);

printf("%d\n", result);

}

}

使用这段代码,在我的电脑上需要耗费21秒,而使用下面这段代码,则耗时不到1秒。下面的代码使用了一个数组,将F的值缓存起来,这样计算F(n) = F(n–1)+F(n–2)时就不需要递归执行,直接从数组中取值相加即可。可见,空间换时间的效果是多么的明显。

int arr[40];

int f(int n)

{

int result;

if(n <= 1)

{

result = 1;

}

else

{

result = arr[n-1] + arr[n-2];

}

arr
= result;

return result;

}

int main()

{

int result;

int i;

for(i=0; i < 40; i++)

{

result = f(i);

printf("%d\n", result);

}

}


在商业上最成功的空间换时间的例子是Google和百度的搜索引擎算法,当我们提交一个搜索请求时,搜索引擎并不是现场给我们搜索,要在这么短的时间内搜索全球数不尽的网页是不可能的,它只是将已经搜索好的网页呈现给我们。

附:Fibonacci其人

Fibonacci是在越狱中指证John Abruzzi的污点证人,后被Michael发现藏匿地址的那个人吗?

非也,此Fibonacci是意大利12世纪著名数学家Leonardo Pisano Fibonacci。在他的一本书中,他提出了这么一个有趣的问题:“假定一对兔子在它们出生整整两个月以后可以生一对小兔子,其后每隔一个月又可以再生一对小兔子。假定现在一个笼子里有一对刚生下来的小兔子,请问一年以后笼子里应该有几对兔子?”这个问题的数学建模,就是Fibonacci序列。

本文节选自《大话处理器》第6章。

一台电脑要真正做到优秀,它的硬件和软件是必须紧密联系在一起的。——乔布斯

作者微博: weibo.com/muxiqingyang
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐