一、複雜度的表示方式
大o表示法,其中t代表的是演算法需要執行的總時間,s表示的是演算法需要的總空間
f(n)表示的是**執行的總次數
t(n) = o(f(n))
s(n) = o(f(n))
舉個例子
function go(n)因此上面這段**是 1+n+n*n*2+1=2+n+2n²}return item; // 這裡執行了一次
}
也就是說 t(n) = o(f(2 + n + 2n²))
但是由於時間複雜度參考的是**執行時間的趨勢,因此當n規模比較大的時候,常量起不到決定性的作用,因此這個時候我們忽略這些常量。
因此這裡的例子,只看最大量級的迴圈就可以了,它的時間複雜度是 t(n) = o(n²)
二、時間複雜度
a.時間複雜度的定義
首先,時間複雜度不代表**執行的時間,演算法的時間複雜度說的是乙個演算法的執行時間根據規模增長的乙個趨勢,而並不是**執行的具體時間
b.幾種常見的時間複雜度
1. o(n)
for (var i = 0; i < n; i++)這個比較容易理解,這段**的執行時間完全由n來控制,所以說t(n) = o(n)
2. o(1)
function無論怎樣,這段函式不受任何引數影響,**走一遍就完了,這種**的時間複雜度用 t(n) = o(1)total(n)
3. o(n²)
之前介紹的兩層迴圈的**,它的時間複雜度就屬性 o(n²)
另外,再舉個多塊**的情況下的時間複雜度計算方式
function go(i)在上邊的**中第二段**裡呼叫了第一段**,return sum;}
function main(n)
}
第一段**go: (1+ n)
第二段**main: (1 + n*go) = (1 + n + n * n)
因此,最後的時間複雜度是 t(n) = o(n²)
c.多塊**的時間複雜度
上邊舉例說明的 t(n) = o(n²),是乙個函式在另乙個函式裡邊被呼叫,這種情況下是把兩個函式的時間複雜度相乘
還有另外一種情況,就是在乙個函式裡面有多塊**,但是並沒有相互呼叫,在這樣的情況下,我們只需要取複雜度最大的**塊就可以了
舉個栗子
function上邊這塊**,第一塊**有兩層循迴圈,它的複雜度是 n²;第二塊**,它的複雜度是 ngo(n)
}for (var i = 0; i < n; i++)
}
那麼在這種情況下,當 n 接近無限大的時候,n 對整塊**的時間複雜度起不到決定性作用,因此在這裡整塊**的複雜度就取起決定性作用的 n²
d.對數階和相加情況
var i = 1;上面的**,**裡面有兩個迴圈,但是我們無法判斷n和m到底哪個大,因此在這種情況下**的時間複雜度是 o(m+n)while (i
在上面這段**中,可以看到while裡面,判斷條件i每次被*10,所以導致最後迴圈的次數並不是n次,通過計算這個**的時間複雜度是 10 ^ x = n -> x = lgn
所以得出結論時間複雜度是 t(n) = o(logn)
e.其他情況
另外,還有的情況是通過改變變數會增加迴圈次數的,同理是增加了時間複雜度
還時間複雜度相加
function
go(m, n)
for (var j = 0; j < m; j++)
}
三、空間複雜度
a.空間複雜度的定義
時間複雜看的是**的執行時間的趨勢,那麼同理的,空間複雜度就是指占用記憶體的趨勢
b.常見的空間複雜度
空間複雜度沒有時間複雜度那麼複雜,常見的就是幾種
因為一般大家不會一直迴圈著宣告變數
1. o(1)
var a = 1;2.o(n)var b = 2;
var c = 3;
var arr = array(n);上面**中建立了乙個n長度的陣列,陣列的長度(記憶體開銷)取決於n,因此空間複雜度是 o(n)
3.o(n²)
var arr =;四、複雜度的優化for (vra i = 0; i < n; i++)
}
各個複雜度的曲線圖
舉個優化的例子
function go(n)比較這兩個相同功能的函式的運算用時;可以體會到數學在優化演算法時的重要性return total;}
function go2(n)
go(1000)
go2(1000)
另外,再舉個斐波那契的栗子
斐波那契: 就是從第三項開始依次等於前兩項的和
functionfibonacci(n)
else}
fibonacci(10)
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...