資料結構和演算法本質上是」快「和"省"。所以**的執行效率是非常重要的度量
我們採用時間複雜度和空間複雜度來計算
大o複雜度表示法
int
sum(
int n)
return s;
//t
} n=
1001+1
+100n+
100n+1=
200n+
3
我們假設執行一行**的時間為t,通過估算,**的執行時間t(n)與執行次數成正比,記做:
t
(n)=o(
f(n)
)
t(n): **執行時間
n:資料規模
f(n):每行**執行次數總和
o:**的執行時間與f(n)表示式成正比
上面的例子中的t(n
)=o(
2n+2
)t(n)=o(2n+2)
t(n)=o
(2n+
2)當n無限大時,低階、常量、系統都可以忽略
所以t (n
)=o(
n)
t(n)=o(n)
t(n)=o
(n)
即上例中的時間複雜度為o(n),也就是**執行時間隨著資料規模的增加而增長
int
sum(
int n)
}return s;
}
上例中t(n
)=o(
n∗n)
t(n)=o(n*n)
t(n)=o
(n∗n
),也就是**執行時間隨著資料規模的增加而平方增長
即:上例中的時間複雜度為o(n
2)
o(n^2)
o(n2)
時間複雜度也成為漸進時間複雜度。
計算時間複雜度的技巧
比如把上面兩段**合在一起
int
sum(
int n)
for(
;i<=n;i++)}
return s;
}
時間複雜度為o(n
2)
o(n^2)
o(n2)
常見的時間複雜度
空間複雜度全稱是漸進空間複雜度,表示演算法的儲存空間與資料規模之間的增長關係
比如將乙個陣列拷貝到另乙個陣列中,就是相當於空間擴大了一倍:t(n
)=o(
2n
)t(n)=o(2n)
t(n)=o
(2n)
,忽略係數。即為:
o (n
)o(n)
o(n)
,這是乙個非常常見的空間複雜度,比如跳躍表、hashmap的擴容
此外還有:
o (1
)o(1)
o(1)
,比如原地排序、
o (n
2)
o(n^2)
o(n2
) 此種占用空間過大
由於現在硬體相對比較便宜,所以在開發中常常會利用空間來換時間,比如快取技術
典型的資料結構中空間換時間是:跳躍表
在實際開發中我們也更關注**的時間複雜度,而用於執行效率的提公升
演算法的複雜度 時間複雜度與空間複雜度
通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...
演算法時間複雜度空間複雜度
演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...
演算法 時間複雜度 空間複雜度
1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...