時間複雜度入門

2022-04-10 13:12:26 字數 1849 閱讀 8335

時間複雜度: 

常用的時間複雜度有:常數級,對數級,線性級 線性對數級 平方級,立方級別,多項式級別,指數級別,階乘級別

這裡我們主要**對數級,線性級,平方級,指數級---為什麼不討論其他的?別的我也不會啊--- 囧 

f(x)  ε o(n*n):這裡指的是f這個函式的增長速度 不會以後n*n快 這裡的x指的是特定的輸入 

用n來估算x的範圍大小

我們先寫一段**。qaq:

def exp1(a,b):

ans =1

while(b>0):

ans *=a

b -=1

return ans

這個方法是求 a的b次方的值 ?那麼如果b=10 做了多少次操作呢  3b+2 也就是32次 那麼我們可以得出

f(x)  ε o(3b+2) 但是2好像是不會變的,當數值變大時2就沒有意思 所以f(x)  ε o(3b) 當然他就是線性的 我們都寫錯o(n) ----這就是所謂的線性級

我們在來看看下面的**:

def exp2(a,b):

if b == 1:

return a

else:return a*exp2(a ,b-1)

print exp2(2,3)

這裡我們用的是遞迴,同樣的我們來看看這個函式執行數跟引數的關係:

t(b) = 3+t(b-1) --->t(b) = 3+3+t(b-2)    我們找到規律就是  t(b) = 3*k+t(b-k) --這裡的k 是我們新增的引數

我們知道當b-k=1 的時候就結束了 那麼 k = b-1 上述方程式:結果為 3b-2 那麼 f(x) ε o(3b-2)也是線性的

那麼接著看下面的**:

def exp3(a,b):

if b == 1:

return a

if (b/2)*2 ==b:

return exp3(a*a,b/2)

else:

return a*exp2(a ,b-1)

我們在這裡做了小小的效能優化 ,如果我們求的是 偶數次方 我們知道 a的4次方等於 a*a的平方

t(b)= 6+t(b/2)--->6+6+t(b/2*2)--->6+6+6+t(b/2*2*2)---6*k+t(b/2的k次方) 我們知道當b/2的k次方=1的時候結束 那麼k = log2 b 也就是 o(log)--這裡就是對數級

接下來我們看看輕鬆的

def exp4(a,b):

x = 0

for i in range(a):

for i range(b):

x+=1

return x

很明顯 t(b)=(a*b) 也就是o(a*b)---平方級

最後我們來看下指數級: 也許是你最不想看到的情況:

def towers(size,fromstack,tostack,sparestack):

if size == 1:

print "move disk from ",fromstack, "to" ,tostack

else:

towers(size-1,fromstack,sparestack,tostack)

towers(1,fromstack,tostack,sparestack)

towers(size-1,sparestack,tostack,fromstack)

t(b) = 3+2*t(b-1)--->3+3*2+4*t(b-2)-->1*3+2*3+4*3+8*(b-3)

--->3(1+2+4+...2^k-1) +2^k*(b-k)---->o(2^n)

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

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

時間複雜度 空間複雜度

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

時間複雜度 空間複雜度

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