第一次嘗試
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**
2+ b**
2== c**
2and a+b+c ==
1000
:print
("a, b, c: %d, %d, %d"
%(a, b, c)
)end_time = time.time(
)print
("elapsed: %f"
%(end_time - start_time)
)print
("complete!"
)執行結果:
a, b, c:0,
500,
500a, b, c:
200,
375,
425a, b, c:
375,
200,
425a, b, c:
500,0,
500elapsed:
214.583347
complete!
第二次嘗試
import time
start_time = time.time(
) 注意是兩重迴圈
for a in
range(0
,1001):
for b in
range(0
,1001
-a):
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
("elapsed: %f"
%(end_time - start_time)
)print
("complete!"
)執行結果:
a, b, c:0,
500,
500a, b, c:
200,
375,
425a, b, c:
375,
200,
425a, b, c:
500,0,
500elapsed:
0.182897
complete!
執行時間反應演算法效率
對於同一問題,我們給出了兩種解決演算法,在兩種演算法的實現中,我們對程式執行的時間進行了測算,發現兩段程式執行的時間相差懸殊(214.583347秒相比於0.182897秒),由此我們可以得出結論:實現演算法程式的執行時間可以反應出演算法的效率,即演算法的優劣。
單靠時間值絕對可信嗎?
假設我們將第二次嘗試的演算法程式執行在一台配置古老效能低下的計算機中,情況會如何?很可能執行的時間並不會比在我們的電腦中執行演算法一的214.583347秒快多少。
單純依靠執行的時間來比較演算法的優劣並不一定是客觀準確的!
程式的執行離不開計算機環境(包括硬體和作業系統),這些客觀原因會影響程式執行的速度並反應在程式的執行時間上。那麼如何才能客觀的評判乙個演算法的優劣呢?
我們假定計算機執行演算法每乙個基本操作的時間是固定的乙個時間單位,那麼有多少個基本操作就代表會花費多少時間單位。算然對於不同的機器環境而言,確切的單位時間是不同的,但是對於演算法進行多少個基本操作(即花費多少時間單位)在規模數量級上卻是相同的,由此可以忽略機器環境的影響而客觀的反應演算法的時間效率。
對於演算法的時間效率,我們可以用「大o記法」來表示。
「大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)
對於演算法進行特別具體的細緻分析雖然很好,但在實踐中的實際價值有限。對於演算法的時間性質和空間性質,最重要的是其數量級和趨勢,這些是分析演算法效率的主要部分。而計量演算法基本運算元量的規模函式中那些常量因子可以忽略不計。例如,可以認為3n2 和100n2屬於同乙個量級,如果兩個演算法處理同樣規模例項的代價分別為這兩個函式,就認為它們的效率「差不多」,都為n2級。
分析演算法時,存在幾種可能的考慮:
對於最優時間複雜度,其價值不大,因為它沒有提供什麼有用資訊,其反映的只是最樂觀最理想的情況,沒有參考價值。
對於最壞時間複雜度,提供了一種保證,表明演算法在此種程度的基本操作中一定能完成工作。
對於平均時間複雜度,是對演算法的乙個全面評價,因此它完整全面的反映了這個演算法的性質。但另一方面,這種衡量並沒***,不是每個計算都能在這個基本操作內完成。而且,對於平均情況的計算,也會因為應用演算法的例項分布可能並不均勻而難以計算。
因此,我們主要關注演算法的最壞情況,亦即最壞時間複雜度。
時間複雜度的幾條基本計算規則
基本操作,即只有常數項,認為其時間複雜度為o(1)
順序結構,時間複雜度按加法進行計算迴圈結構,時間複雜度按乘法進行計算分支結構,時間複雜度取最大值判斷乙個演算法的效率時,往往只需要關注運算元量的最高次項,其它次要項和常數項可以忽略
在沒有特殊說明時,我們所分析的演算法的時間複雜度都是指最壞時間複雜度
資料結構與演算法開篇 00
1.有窮性 乙個演算法的操作步驟是有限的,不能是無限的 2.確定性 演算法中的每乙個步驟都要確定的詞,不能含糊不清 3.輸入 演算法具有0個或多個輸入 4.輸出 演算法至少有1個或多個輸出 5.可行性 演算法的每一步都是可行的,也就是說每一步都能夠執行有限的次數完成1.正確性 演算法的執行結果應當滿...
資料結構00
資料結構分為邏輯結構跟物理結構,邏輯結構依賴於物理結構 邏輯結構 集合結構 線性結構 樹形結構 圖形結構 程式的靈魂 演算法 演算法的5大基本特性 輸入 輸出 有窮性 確定性 可行性 其他特性 價效比 效率 事後統計法 比較執行時間 問題 嚴重依賴硬體和執行時環境因素,編寫相應程式 事前分析估算法 ...
python資料結構與演算法
coding utf 8 import sys 使用以下語句將引數的str格式轉換為int格式 l list map int sys.argv 1 split target int sys.argv 2 def binarysearch print l print target left 0 rig...