演算法的時間複雜度:
參考部落格:
演算法的時間複雜度,用來度量演算法的執行時間,記作: o(f(n))。它表示隨著 輸入大小n的增大,演算法執行需要的時間的增長速度可以用 f(n) 來描述。
上面概念可能比較抽象,下面我們用案例的方式來舉例下,一般我們是先拿到f(n),然後來算下他的時間複雜度,一般我們只保留對函式增長速度較大的函式
例如:
1、f(n)=c(c是常數),我們稱時間複雜度為o(1)
2、f(n)=a*n+b(a和b是常數),我們稱時間複雜度為o(n)
3、f(n)=a*n^2+b*n+c(a,b,c均為常數),我們稱時間複雜度為o(n^2)
4、f(n)=a*n^2*logn+b*n+c(a,b,c均為常數),我們稱時間複雜度為o(n^2*logn)
常見的時間複雜度量級有:
logn的時間複雜度是除o(1)以外時間複雜度最低的演算法,log2n,log3n...都可被視作logn,因為雖然特定的操作次數依賴於對數的底,但由於換底公式
時間複雜度為o(log2n)的演算法,二分查詢法。
由於二分查詢每次查詢都是從陣列中間切開查詢,所以每次查詢,剩餘的查詢數為上一次的一半,從下表可以清晰的看出查詢次數與剩餘元素數量對應關係。
表-查詢次數及剩餘數:
第幾次查詢
剩餘待查詢元素數量
1
n/22
n/(2^2)
3n/(2^3)… …
kn/(2^k)
從上表可以看出n/(2^k)肯定是大於等於1,也就是n/(2^k)>=1,我們計算時間複雜度是按照最壞的情況進行計算,也就是是查到剩餘最後乙個數才查到我們想要的資料,也就是
n/(2^k)>=1
=>n>=2^k
=>k<=log2n
所以二分查詢的時間複雜度為o(log2n)。
由此我們可以得知,底數為2時,每次分一半查詢,底數為3時每次分1/3查詢。
long afunc(int n) else
}
解釋:顯然執行次數,t(0) = t(1) = 1,同時 t(n) = t(n - 1) + t(n - 2) + 1,這裡的 1 是其中的加法算一次執行。顯然 t(n) = t(n - 1) + t(n - 2) 是乙個斐波那契數列,通過歸納證明法可以證明,當 n >= 1 時 t(n) < (5/3)^n,同時當 n > 4 時 t(n) >= (3/2)^n。所以該方法的時間複雜度可以表示為 o((5/3)^n),簡化後為 o(2^n)。
演算法的空間複雜度:
參考部落格:
類似於時間複雜度的討論,乙個演算法的空間複雜度(space complexity)s(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。漸近空間複雜度也常常簡稱為空間複雜度。
空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。乙個演算法在計算機儲存器上所占用的儲存空間,包括儲存演算法本身所占用的儲存空間,演算法的輸入輸出資料所占用的儲存空間和演算法在執行過程中臨時占用的儲存空間這三個方面。演算法的輸入輸出資料所占用的儲存空間是由要解決的問題決定的,是通過參數列由呼叫函式傳遞而來的,它不隨本演算法的不同而改變。儲存演算法本身所占用的儲存空間與演算法書寫的長短成正比,要壓縮這方面的儲存空間,就必須編寫出較短的演算法。演算法在執行過程中臨時占用的儲存空間隨演算法的不同而異,有的演算法只需要占用少量的臨時工作單元,而且不隨問題規模的大小而改變,我們稱這種演算法是「就地\"進行的,是節省儲存的演算法。
關於演算法的時間複雜度和空間複雜度
首先,需要解釋一下經常看到的o log n 是什麼意思。大概總結為普通應用都是10,計算機學科是2,程式語言裡面是e。在我們初中最初接觸到對數時,學到的log指以10為底的對數,為了簡化把下標10去掉,記為log。以常數e為底的對數,簡化下標記為ln。但是在計算機學科裡,不知道為什麼流傳下來的log...
關於時間複雜度和空間複雜度
如何判別乙個演算法的好壞 首先,這個演算法必須是正確的 其次,好的演算法應具有幸福感,便於人們理解和交流,並且是機器可執行的。這個演算法還需要足夠健壯,即當輸入的資料非法或不合理時,也能適當的做出正確的反應或進行相應的處理 最後它還必須擁有高效率和低儲存量要求。也就是時間複雜度和空間複雜度佔的地方越...
關於時間複雜度和空間複雜度
空間複雜度 大o表示法是演算法的漸進時間複雜度,感覺是從數量級?的角度來描述演算法時間複雜度的增長趨勢?大o表達其實表示的不是精確的時間消耗,而是關注其屬於的量級。比如o n n 2 o n 2 而過分糾結o 2n o 3n 和o 2n 3n 是沒有意義的,因為其全可以表達為o n 看該演算法以怎樣...