時間複雜度:
常用的時間複雜度有:常數級,對數級,線性級 線性對數級 平方級,立方級別,多項式級別,指數級別,階乘級別
這裡我們主要**對數級,線性級,平方級,指數級---為什麼不討論其他的?別的我也不會啊--- 囧
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...
時間複雜度 空間複雜度
演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...