演算法的時間複雜度O

2021-10-24 16:44:25 字數 1517 閱讀 3500

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

這樣用大寫 [ o( ) ] 來體現演算法時間複雜度的記法,我們就稱之為大o記法。例如:o(n)、o(1)、o(n2)、o(log n) 等等。一般情況下,隨著 n 的增大,t(n) 增長最慢的演算法為最優演算法。

1,用時間1取代運算時間中的所有加法常數。

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

3,如果最高端項存在且不是1,則去除與這個項相乘的常數。得到的結果就是大o階。

1 int sum = 0, n = 100;    /* 執行一次 */

2 sum = (1+n) *n/2; /* 執行一次 */

3 printf("the sum is:%d",sum); /* 執行一次 */

我們可以看出執行次數的函式是 f(n) = 3。根據我們上面的大o階公式 1 可以得到,把常數項 3 改為 1,在保留最高端時發現沒有最高端項,所以時間複雜度為大 o(1)。也就是說,無論演算法是 3 次還是 30 次,哪怕是 300 次,這些只要是常數項,它的時間複雜度都為大 o(1),而不是o(3)、o(30)、o(300)。即我們稱之為常數階。

1 for(int i = 0; i < n; i++)
從上面的這段**我們可以看出,它的時間複雜度為o(n),因為迴圈體中的**需要執行n次。

1 for(int i = 0; i < n; i++) 

5 }

分析:

當 i = 0時,內迴圈執行了 n 次,

當 i = 1時,內迴圈執行了 n-1 次,

當 i = n-1時。執行了 1 次,

所以總的執行次數為:n = (n-1)+(n-2)+ ··· + 1= n(n+1)/2 = n2/2+n/2。

由上面的公式可得:第一條**中沒有加法常數項,不考慮;第二條只保留最高端項,因此保留 n2/2;第三條去除這個項相乘的常數,所以去除了 1/2;最終我們得到的**段時間複雜度就是 o(n2)。

1 int count = 1;

2 while (count < n)

上面**我們可以看出,count = count * 2 之後就距離 n 更近一步,也就是說,有多少個 2 相乘後大於 n,就退出迴圈。所以我們可以由 2x = n 推導出 x = log2n ,像這樣的迴圈時間複雜度,我們就稱為對數階的複雜度即為 o(log n)。

資料結構中我們一般常用的時間複雜度表示有:o(1)、o(n)、o(n2)、o(log n)、o(nlog n)、o(n3)、o(2n)。

按時間複雜度所耗費的時間從大到小排序依次為:

o(1) < o(log n) < o(n) < o(nlog n) < o(n2) < o(n3) < o(2n)

演算法的時間複雜度O

在進行演算法分析時,語句總的執行次數 t n 是關於問題的規模n 的函式,進而分析 t n 隨 n 的變化情況並確定 t n 的數量級,演算法的時間複雜度,也就是演算法的時間度量,記作 t n o f 它表示隨問題的規模 n 的增大,演算法的執行時間的增長率 f n 的增長率相同,稱作演算法的漸近時...

時間複雜度 大O演算法

演算法的執行效率,就是演算法 的執行時間。我們需要能夠用肉眼就看出一段 的執行時間。int cal int n return sum 2,3行都執行了1個unit time的執行時間,4,5行都執行了n遍,所以是2n unit time的執行時間,所以一共是 2n 2 unit time。所有的 的...

如何衡量演算法時間複雜度,空間複雜度以及大O表示法

演算法是用來解決特定的問題的一種思想,對於同乙個問題,可以有多種實現方式,最終的結果是一樣的,但是整個過程需要的時間和資源不同,我們就需要在時間和空間上進行衡量。時間複雜度 當前演算法所需要的執行時間 空間複雜度 當前演算法所需要的記憶體空間 大 o 表示法 也叫做漸進式時間複雜度,公式為 t n ...