定義:乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中語句的執行次數稱為語句頻度或時間頻度,記為t(n).
例項:計算1~100的和。
注:第一種方式,t(n)=n+1,其中+1,是最後一次對條件判斷,不成立然後退出迴圈。
結論:1)2n + 20 和 2n 隨著 n 變大,執行曲線無限接近,20可以省略。
2)3n + 10 和 3n 隨著 n 變大,執行曲線無限接近,10可以省略。
結論:1)2n2+3n+10 和 2n隨著n變大,執行曲線無限接近,可以忽略 3n+10
2)n2+5n+20 和 2n2隨著n變大,執行曲線無限接近,可以忽略5n+20
可見,在趨向「無窮」時,前兩組的曲線近乎是一條重合的直線。後兩組的執行曲線出現了分離。
結論:1)隨著n值變大,5n2+7n 和 3n2+2n,執行曲線重合,說明這種情況下,5和3都可以忽略。
2)但n3+5n 和 6n3+4n ,執行曲線分離,說明多少次是關鍵。
一般情況下,演算法中的基本操作語句的重複執行次數是問題規模 n 的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當 n 趨近於無窮大時,t(n) / f(n) 的極限值為不等於0的常數,則稱f(n) 是t(n) 的同數量級函式。記作 t(n) = o( f(n) ) ,稱 o( f(n) ) 為演算法的漸近時間複雜度,簡稱時間複雜度。
注:t(n) 不同,但時間複雜度可能相同。
如t(n)=n2 +7n +6 和 t(n)=3n2+2n+2 它們的t(n)不同,但時間複雜度相同,都為o(n2).
1)用常數 1 代替執行時間中的所有加法常數,t(n)=n2 + 7n + 6 => t(n)=n2 + 7n + 1
2)修改後的執行次數函式中,只保留最高端項 t(n)=n2+7n+1 => t(n)=n2
3)去除最高端項的係數 t(n) = n2 => t(n)= n2 => o(n2)
階名時間複雜度
常數階o(1)
對數階o(log2n)
線性階o(n)
線性對數階
o(nlog2n)
平方階o(n2)
立方階o(n3)
k次方階
o(nk)
指數階o(2n)
注:常見的演算法時間複雜度由小到大依次為:
o(1) < o(log2n) < o(n) < o(nlog2n) < o(n2) < o(n3) < o(n k) < o(nk) < o(2n)
隨著問題規模 n 的不斷增大,以上時間複雜度不斷增大,演算法的執行效率也越低。所以,我們要盡可能避免使用指數階的演算法。
說明:參考上面的o(n2) 去理解,o(n3)相當於三層n迴圈,其它的類似。
1)平均時間複雜度是指所有可能的輸入例項均以等概率出現的情況下,該演算法的執行時間。
2)最壞情況下的時間複雜度稱最壞時間複雜度。==一般討論的時間複雜度都是最壞情況下的時間複雜度。==原因是:最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的界限,這就保證了演算法的執行時間不會比最壞情況更長。
3)平均時間複雜度和最壞時間複雜度是否一致,和演算法有關,見下圖:
資料結構和演算法學習(2) 時間複雜度
借鑑自生活中 較大 較小 偏快 偏慢 等粗略的度量概念,在電腦科學中有一種粗略的度量方法稱之為 大o 表示法 這是一種可以描述演算法的速度如何與資料項的個數相聯絡的比較。無序陣列中新的資料項總是被放在下乙個有空的地方,無論資料項個數有多大,一次插入總是用相同的時間,這個時間可以表示為乙個常數,即用如...
資料結構(二) 時間複雜度 例子分析(相當清晰)
在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。時間複雜度記作 t n o f n 它表示隨問題規模n的增大,演算法執行時間的增長率和f n 的增長率相同,稱作演算法的漸進時間複雜度,簡稱時間複雜度。發現官方定義極其高大上,換...
資料結構 時間複雜度 筆記
1 折半查詢演算法的演算法複雜度是多少?正確答案 a o log2n o n o n二次方 o 1 2 下面程式段的時間複雜度為 for int i 0 ifor int j 0 ja i j i j 正確答案 c 你的答案 b 錯誤 o m2 o n2 o m n o m n 3 演算法的時間複雜...