# 列舉法來解決解方程式的問題:兩重迴圈for a inrange(0,1001):for b inrange(0,1001-a):# 因為b和c不會佔用已選擇出來的、a的數值
c =1000- a - b
if a**2+ b**2== c**2:print("a, b, c: %d, %d, %d"%(a, b, c))
假設
a
+
b
+
c
=
n
a+b+c=n
a+b+c=n,
T
(
n
)
=
n
3
+
2
T(n) = n^3 +2
T(n)=n3+2。
如何理解“大O記法”
更關心數量級,不那麼關心繫數。
T
(
n
)
=
n
3
∗
2
T(n) = n^3 *2
T(n)=n3∗2 和
T
(
n
)
=
n
3
∗
2
T(n) = n^3 *2
T(n)=n3∗2 在同一個數量級,影像走向也一樣。都為
g
(
n
)
=
n
3
g(n) = n^3
g(n)=n3級。
g
(
n
)
g(n)
g(n)就是
T
(
n
)
T(n)
T(n)的漸進函式(忽略函式),記為
f
(
n
)
=
O
(
g
(
n
)
)
f(n) = O(g(n))
f(n)=O(g(n))。
最壞時間複雜度
資料的情況不同,資料處理所需要的步驟也不同。
演算法完成工作最少需要多少基本操作,即最優時間複雜度,參考價值不高。
演算法完成工作最多需要多少基本操作,即最壞時間複雜度,一般考慮的也是他。
演算法完成工作平均需要多少基本操作,即平均時間複雜度,關注度最小。
時間複雜度的幾條基本計算規則
基本操作,即只有常數項,認為其時間複雜度為O(1),不能算進來函式呼叫。
順序結構,時間複雜度按加法進行計算
迴圈結構,時間複雜度按乘法進行計算
分支結構,取最複雜分支的時間複雜度
判斷一個演算法的效率時,往往只需要關注運算元量的最高次項,其它次要項和常數項可以忽略。
在沒有特殊說明時,我們所分析的演算法的時間複雜度都是指最壞時間複雜度。
演算法分析
第一次嘗試:
O
(
n
3
)
O(n^3)
O(n3)
第二次嘗試:
O
(
n
2
)
O(n^2)
O(n2)
常見時間複雜度
執行次數函式舉例
階
非正式術語
12
O(1)
常數階
2
n
+
3
2^n+3
2n+3
O(n)
線性階
3
n
2
+
2
n
+
1
3n^2+2n+1
3n2+2n+1
O
(
n
2
)
O(n^2)
O(n2)
平方階
5
l
o
g
2
n
+
20
5log_2n+20
5log2n+20
O
(
l
o
g
(
n
)
)
O(log(n))
O(log(n))
對數階
2
n
+
3
n
l
o
g
2
n
+
19
2n+3nlog_2n+19
2n+3nlog2n+19
O
(
n
l
o
g
(
n
)
)
O(nlog(n))
O(nlog(n))
nlogn階
6
n
3
+
2
n
2
+
3
n
+
4
6n^3+2n^2+3n+4
6n3+2n2+3n+4
O
(
n
3
)
O(n^3)
O(n3)
立方階
2
n
2^n
2n
O(2^n)
指數階
常見時間複雜度之間的關係
根據影像的關係判斷時間複雜度的判斷
O
(
1
)
<
O
(
l
o
g
n
)
<
O
(
n
)
<
O
(
n
l
o
g
n
)
<
O
(
n
2
)
<
O
(
n
3
)
<
O
(
2
n
)
<
O
(
n
!
)
<
O
(
n
n
)
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
Python內建型別效能分析
時間複雜度為O(1)的是基本操作行,不是函式。
比如list.append()這個函式的時間複雜度不是1。可以有timeit模組來判斷。
timeit模組
timeit模組可以用來測試一小段Python程式碼的執行速度。
class timeit.Timer(stmt=‘pass’, setup=‘pass’, timer=)