时间和空间的关系,是霍金这种智商的人要研究的东西,我们只需要知道,在编程时,空间是可以换时间的,时间也是可以换空间的。
李开复在他的自传《世界因你不同》中描述了他小时候在美国学校里的一个故事,老师出了道题:“谁知道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