算法引入
如果 a+b+c=1000,且 a2+b2=c^2(a,b,c 為自然數),如何求出所有a、b、c可能的組合?
-
枚舉法
#!/usr/bin/env python # -*- coding: utf-8 -*- # Created by xuehz on 2017/7/6 import time start_time = time.time() for a in range(0, 1001): for b in range(0, 1001): for c in range(0, 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("times:%d" %(end_time - start_time)) print("finished") a, b, c:0, 500 ,500 a, b, c:200, 375 ,425 a, b, c:375, 200 ,425 a, b, c:500, 0 ,500 times:133 finished
-
$T(n) = O(n n n) = O(n^3)$
?
-
c = 1000 - a - b 改進
?
import time
start_time = time.time()
for a in range(0, 1001):
for b in range(0, 1001):
c = 1000 - a - b
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("times:%d" %(end_time - start_time))
print("finished")
a, b, c:0, 500 ,500
a, b, c:200, 375 ,425
a, b, c:375, 200 ,425
a, b, c:500, 0 ,500
times:0
finished
$T(n) = O(nn(1+1)) = O(n*n) = O(n^2)$
算法的五大特性
輸入: 算法具有0個或多個輸入
輸出: 算法至少有1個或多個輸出
有窮性: 算法在有限的步驟之后會自動結束而不會無限循環,并且每一個步驟可以在可接受的時間內完成
確定性:算法中的每一步都有確定的含義,不會出現二義性
-
可行性:算法的每一步都是可行的,也就是說每一步都能夠執行有限的次數完成
?
算法效率衡量
”大O記法”:對于單調的整數函數f,如果存在一個整數函數g和實常數c>0,使得對于充分大的n總有f(n)<=c*g(n),就說函數g是f的一個漸近函數(忽略常數),記為f(n)=O(g(n))。也就是說,在趨向無窮的極限意義下,函數f的增長速度受到函數g的約束,亦即函數f與函數g的特征相似。
時間復雜度:假設存在函數g,使得算法A處理規模為n的問題示例所用時間為T(n)=O(g(n)),則稱O(g(n))為算法A的漸近時間復雜度,簡稱時間復雜度,記為T(n)
時間復雜度計算方法
- 基本操作,即只有常數項,認為其時間復雜度為O(1)
- 順序結構,時間復雜度按加法進行計算
- 循環結構,時間復雜度按乘法進行計算
- 分支結構,時間復雜度取最大值
- 判斷一個算法的效率時,往往只需要關注操作數量的最高次項,其它次要項和常數項可以忽略
- 在沒有特殊說明時,我們所分析的算法的時間復雜度都是指最壞時間復雜度
20170809150224214024242.png
常見時間復雜度之間的關系
20170809150224226148276.png
$O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)$