時間複雜度

2021-09-28 18:17:42 字數 2036 閱讀 9887

時間複雜度是衡量演算法好壞的乙個重要指標。

衡量**的好壞,包含兩個非常重要的指標

如果**沒有執行起來,怎樣預知到**執行所消耗的時間呢?

**由於執行環境和輸入規模的影響,**的絕對執行時間是無法估計的,但是為我們可以預估出**的基本操作的執行次數。通過**的執行次數來判斷**的好壞

基本執行次數

關於**的基本操作執行次數,使用生活的場景來做一下比喻。

上面的四個例子分別對應了程式中最常見的四種執行方式。

場景一:

t(n)=3n,執行的次數是線性的

場景二:

t(n)=5logn 執行的次數是對數的

場景三:

t(n)=2 執行的次數是常量的。

場景四:

t(n)=0.5n*2+0.5n 執行的次數是乙個多項式(多項式是單項式的和或者差,單項式是乙個數字,乙個字母或者乙個分式,或者乙個數字與字母的乘積)

漸進時間複雜度

有了基本操作執行次數的函式t(n),是否就可以分析和比較一段**的執行時間了呢?

還是有一定難度的。

比如演算法a的相對時間是t(n)=100n,演算法b的時間是t(n)=5n*2,那麼這兩個到底誰的執行時間更長一些?這就要看n的取值了。

所以這有了漸進時間複雜度的概念,官方的定義如下:

若存在函式f(n),使得當n趨近於無窮大的時候,t(n)/f(n)的極限值為不等於0的常數,則稱f(n)是t(n)的同數量級函式。

記作t(n)=o(f(n)),稱o(f(n))為演算法的漸進時間複雜度,簡稱時間複雜度。

漸進時間複雜度用大寫o 來表示,所以也被稱為大o表示法,簡寫為t(n)

直白的講,時間複雜度就是把時間規模函式t(n)簡化為乙個數量級,這個數量級可以是n,n^2, n^3等等

如何推導出時間複雜度呢?有如下幾個原則:

好,現在回過頭看看剛才的四個場景

場景一:

t(n)=3n,最高端項為3n,省去係數3,轉化為時間複雜度為:t(n)=o(n)

場景二:

t(n)=5logn,最高端項為5logn,省去係數5,轉化為時間複雜度為:t(n)=o(logn)

場景三:

t(n)=2,只有常數量級,轉化的時間複雜度為t(n)=o(1)

場景四:

t(n)=0.5n^2+0.5n,省去係數0.5,轉化的時間複雜度為:t(n)=o(n*2)

這四種時間複雜度究竟誰用時更長,誰更節省時間呢?稍微思考一下就可以得出結論。

這個的話可以畫圖進行比較

o(1)在程式設計的世界中有著各種各樣的演算法,除了上述的四個場景,還有許多不同形式的時間複雜度,比如:

o(nlogn),o(n3),o(mn),o(2*n),o(n!)

分析演算法時,存在著幾種可能的考慮:

對於最優時間複雜度,太過理想,對於最壞時間複雜度,提供了一種保證,對於平均時間複雜度是對演算法的乙個全面評價,因此他完整全面的反映了這個演算法的性質。

如果沒有提示的話,預設是最壞的時間複雜度。

eg:

for a in range(0,1001):

for b in range(0,1001):

for c in range(0,1001):

if a**2+b**2==c**2 and a+b+c=1000:

print(a,b,c)

上面這些**的時間複雜度為o(1000**3),因為他是迴圈結構,所以他的時間複雜度是迴圈體次數冪

for a in range(0,1001):

for b in range(0,1001):

c=1000-a-b

if a**2+b**2=c**2

print(a,b,c)

上面這些**的時間複雜度是o(100**2)

dfs時間複雜度 時間複雜度 空間複雜度

時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...

時間複雜度 空間複雜度

時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...

時間複雜度 空間複雜度

演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...