大o符號(big o notation)是用於描述函式漸進行為的數學符號。
也可以這麼說:
用乙個大o,在其括號()中,用另乙個函式來描述原來的函式的數量級的漸進上界電腦科學中,用於分析演算法複雜性非常有用
這個符號有兩種形式上很接近但迥然不同的使用方法:無窮大漸近與無窮小漸近。然而這個區別只是在運用中的而不是原則上的——除了對函式自變數的一些不同的限定, 「大o」的形式定義在兩種情況下都是相同的
分析演算法複雜度時,用的o都代表無窮大漸進,表示n趨近於無窮大的情況舉例如下:
假設,解決乙個規模為n的問題所花費的時間(或者所需步驟)可以表示為:
t(n) = 4n2 - 2n + 2
當n越來越增大時,n2項將開始佔主導地位,而其它各項可以被忽略(自然包括2)
例如:當n=500時,4n2 項是2n項的1000倍大,因此在大多數非精確場合下,省略2n項對表示式值得影響是可以忽略不計的
其實進一步看,與n2的指數相比其係數4(與指數增大相比係數是很小的)也是無關緊要的
這樣,大o符號就記下剩餘的部分,寫作:
t(n)∈o(n2)
或者更常見的
t(n)=o(n2)此時,我們就說該演算法具有n2階(平方階)的時間複雜度
暫不描述
下表是在分析演算法時常見的函式。這些函式都處於n趨近於無窮大的情況下,在這種情況下函式結果值增長的慢的在表上方。c是乙個任意常數,重點是n 符號
名稱(後面都要+個「階」)
o(1)常數
o(log n)對數,情況最多的底數為2(但也可能為其它),但是底數無關緊要,所以不明確說底數
o[(long n)c]
多對數o(n)線性
o(n log* n)
log* n為迭代對數
o(n log n)線性對數
o(n2)平方
o(nc),interger(c>1)
多項式,有時叫「代數」
o(cn)指數,有時叫「幾何」
o(n!)
階乘,有時叫「組合」
同乙個演算法用不同的語言實現,或者用不同的編譯程式進行編譯,或者在不同的計算機上執行時,效率都肯定不同。這表明使用絕對的時間單位衡量演算法的效率是不合適的。撇開這些與計算機軟硬體有關的因素,可以認為乙個特定的演算法「執行工作量」的大小,只依賴於問題的規模(通常用n來表示),或者說它是問題規模n的函式。
演算法由 控制
結構(順
序、分支
和迴圈)
+原操作
(資料類
型固有的
操作) 構成,則演算法時間取決於兩者的綜合效果。通常會選取一種對於所研究的問題來說是基本操作的原操作,以該原操作重複執行的次數作為演算法的時間量度。
一般情況下,演算法中的基本操作重複執行次數是問題規模n
的某個函式f(n)
,演算法的時間量度記作: t(
n)=o
(f(n
))稱作演算法的漸近時間複雜度(asymptotic time complexity),簡稱為時間複雜度。
通常情況下:原操作就是程式中最深層迴圈內的語句中的原操作;通常在乙個演算法內只需要選擇一種基本操作來討論即可,但不排除有時候需要同時考慮幾種基本操作。
由於演算法的時間複雜度考慮的只是對於問題規模n的增長率,則在難以精確計算基本操作執行次數的情況下,只需求出它關於n的增長率或階即可。
有的情況下,演算法中基本操作重複執行的次數還隨著問題的輸入資料集不同而不同,例如冒泡演算法。對這類問題的分析:
一種辦法是計算平均時間複雜度,不過由於各種輸入集出現的概率難以確定,演算法的平均時間複雜度也很難確定;
更可行也更常用的方式是,討論演算法在最壞情況下的時間複雜度,通常討論時間複雜度,如果沒有特別說明則均指的是最壞時間複雜度;
最好時間複雜度,一般不討論,沒有意義。
時間複雜度 大O演算法
演算法的執行效率,就是演算法 的執行時間。我們需要能夠用肉眼就看出一段 的執行時間。int cal int n return sum 2,3行都執行了1個unit time的執行時間,4,5行都執行了n遍,所以是2n unit time的執行時間,所以一共是 2n 2 unit time。所有的 的...
大O表示法 時間複雜度
引入原因 用另乙個 通常更簡單的 函式來描述乙個函式數量級的漸近上界。定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式。t n 稱為這一演算法的 時間複雜度 某個演算法的複雜度到達了這個問題複雜度的下界,那就稱這樣的演算法是最佳演算法 決定演算法複雜度的是執...
時間複雜度和大O記號
時間複雜度 執行乙個程式的基本步驟的總數量。這麼理解比較直觀吧,看他一共需要執行的步驟 q a,b,c,是1000以內的自然數,滿足a b c 1000,a平方加b平方等於c平方。方法一 列舉法 import time start time time.time for a in range 1001...