時間複雜度是什麼?
可以理解為程式中的基本操作要執行的次數,而並非是真正以時間為單位的量,一般用預設是最壞情況下程式要執行的次數。時間複雜度用o(……)來表示。
時間複雜度的分類:
o(1)常數型、o(n²)平方型、o(n³)立方型、o(log n)對數型、o(n*log n) 、o(n)線型、o(2^ n)指數型 。
時間複雜度的計算方法:
1.迴圈巢狀,內外迴圈的最大次數相乘。例如:↓ 時間複雜度為o(n²)
for
(i=1
; i<=n; i++
)
如果是↓ 那麼時間複雜度為o(n³)
for
(i=1
; i<=n; i++
)}
2.迴圈平行,相加。例如↓ 時間複雜度為o(n² + 2^n)
for
(i=1
; i<=n; i++
)for
(k=1
; k<=n; k++
)
3.常數忽略。例如↓ 時間複雜度為o(1),這裡用的10舉例,但如果這個數取了乙個很大的數還要另外考慮。
for
(i=1
; i<=
10; i++
)
還有↓ 時間複雜度為o(n)不要認為是o(2*n + 1)
for
(i=1
; i<=
2n; i++
)
如果沒有迴圈↓ 也就是說,演算法的執行時間不隨著問題規模n的增加而增長,那麼它的時間複雜度是o(1)
int a =1;
int b =2;
int c;
a = a + b;
b = b + a;
c = a + b;
4.遞迴演算法的時間複雜度 = 遞迴的次數 * 每次遞迴中迴圈的次數。例子是第5條n*log n的例子,因為快速排序應用了遞迴呼叫。
5.log n和n*log n是怎麼出現的呢?先看第乙個例子
while
(i <2^
8)
這個迴圈會執行幾次?3次,求法為:log2 8 = 3,那如果8是n呢?那就是log2 n次了,所以就會出現時間複雜度為log n的情況,那n*log n怎麼回事?請看下面的例子:該例子是快速排序。陣列num[n]預設已經初始化
void
quicksort
(int left,
int right)
} a[key]
= a[i]
; a[i]
= temp;
quicksort
(left, i-1)
;quicksort
(i+1
, right)
;return
;}
第一次遞迴遍歷n個數,然後陣列分為兩個區域,每個區域再和每個區域內的key進行比較,比較的次數還是近似於n,所以遞迴中迴圈比較的次數近似為n,那麼迴圈了幾次呢?快速排序可以想象成與乙個完全二叉樹,而這個完全二叉樹的樹高就是迴圈次數,樹高為log n,所以快速排序的時間複雜度為n*log n。
嗶哩嗶哩/bilibili:羊卓的楊
演算法的複雜度 演算法的時間複雜度和空間複雜度
在一次筆試題目中,發現了自己對於演算法的時間複雜度問題上並沒有完全清晰這個概念和計算方法,故上網尋找到比較好的詳細介紹來學習。演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也...
演算法的時間複雜度 空間複雜度
時間複雜度和空間複雜度是度量演算法效率的常用指標 事後統計,不常用 事前統計影響因素 演算法策略 問題規模 程式語言 質量 機器執行指令的速度 撇開軟硬體的影響,演算法執行工作量的大小只依賴於問題的規模 通常用整數n表示 乙個演算法是由控制結構 順序,分支,迴圈三種 和原操作 指固有資料型別的操作 ...
演算法的複雜度 時間複雜度與空間複雜度
通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...