連載:編寫高效程式碼(8) 空間換時間——我們總是在走,卻忘了停留
李開復在他的自傳《世界因你不同》中描述了他小時候在美國學校裡的一個故事,老師出了道題:“誰知道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
相關推薦
連載:編寫高效程式碼(8) 空間換時間——我們總是在走,卻忘了停留
時間和空間的關係,是霍金這種智商的人要研究的東西,我們只需要知道,在程式設計時,空間是可以換時間的,時間也是可以換空間的。 李開復在他的自傳《世界因你不同》中描述了他小時候在美國學校裡的一個故事,老師出了道題:“誰知道1/7等於多少?”小
連載:編寫高效程式碼(11) 儘量減少分支
我們在介紹處理器時,已經知道了,現在的處理器都是流水線結構,if和switch等語句會帶來跳轉,而跳轉會打亂流水線的正常執行,影響程式的執行效率。 下面這段程式碼,把奇數賦一個值,把偶數賦一個值,可以用這種方式實現: for(i=0; i
C++:編寫高效率程式碼
概述: C++相比其他高階語言效率高的多,也有許多程式使用C++作為核心以提高程式的效能瓶頸,一個太大太慢的程式他們的優點無論有多麼引人注目都不會為人們所接受,儘管有一些程式的確是為了複雜的運算才佔用更多的時間和空間,但是更多的程式只能歸咎於糟糕的設計和馬虎的程式設計。想用C++寫出高效的程式碼之前,必須認
效能優化:空間換時間
問題背景 在程式開發過程中,我們對於資料的處理,會有一些校驗。 校驗分為兩種:簡單校驗和複雜校驗。 對於一些簡單的校驗,如使用者是否存在,密碼是否正確等等。這種校驗,可以
程式設計題:編寫一個程式碼,將“i am from shanghai”倒置為“shanghai from am i”
題目要求:編寫一個程式碼,將“i am from shanghai”倒置為“shanghai from am i”,即將句子中單詞的位置調換, 但不改變單詞內部的順序 #include <stdio.h> #include
java算法面試題:編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串,但要保證漢字不被截取半個, 如“我ABC”,4,應該截取“我AB”,輸入“我ABC漢DEF”,6,應該輸出“我ABC”,而不是“我ABC+漢的半個”。
構造 pack n) -- com post nts throw ... package com.swift; import java.util.Scanner; public class Hanzi_jiequ { public static void m
leetcode-383-Ransom Note(以空間換時間)
ini from each 小寫字母 自己的 hat bmi 第一個字符 BE 題目描述: Given an arbitrary ransom note string and another string containing letters from all the m
空間換時間,超大資料表的查詢效率優化。
原文出處:http://www.cnblogs.com/wesley/archive/2012/04/23/2466982.html 在開發論壇程式的時候,我借鑑了目前一些論壇的資料規模,10年的積累大概在2000萬~5000萬左右,因此決定,最低承載力設計要求至少是 9 位數。於是在開發完第一
Redis學習筆記~關於空間換時間的查詢案例
回到目錄 空間與時間 空間換時間是在資料庫中經常出現的術語,簡單說就是把查詢需要的條件進行索引的儲存,然後查詢時為O(1)的時間複雜度來快速獲取資料,從而達到了使用空間儲存來換快速的時間響應!對於redis這個k/v儲存系統來說,複雜的查詢不是它所建議的,它的優勢在於通過key快速定位資料,它定位資料的速
以空間換時間經典演算法
以前看過一篇文章“優化C程式碼常用的幾招”,作者提到的第一招就是“以空間換時間”,還舉了一個例子,由於比較經典,引用一下:計算機程式中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程式的效率問題,我們就有了解決問題的第1招--以空間換時間。比如說字串的賦值:方法A:通常的辦法#define
以空間換時間的計數排序
計數排序 我們前面學習的插入、歸併、堆和快速排序都是比較排序,即在排序的最終結果中,各元素的次序依賴於它們之間的比較。我們說過比較排序有時間下界,即nlgn,如果我們需要一個時間複雜度為O(n
ListView空間換時間的優化
public View getView(int position, View convertView, ViewGroup parent) { View view = null; if(convertView==null){ Log.i(TAG,"第"+pos
以時間換空間、以空間換時間、垃圾回收
垃圾回收: 如果一個例項變數種指向某個物件,一定要在恰當的時候將例項變數賦值為nil,以取消對該物件的引用並使垃圾回收器知道該物件可以被清理了。 開發iphone應用,不能使用垃圾回收。 掌握retain release 和autorelease方法 理解引用,物件所有權
一個空間換時間演算法
說起空間換時間,想到c/c++語言的話我會想到#define巨集定義和行內函數,他們都減少了函式切換時的壓棧清棧等工作.對一個簡短的函式,的確這些額外的消耗太浪費了.對於"計算素數"的問題,是一個經典的此類問題. 我們常用來找一個範圍內的素數(質數)的辦法有兩種: (1)篩選
空間換時間-替換空格
#include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> us
UPC:2219 A^X mod P(預處理空間換時間)
題意:按公式求f[x],再按公式求結果。 思路:直接搞的話f[i]可能高達10^9,n為10^6,即使用快速冪也會超時。用空間換時間是一種常見的降低複雜度的辦法。對於任意一個數字X,它可以變成X=a*N+b(N為常數)。基於這個思路可以把f[n]=a*N+b,如果取N=10
空間換時間,查表法的經典例子
## 前言 上一篇分享了:[C語言精華知識:表驅動法程式設計實踐](https://t.1yb.co/rcS) 這一篇再分享一個查表法經典的例子。 我們怎麼衡量一個函式/程式碼塊/演算法的優劣呢?這需要從多個角度看待。本篇筆記我們先不考慮程式碼可讀性、規範性、可移植性那些角度。 在我們嵌入式中,我們需
Django時區配置:有次發現緩存的時間總是有問題,原來是時區配置需要改
配置 color code -h djang time_zone sha Language 時區 # LANGUAGE_CODE = ‘en-us‘ # TIME_ZONE = ‘UTC‘ LANGUAGE_CODE = ‘zh-Hans‘ TIME_ZONE =
圖解:計算機資料結構中的 6 種「樹」,你心中有數了嗎?
> 檸檬哥整理了50本計算機相關的電子書,關注公眾號「後端技術學堂」,回覆「1024」我發給你,回覆「進群」拉你進百人讀者技術交流群。 **本文首發個人技術微信公眾號**,[點選閱讀全文](https://mp.weixin.qq.com/s/3u6I8XSmp_M8wIw__tDrLQ) --- 資料結