體驗到演算法之美後,那麼面對同乙個問題卻有著眾多的解決方案。
我們心裡應該會有點b數。
所以,本部落格不會花大篇幅去描述,演算法的特性和概念。
直接進入時空複雜度的計算。
首先。時間複雜度概念:演算法需要執行的時間,一般將演算法的執行次數作為時間複雜度的度量標準。
我們看演算法1:
int sum = 0; //執行1次
int total = 0; //執行1次
for(int i = 0; i < n; i++)
那麼,我們將所有語句的執行次數相加,得出: 1 + 1 + n + n + n*n + n*n = 2n^2 + 2n + 2 ,即用函式表達:
t(n) = 2n^2 + 2n + 2 時間複雜度:o(n^2)
所以,當n足夠大的時候,函式取決於第一項,後面可以忽略不計。
當然,演算法1對大多數讀者顯得沒有什麼難度,秒秒鐘可以算出時間複雜度。
筆者汗顏。
那麼請看演算法2:
int i = 1;
while(i <= n)
咳咳,對於演算法萌新的筆者來說,演算法2的時間複雜度,難度有點大。
首先,筆者不知道while語句和i = i * 2到底執行幾次,這就有點像刺蝟,無從下手。
筆者正在轉換思維中.....
請看:
int i = 1; //執行1次
while(i <= n)
遇到這種情況,我們可以假設嘛,哦也!
假設執行x次後,每次運算後 i 的值為:2, 2^2, 2^3, ...... , 2^x
當x = n的時候結束,即 2^x = n
得出:x = log2n , 那麼演算法2的時間複雜度為 : o(1 + 2log2n)
計算完演算法1和演算法2,筆者好像覺得時間複雜度的計算還ok啦,但是,請記住:
並不是每個演算法都能直接計算執行次數。
比如:查詢,插入,排序等等。
面對這種情況,我們需要從三個方面來描述乙個演算法的ok性。
最好、最壞、平均。(英文就不寫了,自己查詢)
時間複雜度,就說到這裡。
空間複雜度概念:演算法占用的空間大小,一般將演算法的輔助空間作為衡量標準。
當然,演算法的占用儲存空間分為:
1, 輸入輸出資料
2, 演算法本身
3,額外需要的輔助空間。
話不多說,看程式3,簡單的兩數交換:
int temp;
temp = a;
a = b;
b = temp;
我們可以看出,使用額外變數temp,即空間複雜度為o(1).
空間複雜度,好像沒什麼可說的,emmmmm!
本次例子摘抄自《趣學演算法》陳小玉編著。
若讀者like,請支援正版。
演算法時空複雜度分析
目錄 1.時間複雜度 2.空間複雜度 3.常見的演算法複雜度 4.相關典型例題 5.總結 在acm範圍裡,我們只需了解時間複雜度可以大致地通過乙個演算法運算的次數來描述程式執行的效率,常常用大寫字母o來表示。在表示時間複雜度的時候,只保留數量級最大的一項,並忽略係數。對於給定的常數n 若某乙個演算法...
如何計算演算法的時空複雜度
演算法 時間複雜度 時空複雜度 推薦 時間複雜度o logn o logn 的出現,一般是採用了分治的思想,演算法體現就是遞迴。logn的底數由演算法的複雜度決定 二分法,底數為2 三分法,底數是3.但是我們把logxn,logyn,x y,n取正無窮大時,會發現其實不同底數的logn只相差乙個常數...
演算法之時間複雜度
前言 學習這東西,很枯燥也很煩,參考許多博文,選了許多。結合一些東西,記錄一下,也是為了以後回顧學習。演算法效率 說到演算法效率 不得不提兩個指標,那就是 時間複雜度 空間複雜度 好的演算法應該具備時間效率高和儲存量低的特點。計算機能快速完成大量複雜的資料處理,但是要完成這個工作,計算機也是需要一定...