演算法的時間複雜度

2021-07-23 10:25:36 字數 1649 閱讀 7256

在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度,也就是演算法的時間度量,記作:t(n)=o(f(n))。它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸進時間複雜度,簡稱為事件複雜度。其中f(n)是問題規模n的某個函式。

我們用大寫o()來體現演算法時間複雜度的記法,我們稱之為大o記法

推倒大o階的方法:

1、用常數1取代執行時間中的所有加法常數。

2、在修改後的執行次數函式中,只保留最高端項。

3、如果最高端項存在且不是1,則去除與這個項相乘的常數。

得到的結果就是大o階。

示例:

int num1, num2;

for(int i=0; i1;

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

}

分析:

1.

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

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

語句i1; j=1; 的頻度為n;

語句j<=n; j*=

2; num2+=num1;的頻度為n*log2n;

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

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

f(n) = n*log2n

3.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,一般也是最內迴圈的語句。

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

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

1. 找到執行次數最多的語句

2. 計算語句執行次數的數量級

3. 用大o來表示結果

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

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

2.t(n) = n*log2n

f(n) = n*log2n

3.// lim(t(n)/f(n)) = 1

t(n) = o(n*log2n

常數階o(1), 對數階o(log2n), 線性階o(n), 線性對數階o(nlog2n), 平方階o(n^2), 立方階o(n^3),…, k次方階o(n^k), 指數階o(2^n) 。

常見的演算法時間複雜度由小到大依次為:

ο(1)<ο(log2n)<ο(n)<ο(nlog2n)<ο(n2)<ο(n3)<…<ο(2n)<ο(n!)

其中,

1.o(n),o(n^2), 立方階o(n^3),…, k次方階o(n^k) 為多項式階時間複雜度,分別稱為一階時間複雜度,二階時間複雜度。。。

2.o(2^n),指數階時間複雜度,該種不實用。

3.對數階o(log2n), 線性對數階o(nlog2n),除了常數階以外,該種效率最高。

演算法時間複雜度空間複雜度

演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...

演算法 時間複雜度 空間複雜度

1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...

演算法的時間複雜度 空間複雜度

時間複雜度和空間複雜度是度量演算法效率的常用指標 事後統計,不常用 事前統計影響因素 演算法策略 問題規模 程式語言 質量 機器執行指令的速度 撇開軟硬體的影響,演算法執行工作量的大小只依賴於問題的規模 通常用整數n表示 乙個演算法是由控制結構 順序,分支,迴圈三種 和原操作 指固有資料型別的操作 ...