以前看過一篇文章「優化c**常用的幾招」,作者提到的第一招就是「以空間換時間」,還舉了乙個例子,由於比較經典,引用一下:
電腦程式中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程式的效率問題,我們就有了解決問題的第1招--以空間換時間。比如說字串的賦值:
方法a:通常的辦法
#define len 32
char string1 [len];
memset (string1,0,len);
strcpy (string1,"this is a example!!");
方法b:
const char string2[len] ="this is a example!";
char * cp;
cp = string2;
使用的時候可以直接用指標來操作。
從上面的例子可以看出,a和b的效率是不能比的。在同樣的儲存空間下,b直接使用指標就可以操作了,而a需要呼叫兩個字元函式才能完成。b的缺點在於靈活性沒有a好。在需要頻繁更改乙個字串內容的時候,a具有更好的靈活性;如果採用方法b,則需要預存許多字串,雖然占用了大量的記憶體,但是獲得了程式執行的高效率。
筆者在程式設計練習過程中也遇到了不少可以用空間換時間的演算法,把它們收集起來,以便初學者學習查閱。
1.桶式排序演算法
最經典的應用是「桶式排序演算法」。陣列的排序演算法很多,其中快速排序是在實踐中最快的已知排序演算法,它的平均執行時間是o(nlogn),堆排序演算法在最壞的情況下,其時間複雜度也能達到o(nlogn)。相對於快速排序來說,這是它最大的優點,但是它需要乙個記錄大小供交換用的輔助儲存空間-----其實這也是用空間換時間的表現。但是,當陣列的元素是一些較小的整型資料(小於1000000)時,用「桶式排序演算法」可以使時間複雜度降到o(n),可以很快地對年齡,成績等整型資料進行排序。此外還可以使用桶式排序的方法求素數表。
「桶式排序演算法」的**也很簡單,只要建立乙個長度為max的字元陣列就可以了,**如下:
/*函式功能:使用筒式排序法對陣列進行排序,適用於元素值為較小整數
輸入變數: int a, 陣列a
int len,陣列a的長度
輸出變數:無
返回值: 無*/
void sort(int a, int len)
}delete p;}
/*函式功能:返回陣列的最大值
輸入變數: int a, 陣列a
int len,陣列a的長度
輸出變數:無
返回值: 陣列的最大值*/
int getmax(int a, int len)
{int max = a[0];
for (int i=1; i
以空間換時間的計數排序
我們前面學習的插入 歸併 堆和快速排序都是比較排序,即在排序的最終結果中,各元素的次序依賴於它們之間的比較。我們說過比較排序有時間下界,即nlgn,如果我們需要乙個時間複雜度為o n 的排序演算法,要怎麼辦?計數排序就是比較好的選擇。計數排序的基本思想是 對每乙個輸入的元素x,確定小於x的元素個數。...
以時間換空間,聯合主鍵 舉例
在建立資料庫是,以空間換時間應該怎麼理解呢,舉例 建設你要建立乙個商品的資料庫,肯定要有乙個商品表goods,這個商品有喝多宣傳,那肯定還要有乙個表goods image表,而且乙個 商品可以對應很多,所以是一對多的關係 但是這個商品有乙個主宣傳,那麼如果將主 宣傳也新增到goods image的表...
劍指offer 以空間換時間練習
1 題目要求 我們把只包含因子2 3 5的數稱作醜數,求按從小到大的順序的第1500個醜數。例如,6 8都是醜數,但14不是,因為它包含因子7.習慣上我們把1當做第乙個醜數。2 題目分析 方法一 首先,我們再來仔細分析一下醜數的概念,因為2,3,5是醜數的因子,那麼就可以說明任意乙個醜數對其中乙個因...