時間複雜度和大O記號

2021-08-31 23:50:25 字數 1556 閱讀 7110

時間複雜度:執行乙個程式的基本步驟的總數量。(這麼理解比較直觀吧,看他一共需要執行的步驟)

q:a,b,c,是1000以內的自然數,滿足a+b+c=1000,a平方加b平方等於c平方。方法一:列舉法

import time

start_time = time.time()

for a in range(1001):

for b in range(1001):

for c in range(1001):

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

print('a,b,c:%d,%d,%d'%(a,b,c))

end_time = time.time()

print('time is : %'%(end_time - start_time))

所需要的步驟:t = 1001*1001*1001*2

問題規模為n的話

t(n)=n*n*n*2 = 2*n^3  (常數2,可以不計較,2*n^3與10*n^3屬於乙個量級)

時間複雜度:t(n) = n^3

"大o記法":對於單調的整數函式f,若存在乙個整數函式g和常實數c(c>0),使得對於充分大的n總有f(n) <= c*g(n),就說g是f的漸近函式,記f(n)=o(g(n))

「最壞時間複雜度」:最多需要多少步驟,提供了一種保證,在最壞時間複雜度下,該程式一定能執行完。

時間複雜度基本計算:

1、基本操作,即只有常數項,認為其時間複雜度為o(1)

2、順序結構,時間複雜度按加法進行計算

3、迴圈結構,時間複雜度按乘法計算

4、分支結構,時間複雜度取最大值

5、判斷乙個演算法的效率時,往往只需要關注運算元量的最高次項,次要項和常數項可以忽略

6、沒有說明時,我們所分析的演算法時間複雜度是「最壞時間複雜度」

改進演算法:

for a in range(1001):

for b in range(1001):

c = 1000 - a - b

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

print('a,b,c:%d,%d,%d'%(a,b,c))

演算法時間複雜度:

t(n) = n*n*(1 + max(0,1)) =2*n^2

= o(n^2)

常見的時間複雜度(logn,不是和理解啊,那是什麼鬼?)

常見時間複雜度大小比較:

上面沒寫的是:n^2 < n^2*log(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表示法。接下來讓我們進入複雜度的學...

大O符號與時間複雜度

大o符號 big o notation 是用於描述函式漸進行為的數學符號。也可以這麼說 用乙個大o,在其括號 中,用另乙個函式來描述原來的函式的數量級的漸進上界 電腦科學中,用於分析演算法複雜性非常有用 這個符號有兩種形式上很接近但迥然不同的使用方法 無窮大漸近與無窮小漸近。然而這個區別只是在運用中...