python数据结构与算法之问题求解
懂得計算機的童鞋應該都知道,一條計算機程序由數據結構跟算法兩大部分組成。所以,其實不管你使用哪種計算機語言編寫程序,最終這兩部分才是一個程序設計的核心。所以,一個不懂得數據結構與算法的程序員不是一個好工程師。因此,對于每個在計算機領域的工作者而言,數據結構與算法都是很重要的一門必修課。
?
我還是按照自己復習計算機網絡課程的模式來解釋吧,先挑選一個課本,然后逐一用自己的語言過一遍書中的內容。由于本人一直用的Python進行程序開發與設計,所以就選了一本跟Python有關的書籍,那就是裘宗燕教授寫的數據結構與算法--Pyhon語言描述。
?
就是這本書
?
如果你看過,或者知道這本書,應該會對它有所了解。這本書對于初學者來說其實并不容易,因為裘宗燕教授描述程序的語言是十分精確與嚴格的,基本跟計算機程序執行的思路相一致,因此在理解上有些許吃力。但是當你真的靜下心學完之后,就會明顯感覺到付出這種辛苦是很有必要的。因為在這本書中,不僅有數據結構與算法的知識和步驟,更重要的是書的編寫處處都體現了一個編程工作者需要考慮問題的嚴謹思路,而這個思路才是解決同類問題的關鍵所在。所以,我認為這是一本很好的書,而且這種對書中知識點的理解也是一個程序員思考的必經之路。
?
好了,就從計算機程序設計的過程與步驟開始吧。
?
就像很多從事計算機編程的工作人員一樣,我在開始進行編寫代碼之前總會有一系列的思考過程。這個思考過程是十分重要的,它才是能寫出優秀代碼的前提。在這一點,我一直認為工程師跟作家是很相似的,只不過作家是用人類的語言來將他所構思的觀點通俗而又深刻地通過筆寫出來,而工程師是用計算機語言將某一類問題的邏輯準確而又嚴謹地通過計算機求解出來。
?
大部分人使用計算機都被固定在幾個獨有的應用軟件里面,這樣固然很方便,但是具有局限性。其實,計算機最大的用處是可以通過程序來解決實際生活中遇到的一類問題。就像那些我們所熟悉的應用軟件,它們之所以能夠被廣泛應用,也是因為解決了很多人生活中的實際問題,滿足了人們的需求。
?
然而,在實際生活中的問題往往是各種各樣無窮無盡的。所以并不可能都有固定的程序來讓計算機執行,這個時候就需要我們程序開發人員根據不同的問題類型來進行歸類編寫程序。
?
之所以要對問題進行分類,就是因為開發一個程序,往往能解決一類型的問題。雖然開發的過程只需要一次,但是解決問題的過程可以有很多次。比如,一個簡單的計算機程序,當被開發出來之后,不管是對于簡單的加法實例1+1,還是對于復雜的乘法實例999*234,都能夠被計算出來。
?
既然用計算機解決問題是要開發出解決問題的程序,那么程序又是怎么開發出來的呢?來看下圖。
第一步:我們得知道需要解決的問題是什么樣的問題,這個對于問題的描述就很重要。它的描述并不是像我們實際生活中提問的模糊問題,它是必須弄清問題的具體細節,也就是要對問題進行一個嚴格化描述,使人不產生歧義,并且包含了要解決問題需要做的各個方面。通常我們把這個階段稱之為需求分析階段。
?
第二步:將上面對問題的嚴格化描述,通過程序求解步驟表達出來,這是對問題的一個過程性描述,并不是對問題是什么的描述,兩者其實并不一樣。在這樣的表達之前,必須要有一個解決該問題的抽象計算模型,這個抽象計算模型包括計算過程中所用的數據,跟求解這個問題所用到的算法。所以,這個階段是程序設計中最重要也是最困難的階段,我們稱之為程序設計階段。
?
第三步:當有了合適的數據結構和算法的描述性語言之后,使用合編程語言將它實現出來就比較容易了。一般使用語言中的各種數據機制實現數據結構,用控制語句來實現算法。這里我們用的主要是Python語言,這時候的實現就是程序了。這個階段稱之為編碼階段。
?
第四步:當程序實現出來之后,需要我們用計算機或者肉眼來檢驗程序里面是否存在著語法錯誤,若有錯誤,進行修改,直到得到一個可執行的程序。這個階段稱之為檢查測試階段。
?
第五步:有了可執行程序之后,只是說明程序沒有語法錯誤。但是還可能存在邏輯錯誤,或者設計錯誤。這個時候就需要對程序的功能進行再三確定,是否滿足問題的所有條件。如果發現錯誤,就要再次回到上面的某一個階段再進行重新設計或者編碼。這個階段稱之為測試/調試階段。
?
這就是計算機進行求解過程的5個階段。下面用一個簡單例子來解釋說明一下。現在假設要求出任一個非負實數的平方根。
?
第一步就是將問題嚴格化,使之不存在歧義。這里假設實數的概念已經清楚,而不清楚的就是平方根。我們可以采用數學上對它的描述概念,就是非負實數x的平方根就是滿足等式y*y=x的非負實數y。
?
但是還有一個問題,通常非負實數的平方根有很多是無窮的無理數,但是計算機程序必須在有窮步內完成,因此這里允許一個誤差,使計算機求解的答案十分近似于求解答案。所以,上面的嚴格描述可以變成這樣:求一個非負實數x的平方根,必須找到一個y,使y滿足條件|y*y-x|<e,其中e就是作為參數實現給定的。
?
得到一個嚴格性對問題的描述之后,就進入第二步,設計抽象計算模型。對于求解平方根的算法,數學課程里面有一種,但是不太適合機械執行。因此這里采用另外一種算法,牛頓迭代法。
?
至于牛頓迭代法,知乎有個比較好的帖子,大家可以看一下。不過這里要用到它的一個公式Xn+1= Xn -f(Xn)/f'(Xn)。這個是求f(x)函數切線的根的一個公式。具體到平方根就是z = y - (y2-x)/2y = (2y2-y2+x)/2y = (y2+x)2y = (y+x/y)2
?
所以對于這個平方根的牛頓迭代法的計算過程描述如下:
0.對給定的任意正實數x和誤差e,使得變量y取任意正實數,如令y=x
1.如果y*y與x足夠接近,即|y*y|-x<e,計算結束并把y作為結果。
2.取z = (y+x/y)/2
3.將z值作為y的新值,回到步驟1。
?
這樣第二個階段,算法的設計就完成了。然后再用python實現這個算法,就很容易了。下面是python的代碼:
def sqat(x):
????y = 1.0
????while abs(y*y - x) > 1e-6:
????????y = (y+x/y)/2
????return y
其中變量y的初始值為1.0,允許的誤差為10的-6次方。可以用Pycharm或者其他IDE來執行檢查語法錯誤,然后再輸入不同的參數來檢查結果。
轉載于:https://www.cnblogs.com/walle-zhao/p/10456196.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python数据结构与算法之问题求解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改gitignore 后不起作用
- 下一篇: websocket python爬虫_p