编写高效代码(2) 空间换时间——我们总是在走,却忘了停留
来源:互联网 发布:五年级上册优化答案 编辑:程序博客网 时间:2024/04/29 10:28
李开复在他的自传《世界因你不同》中描述了他小时候在美国学校里的一个故事,老师出了道题:“谁知道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[n] = 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
- 编写高效代码(2) 空间换时间——我们总是在走,却忘了停留
- 连载:编写高效代码(8) 空间换时间——我们总是在走,却忘了停留
- 代码时间换空间以及空间换时间
- 矩阵模拟——空间换时间
- 丑数——空间换时间
- 以空间换时间高效求素数算法
- 连载:编写高效代码(14) 程序、数据访问符合Cache的时间、空间局部性
- 编写高效代码(14) 程序、数据访问符合Cache的时间、空间局部性
- 编写高效代码(8) 程序、数据访问符合Cache的时间、空间局部性
- 空间换时间在问题中的应用
- 【自考】—信系开管这次我们走心了
- 我们不能在此停留!
- 时间在跳跃,我却跟不上了~
- 连载:编写高效代码(12) 优化内存访问——别让包袱拖垮了你
- 编写高效代码(12) 优化内存访问——别让包袱拖垮了你
- 编写高效代码(7) 优化内存访问——别让包袱拖垮了你
- 虚拟列(Virtual Column)——时间换空间
- 空间换时间——为字符串排序
- 《C++编程》第二章第9题
- OC3月26日学习总结
- CentOS 6 各个版本的含义
- Nginx 的基本数据类型
- Git使用简介
- 编写高效代码(2) 空间换时间——我们总是在走,却忘了停留
- 没做!
- 优先队列
- c语言 蓝欧版 分支结构练习(9题)
- 编写高效代码(3) 减少处理器不擅长的操作——不要逼我做我不喜欢的事情
- 小米研发工程师笔试卷A
- c实现带表头的单链表的创建、测长及打印
- 编写高效代码(4) 在精度允许的条件下,将浮点数定点化
- hdu-1540(线段树+最大连续区间)