1. 程式人生 > >python資料結構與演算法(1)

python資料結構與演算法(1)

資料結構與演算法(Python) Why?
我們舉⼀個可能不太恰當的例⼦:
如果將開發程式的過程⽐喻為作戰,我們碼農便是指揮作戰的將軍,⽽我們 所寫的程式碼便是⼠兵和武器。
那麼資料結構和演算法是什麼?答⽈:兵法!
我們可以不看兵法在戰場上⾁搏,如此,可能會勝利,可能會失敗。即使勝 利,可能也會付出巨⼤的代價。我們寫程式亦然:沒有看過資料結構和算 法,有時⾯對問題可能會沒有任何思路,不知如何下⼿去解決;⼤部分時間 可能解決了問題,可是對程式運⾏的效率和開銷沒有意識,效能低下;有時 會藉助別⼈開發的利器暫時解決了問題,可是遇到效能瓶頸的時候,⼜不知 該如何進⾏針對性的優化。
如果我們常看兵法,便可做到胸有成⽵,有時會事半功倍!同樣,如果我們 常看資料結構與演算法,我們寫程式時也能遊刃有餘、明察秋毫,遇到問題時 亦能⼊⽊三分、迎刃⽽解。
故,資料結構和演算法是⼀名程式開發⼈員的必備基本功,不是⼀朝⼀夕就能 練成絕世⾼⼿的。冰凍三尺⾮⼀⽇之寒,需要我們平時不斷的主動去學習積 累。
引⼊
先來看⼀道題:
如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 為⾃然數),如何求出所有 a、b、c可能的組合?
第⼀次嘗試


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**2 and 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, 500 a, b, c: 200, 375, 425 a, b, c: 375, 200, 425 a, b, c: 500, 0, 500 elapsed: 214.583347 complete!

注意運⾏的時間:214.583347秒

演算法的提出
演算法的概念
演算法是計算機處理資訊的本質,因為計算機程式本質上是⼀個演算法來告訴計 算機確切的步驟來執⾏⼀個指定的任務。⼀般地,當演算法在處理資訊時,會 從輸⼊裝置或資料的儲存地址讀取資料,把結果寫⼊輸出裝置或某個儲存地 址供以後再調⽤。
演算法是獨⽴存在的⼀種解決問題的⽅法和思想。
對於演算法⽽⾔,實現的語⾔並不重要,重要的是思想。
演算法可以有不同的語⾔描述實現版本(如C描述、C++描述、Python描述 等),我們現在是在⽤Python語⾔進⾏描述實現。
演算法的五⼤特性

  1. 輸⼊: 演算法具有0個或多個輸⼊ 2. 輸出: 演算法⾄少有1個或多個輸出 3. 有窮性: 演算法在有限的步驟之後會⾃動結束⽽不會⽆限迴圈,並且每⼀個 步驟可以在可接受的時間內完成 4. 確定性:演算法中的每⼀步都有確定的含義,不會出現⼆義性 5. 可⾏性:演算法的每⼀步都是可⾏的,也就是說每⼀步都能夠執⾏有限的 次數完成

第⼆次嘗試

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))[/size][/font]

[font=微軟雅黑][size=3]end_time = time.time() print("elapsed: %f" % (end_time - start_time)) print("complete!")

運⾏結果:

a, b, c: 0, 500, 500 a, b, c: 200, 375, 425 a, b, c: 375, 200, 425 a, b, c: 500, 0, 500 elapsed: 0.182897 complete!

注意運⾏的時間:0.182897秒