演算法效率衡量
時間複雜度和大o表示法
時間測量模組
python列表型別的時間效率
python列表和字典的時間複雜度
常見時間複雜度
資料結構和演算法是程式設計師的兵法,用於提高**執行效率和效能
演算法演算法是計算機處理資訊的本質,程式本質上是乙個演算法來告訴計算機確切的步驟來執行乙個指定的任務,是為了解決實際問題而設計
資料結構
資料結構指資料物件中資料元素之間的關係。資料結構是演算法需要處理的問題載體。
例子如果 a+b+c=1000,且a2 + b2 = c2(a,b,c為自然數),如何求a,b,c
思路1:列舉法遍歷
a =0 …1000
b =0 …1000
c =0 …1000
import time
start_time=time.time(
)for a in
range
(1000):
for b in
range
(1000):
for c in
range
(1000):
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:%f"
%(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:183.689066
finished
思路2:列舉法遍歷a =0 …1000
b =0 …1000
c =1000-a–b
import time
start_time=time.time(
)for a in
range
(1000):
for b in
range
(1000):
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
("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:1.819427
finished
演算法對於不同的機器環境而言,確切的單位時間是不同的,但是對於演算法進行多少個基本操作(即花費多少時間單位)在規模數量級上卻是相同的,由此可以忽略機器環境的影響而客觀的反應演算法的時間效率。
timeit模組:
timeit.timer(
'操作**','類似匯入設定', timer=
)# 執行**10000次返回平均耗時
timeit.timer.timeit(number=
10000
)
from timeit import timer
deftest1()
: l =
for i in
range
(1000):
l = l +
[i]def
test2()
: l =
for i in
range
(1000):
l +=
[i]def
test3()
: l =
for i in
range
(1000):
deftest4()
: l =
for i in
range
(1000):
l.extend(
[i])
deftest5()
: l =
[i for i in
range
(1000)]
deftest6()
: l =
list
(range
(1000))
if __name__ ==
'__main__'
: t1 = timer(
'test1()'
,'from __main__ import test1'
)print
("concat:"
, t1.timeit(number=
1000),
"seconds"
) t2 = timer(
'test2()'
,'from __main__ import test2'
)print
("+=:"
, t2.timeit(number=
1000),
"seconds"
) t3 = timer(
'test3()'
,'from __main__ import test3'
)print
(, t3.timeit(number=
1000),
"seconds"
) t4 = timer(
'test4()'
,'from __main__ import test4'
)print
("extend:"
, t4.timeit(number=
1000),
"seconds"
) t5 = timer(
'test5()'
,'from __main__ import test5'
)print
("iter:"
, t5.timeit(number=
1000),
"seconds"
) t6 = timer(
'test6()'
,'from __main__ import test6'
)print
("list():"
, t6.timeit(number=
1000),
"seconds"
)
執行次數函式舉例
階非正式術語
12o(1)
常數階2n+3
o(n)
線性階3n2+2n+1
o(n2)
平方階5log2n+20
o(logn)
對數階2n+3nlog2n+19
o(nlogn)
nlogn階
6n3+2n2+3n+4
o(n3)
立方階2n
o(2n)
指數階
資料結構 資料結構與演算法01
1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...
資料結構與演算法 筆記(1)概念
程式 資料結構 演算法 1.緒論 1 邏輯結構 a 集合結構 同屬於乙個集合外沒有關係 b 線性結構 元素之間存在一對一關係 c 樹形結構 一對多 d 圖形結構 多對多 2 物理結構 a 如何把資料元素存放到計算機的儲存器中,針對記憶體而言,像硬碟 軟盤 光碟等外部儲存器的資料結構組織通常使用檔案結...
資料結構與演算法概念
資料結構是個抽象的概念,所以並沒有官方的定義,資料結構 演算法於應用 中是這樣來定義的 資料結構是資料物件,以及存在於該對像的例項以及組成例項的資料元素間的各種聯絡,這種聯絡可以通過定義相關函式來給出。我所理解的資料結構是資料元素之間的關係所構成的某種集合。樹和圖,就是很好的例子,他們是根據資料元素...