時間複雜度

2022-08-30 01:54:11 字數 1761 閱讀 5977

分析:

1大部分程式的大部分指令之執行一次,或者最多幾次。如果乙個程式的所有指令都具有這樣的性質,我們說這個程式的執行時間是常數。

logn

如果乙個程式的執行時間是對數級的,則隨著n的增大程式會漸漸慢下來,如果乙個程式將乙個大的問題分解成一系列更小的問題,每一步都將問題的規 模縮減成幾分之一

n如果程式的執行時間的線性的,很可能是這樣的情況:對每個輸入的元素都做了少量的處理。當n=1 000 000時,執行時間大概也就是這個數值;當n增長到原來的兩倍時,執行時間大概也增長到原來的兩倍。如果乙個演算法必須處理n個輸入(或者產生n個輸出), 那麼這種情況是最優的。

nlogn

如果某個演算法將問題分解成更小的子問題,獨立地解決各個子問題,最後將結果綜合起來

n平方如果乙個演算法的執行時間是二次的(quadratic),那麼它一般只能用於一些規模較小的問題。這樣的執行時間通常存在於需要處理每一對輸入 資料項的演算法(在程式中很可能表現為乙個巢狀迴圈)中,當n=1000時,執行時間是1 000 000;如果n增長到原來的兩倍,則執行時間將增長到原來的四倍。

n三次方

類似的,如果乙個演算法需要處理輸入資料想的三元組(很可能表現為三重巢狀迴圈),其執行時間一般就是三次的,只能用於一些規模較小的問題。當n=100時,執行時間就是1 000 000;如果n增長到原來的兩倍,執行時間將會增長到原來的八倍。

2的n次方

如果乙個演算法的執行時間是指數級的(exponential),一般它很難在實踐中使用,即使這樣的演算法通常是對問題的直接求解。當n=20時,執行時間是1 000 000;如果增長到原來的兩倍時,執行時間將是原時間的平方!

log log n 可以看作是乙個常數:即使n很多,兩次去對數之後也會變得很小 **自

附:log函式圖象

例子:

⑴ int num1,num2;

⑵ for(int i=0; i⑶ num1 += 1;

⑷ for(int j=1; j<=n; j*=2)

⑺ }分析:

⒈語句int num1,num2;的頻度為1;

語句i=0;的頻度為1;

語句i語句j<=n; j*=2; num2+=num1;的頻度為n*log2n;

t(n) = 2 + 4n + 3n*log2n

⒉忽略掉t(n)中的常量、低次冪和最高次冪的係數

f(n) = n*log2n

⒊lim(t(n)/f(n)) = (2+4n+3n*log2n) / (n*log2n)

= 2*(1/n)*(1/log2n) + 4*(1/log2n) + 3

當n趨向於無窮大,1/n趨向於0,1/log2n趨向於0

所以極限等於3。

t(n) = o(n*log2n)

簡化的計算步驟

再來分析一下,可以看出,決定演算法複雜度的是執行次數最多的語句,這裡是num2 += num1,一般也是最內迴圈的語句。

並且,通常將求解極限是否為常量也省略掉?

於是,以上步驟可以簡化為:

⒈ 找到執行次數最多的語句

⒉ 計算語句執行次數的數量級

⒊ 用大o來表示結果

繼續以上述演算法為例,進行分析:

⒈執行次數最多的語句為num2 += num1

⒉t(n) = n*log2n

f(n) = n*log2n

⒊// lim(t(n)/f(n)) = 1

t(n) = o(n*log2n)

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

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

時間複雜度 空間複雜度

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

時間複雜度 空間複雜度

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