常用演算法的時間複雜度和空間複雜度
平時在聊天談論演算法時候,發現很多人並不清楚演算法的時間複雜度怎麼計算,一些稍微複雜的演算法時間複雜度問題,就無法算出時間複雜度。那麼我在今天的文章裡去解答這些問題
執行這個演算法所需要的計算工作量
隨著輸入資料的規模,時間也不斷增長,那麼時間複雜度就是乙個演算法效能可觀的資料。
由於實際演算法的時間會根據機器的效能,軟體的環境導致不同的結果,那麼通常都是預估這個時間。
演算法花費時間與執行語句次數成正比,執行次數稱為語句頻度或時間頻度。記為t(n)
在時間頻度中,n稱為問題的規模,當n不斷變化時,它所呈現出來的規律,稱之為時間複雜度
說明:
例如:t(n)=2n+4+n^2
t(n)=n+8 + 4n^2
很明顯時間頻度不同,但是他們時間複雜度是相同的 都為o(n^2)
找出演算法中的基本語句(執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。)
計算基本語句的執行次數的數量級(只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。)
用大ο記號表示演算法的時間效能。
原則:如果執行時間是常數量級,用常數1表示
只保留時間函式中的最高端項
如果最高端項存在,則省去最高端項前面的係數
例1:
for
(i in
0..n)
for(i in
0..n)
}
在看這個演算法時候,很明顯時間 複雜度為o(n+n^2) 但要留下最高端 也就是o(n^2)
例2:
for
(i in
0..n)
在看這個演算法時候,很明顯時間 複雜度為o(3n) 但要抹掉常數3 也就是o(n)
例3:
var i =
1while
(i < n)
在看這個演算法時候,很明顯時間 複雜度為o(3logn) 但要抹掉常數3 也就是o(logn)
例4:
a++
b++c++
在看這個演算法時候,很明顯時間 複雜度為o(3) 常數級別的演算法都為o(1)
為啥我要加個重點標識呢?因為很多人都不曉得平衡二叉搜尋樹的o(logn)是咋計算出來的,今天我給大家掰扯掰扯
假設生成高度樹h的節點數是n(h) ,高度為h-1的節點數為n(h-1)
他們之間的關係為 n(h) = n(h-1)+n(h-1)+1
n(h) = 2n(h-1)+1
n(h) 約等於 2n(h-1)
注意的一點 n(h-1) 幾乎是一半的節點數目
基準點 h(0) = 1 h(1) = 3
依次類推
n(h) 約等於 h^2
那麼n(h) = h^2
那麼h = log2n
則平衡二叉搜尋樹的時間複雜度 o(logn)
常見的時問複雜度如表所
常用的時間複雜度所耗費的時間從小到大依次是:
複雜度在1s內,能處理的資料量大小
最壞情況時間複雜度:**在最壞情況下執行的時間複雜度。
最好情況時間複雜度:**在最理想情況下執行的時間複雜度。
平均時間複雜度:**在所有情況下執行的次數的加權平均值。
均攤時間複雜度:在**執行的所有複雜度情況中絕大部分是低階別的複雜度,個別情況是高階別複雜度且發生具有時序關係時,可以將個別高階別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。
為什麼要引入這4個概念?
同一段**在不同情況下時間複雜度會出現量級差異,為了更全面,更準確的描述**的時間複雜度,所以引入這4個概念。
**複雜度在不同情況下出現量級差別時才需要區別這四種複雜度。大多數情況下,是不需要區別分析它們的。
如何分析平均、均攤時間複雜度?
平均時間複雜度
**在不同情況下複雜度出現量級差別,則用**所有可能情況下執行次數的加權平均值表示。
均攤時間複雜度
兩個條件滿足時使用:
1)**在絕大多數情況下是低級別複雜度,只有極少數情況是高階別複雜度;
2)低級別和高階別複雜度出現具有時序規律。均攤結果一般都等於低級別複雜度。
我們查詢乙個有n 個隨機數字陣列中的某個數字,最好的情況是第乙個數字就是,那麼演算法的時間複雜度為o(1),但也有可能這個數字就在最後乙個位置上待著,那麼演算法的時間複雜度就是o(n),這是最壞的一種情況了。
最壞情況執行時間是一種保證,那就是執行時間將不會再壞了。 在應用中,這是一種最重要的需求, 通常, 除非特別指定, 我們提到的執行時間都是最壞情況的執行時間。
而平均執行時間也就是從概率的角度看, 這個數字在每乙個位置的可能性是相同的,所以平均的查詢時間為n/2次後發現這個目標元素。平均執行時間是所有情況中最有意義的,因為它是期望的執行時間。也就是說,我們執行一段程式**時,是希望看到平均執行時間的。可現實中,平均執行時間很難通過分析得到,一般都是通過執行一定數量的實驗資料後估算出來的。一般在沒有特殊說明的情況下,都是指最壞時間複雜度。
執行這個演算法所需要的記憶體空間
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度
在演算法計算中,其中的輔助變數與空間複雜度相關
一般的,只要演算法不涉及到動態分配的空間,以及遞迴、棧所需的空間,空間複雜度通常為o(1)
時間複雜度和空間複雜度往往是相互影響,空間複雜度越好相對的時間會耗費的較多,反之亦然。 例
var m = arrayofnulls
(n)for
(i in
0..n)
空間複雜度為 o(n) 資料結構之演算法複雜度
解決特定問題求解步驟的描述。在計算機中表現為指令的有限序列,每條指令可表示乙個或多個操作。此外,乙個演算法還具有下列5個特性 有窮性,確定性,可行性,輸入,輸出。演算法設計的要求 正確性,可讀性,健壯性,效率與低儲存量需求。what?時間複雜度和空間複雜度 why?可以用度量演算法的好與壞 how?...
資料結構 演算法複雜度
二 演算法的效能評價 三 真題解析 資料結構的第一章 緒論 包含的最後乙個重要內容是關於演算法的複雜度。這個考點一般會單獨出現在選擇題的前兩道,需要你熟練掌握演算法的基本概念 演算法時間複雜度和空間複雜度的分析判斷等。其次,還會出現在大題的程式設計部分,將演算法複雜度作為乙個限制條件,要求你給出滿足...
C資料結構與演算法 演算法複雜度
演算法複雜度分為時間複雜度t n 和空間複雜度f n 時間複雜度 也就是執行演算法程式所需的時間,與硬體的速度 程式語言的級別 編譯器的優化 資料的規模 執行的頻度有關,前三個有很大的不確定性,所以衡量指標只要是後兩者即演算法的時間複雜度是資料規模n的函式。t n o f n 其中o表示同階,即當n...