演算法效率衡量:時間複雜度————程式總共要執行的基本運算步驟的總和。
對於本題的列舉法,a+b+c= 1000時,時間複雜度(基本運算步驟)為t = 1000 * 1000 * 1000 * 2 即為 t(n) = n**3 * 2
時間複雜度的幾條基本計算規則:
1.基本操作,即只有常數項,認為其時間複雜度為o(1)
2.順序結構,時間複雜度按加法進行計算
3.迴圈結構,時間複雜度按乘法進行計算
4.分支結構,時間複雜度取最大值
5.判斷乙個演算法的效率時,往往只需關注運算元量的最高次項,其他次要項和常數項可以忽略
6.在沒有特殊說明時,我們所分析的演算法的時間複雜度都是指最壞時間複雜度
常見的時間複雜度大小關係:
o(1) < o(logn) < o(n) < o(nlogn) < o(n² ) < o(n³) < o(2^n) < o(n!) < o(n ^n
例:列舉法
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
('finish'
)print
('用時:%d'
%(end_time - start_time)
)
程式用時108s
對於本題的列舉法,a+b+c= 1000時,時間複雜度(基本運算步驟)為t = 1000 * 1000 * 1000 * 2 即為 t(n) = n**3 * 2
時間複雜度為t(n) = o(n^3)
對列舉法進行改進後(通過a,b,c的關係減少對c的列舉),運算元量減少,程式用時隨之減少:
import time
start_time = time.time(
)for a in
range(0
,1001):
for b in
range(0
,1001):
c =1000
- a - b
if a **
2+ b **
2== c **2:
print
('a , b , c : %d , %d , %d'
%(a, b, c)
)end_time = time.time(
)print
('finish'
)print
('用時:%d'
%(end_time - start_time)
)
程式用時1s
timeit模組
timeit模組可以用來測試一小段python**的執行速度。
#使用timeit模組測試幾種列表生成方法所需時間
import timeit
from timeit import timer
deft1()
: li =
for i in
range
(10000):
li +=
[i]deft2(
):li =
for i in
range
(10000):
#把元素新增到列表尾部
deft3()
: li =
[i for i in
range
(10000)]
deft4()
: li =
list
(range
(100000))
deft5()
: li =
for i in
range
(10000):
li.extend(
[i])
deft6()
: li =
for i in
range
(10000):
li.insert(
0,i)
#(0,)代表每個元素都新增到列表首部
timer1 = timer(
't1()'
,'from __main__ import t1'
)print
('t1:'
,timer1.timeit(
1000))
#測試1000次
timer2 = timer(
't2()'
,'from __main__ import t2'
)print
('t2:'
,timer2.timeit(
1000))
#測試1000次
timer3 = timer(
't3()'
,'from __main__ import t3'
)print
('t3:'
,timer3.timeit(
1000))
#測試1000次
timer4 = timer(
't4()'
,'from __main__ import t4'
)print
('t4:'
,timer4.timeit(
1000))
#測試1000次
timer5 = timer(
't5()'
,'from __main__ import t5'
)print
('t5:'
,timer5.timeit(
1000))
#測試1000次
timer6 = timer(
't6()'
,'from __main__ import t6'
)print
('t6:'
,timer6.timeit(
1000))
#測試1000次
結果如下圖,可以看出每種方法的效率不一樣,在具體任務中可考慮使用。
資料結構引入歧途——資料的組織方式。
資料結構只是靜態的描述了資料元素之間的關係。
高效的程式需要在資料結構的基礎上設計和選擇演算法。
程式 = 資料機構 + 演算法
總結:演算法是為了解決實際問題而設計的,資料結構是演算法需要處理的問題載體。
抽象資料型別概念:把原有的基本資料和這個資料所支援的基本操作放在一起,形成乙個整體。
最常用的5種資料運算:插入、刪除、修改、查詢、排序。
資料結構 時間複雜度 空間複雜度
1.演算法效率 演算法效率可以用來衡量乙個演算法的好壞 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率.時間效率被稱為時間複雜度,空間效率被稱為空間複雜度.時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小...
資料結構時間複雜度
如何衡量乙個演算法的複雜度?演算法的時間複雜度和空間複雜度統稱為演算法的複雜度 void test int n for int k 0 k 2 n k icount intcount 10 while count icount 這個函式執行次數為f n n n 2 n 10 時間複雜度實際就是乙個函...
資料結構 時間複雜度
一 演算法 是解決特定問題求解不走的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。1.正確性 演算法的正確性是指演算法至少應該具有輸入 輸出和加工處理無歧義性 能正確反映問題的需求 能夠得島問題的正確答案。2.可讀性 演算法設計的另一目的是為了方便閱讀 理解和交流。3.健壯性...