語句頻度:設n
為求解的問題的規模,基本操作(或語句)執行次數總和稱為語句頻度,記做f(n)
。
時間複雜度:演算法(或程式)中基本操作(或語句)重複執行的次數總和稱為時間複雜度,記做t(n)
,且有t(n) = o(f(n)) 。
求時間複雜度步驟:
1. 去掉f(n)
中所有加法常數
2. 只保留最高端項
舉例:
function
plus1
(num)
語句頻度: f(n) = 1 + 1 + 1 = 3
時間複雜度:t(n) = o(f(n)) = o(3) = o(1)
o(1)稱為常量數量級
function
sum(arr)
console.
log(s)
;// 1
}
語句頻度: f(n) = 1 + 1 + n + n + 1 = 2n + 3
時間複雜度:t(n) = o(f(n)) = o(2n+3) = o(n)
o(n)稱為線性數量級
function
square
(n)}
console.
log(s)
;// 1
}
語句頻度: f(n) = 1 + n + n2 + n2 + 1 = 2n2 + n + 2
時間複雜度:t(n) = o(f(n)) = o(2n2 + n + 2) = o(n2)
o(n2)稱為平方數量級
常見的時間複雜度:
o(1)2n)2n)2)3)n)
log2n:以氣泡排序為例:以2為底,n的對數,
對數是對求冪的逆運算,
即 2 的多少次方結果為 n,
如log21 = 0,log22 = 1,log24 = 2, log28 = 3等。
function
sort
(arr)}}
console.
log(arr)
// 1
}
語句頻度:
最好情況:f(n) = 2 + (n-1) + n(n-1) + 1 = n2 + 2
最壞情況:f(n) = 2 + (n-1) + 5n(n-1)/2 + 1 = 5n2/2-3n/2+3
時間複雜度:
最好情況: t(n) = o(f(n)) = o(n2 + 2) = o(n2)
最壞情況:t(n) = o(f(n)) = o(5n2/2 - 3n/2 + 3) = o(n2)
最好最壞情況時間複雜度相同,都是o(n2)。
// 優化冒泡演算法
// 通過haschanged標記判斷是否已經排序完成來避免無效操作
function
sort
(arr)
} i++
;// 1到n-1
} console.
log(arr)
// 1
}
語句頻度:
最好情況:f(n) = 8 + 2(n-1) + 2 = 2n + 6
最壞情況:f(n) = 4 + 3(n-1) + 3n(n-1) + 1 = 3n2+2
時間複雜度:
最好情況: t(n) = o(f(n)) = o(2n + 6) = o(n)
最壞情況:t(n) = o(f(n)) = o(3n2+2) = o(n2)
最好情況的時間複雜度得到提公升,但是乙個演算法的時間複雜度有最壞情況決定,因此仍然是o(n2)。
演算法時間複雜度分析
定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 求解演算法的時間複雜度的具體步驟是 1 找出演算法中的基本語句 演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。2 計算基本語句的執行次數的數量級 ...
演算法分析時間複雜度
對乙個演算法的分析,很多時候我們更關心演算法執行的時間複雜度。演算法的時間複雜度中,我們關心演算法執行的時間上界。即大o階分析方法。時間複雜度的分類 1 沒有迴圈遞迴的基本都是常數階。2 有一層迴圈的就是線性階。for int i 0 i dosth 3 對數階 一般類似如下 while i i i...
演算法時間複雜度分析
簡單而言,演算法時間複雜度就是數學裡面的函式,也就是演算法的時間度量,一般記作 t n o f n 演算法分析的分類 1.最壞情況 任意輸入規模的最大執行時間。上界 2.平均情況 任意輸入規模的期望執行時間。3.最好情況 任意輸入規模的最小執行時間,通常最好情況不會出現。下界 情景一 常數階 int...