python數據結構---1.開始之前

寫在前面:

由於最近在複習數據結構,本人呢對於python也比較熟悉瞭解,加上python近年來比較火所以想寫一系列關於python數據結構的內容

和嚴蔚敏老師書的結構類似,我也會從以下幾種數據結構來寫

  1. 線性表
  2. 字符串
  3. 棧和隊列
  4. 樹和二叉樹
  5. 字典和集合
  6. 排序

從整體上來講,python寫數據結構和算法肯定是比C/C++簡單許多的,所以學習成本不會那麼大,希望每個人都能先學習一下python的基礎知識,然後再來看這個系列的內容。

正文

今天是這個系列的第一篇博客,所以我不會直接講數據結構或者算法,而是講講一些必須要了解的東西,然後舉點小例子讓大家感受一下。
我們使用計算機編程的最終目的只有一個,用計算機去解決實際問題。而且我們寫的程序不應該僅僅只能解決一個問題,而是需要解決一系列的問題,因此我們在寫代碼之前不要着急去動手,而是應該這樣做:

  • 審題(或者說弄清楚需求)
  • 深入分析需求,得到最簡單而又最合適的問題描述
  • 思考如何把問題用計算機實現,這就需要數據和設計算法

以上其實是需求分析和代碼設計,我也就不提那麼多軟件工程相關的了,畢竟還是想着讓大家學習成本儘可能降低,說這個只是想讓大家多思考,別急着盲目寫代碼。

有了設計好的算法之後,我們用編程寫出相應的代碼就解決了問題,至於後面的測試和優化這裏暫時也就不討論了。所以我們可以看到編程其實最難的地方在於思考如何設計出讓計算機能解決問題的計算方法。

來舉個例子吧:
假如我現在想求一個正數的平方根,有什麼辦法嗎?

分析一下這個問題,我們首先想到的就是求平方根,也就是對x,算出一個y,使得y*y=x

這個想法很好,然後繼續,那我們如何得到y呢

  • 我們可以嘗試0-x中的所有數,然後當這個數的平方等於x時即爲所求,但是實現起來不現實吧。
  • 我們可以退而求x平方根的近似解,即我們求得y,使得|y*y-x |小於一個很小很小的數,這個時候我們也可以說y是x的平方根。

那有了第二種思路,我們就可以設計算法來實現了:

  1. 給出一個正數x,以及允許誤差e,令y爲任意正數。
  2. 如果|y*y-x|<e,就把此時的y作爲結果返回
  3. 如果y與根號x的差異較大,那就更新y,y=(y+x/y)/2
  4. 用新的y重新計算誤差

然後把算法用代碼實現

def mysqrt(x):
    E=1e-8
    y=1.0
    while abs(y**2-x)>E:
        y=(y+x/y)/2
    return y

print(mysqrt(2))

在這裏插入圖片描述
儘管我們實現了代碼,但是我還是要強調另外一件事,那就是不要重複造輪子,注意效率。我一開始就說了python簡單,爲什麼?因爲python已經把常用的數據類型都給我們內置好了,基本的運算操作也已經都寫好了或者有相關的庫可以調用,所以不用我們那麼麻煩的再去像C一樣自己去寫代碼去構造集合,字典這樣的結構,同時也就需要我們會用這些已經有的東西。
基本的數據類型:

  • 數字
  • 字符串
  • 列表
  • 元組
  • 集合
  • 字典

所以需要大家先去了解這些數據類型的使用方法,比如:list的切片,append操作,set與dict的使用。當然對於計算來說,math庫中的函數或者numpy中的函數都要有所瞭解。

上面例子中的函數,其實我們用內置的函數就一句話

import math
print(math.sqrt(2))

#或者使用numpy
import numpy as np
print(np.sqrt(2))

在這裏插入圖片描述
效率更高,代碼量也更少。所以我們要學會利用現有的東西去解決新的問題,重點是我們要有寫代碼之前的思考過程!!!

最後

這篇博客的最後,我想提一下常見的算法設計模式:

  • 枚舉法:也是暴力算法,就是枚舉出各種可能,選擇出需要的解。
  • 貪心法:在對問題求解時,總是做出在當前看來是最好的選擇。
  • 分治法:分而治之的思想,把複雜的問題分解爲相對簡單的問題。
  • 回溯法:試探求解,發現無法繼續時返回之前的狀態。
  • 動態規劃:有點類似於分治法,它也是把複雜問題分解爲一系列簡單問題,但是它會利用各個子問題之間的關係,一步步求解,也就避免了大量重複計算。
  • 分支限界:主要用於搜索,當搜索結果超過了邊界就直接刪除,縮小求解空間。

還有算法性能的評價,時間複雜度,空間複雜度等等,很多內容我就不全部贅述一遍了,有很多優質博客大家有興趣可以自己去查看。

大家可以想想下面這段代碼有哪些信息。

a=[1,2,3,4]
print(id(a[0]),id(a))
print(id(a[1])-id(a[0]))
b=[]

import sys
print(sys.getsizeof(a),sys.getsizeof(a[1]),sys.getsizeof(b),sys.getsizeof([1]))

在這裏插入圖片描述
額,提一點題外話。爲什麼不更新flask相關的內容,第一是因爲最近在複習沒什麼太多時間,第二就是感覺沒多少人想看,所以就沒什麼動力更新。等明年稍微閒下來了我會慢慢去把flask,django還有關於go gin相關的博客全部補上的。java web相關的內容我還得去學一段時間,感覺計算機這個專業吧知識面太廣,每個知識深度又很深,只能堅持努力一點點地去學了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章