第1章-數據結構與算法是什麼

在計算機科學中,數據結構(Data Structure)是計算機中存儲、組織數據的方式。為什麼數據結構和算法經常放在一起討論?算法用來設計一種使用計算機來解決問題的方法。設計高效的算法又是怎麼來實現的?在我們學習了計算機編程後,也要學習數據結構與算法這些基礎內容。

一、數據結構

人們常說:程序 = 數據結構 + 算法,當遇到一個問題,或有一個需求時,在設計程序來解決問題時,其中重要一步就是設計數據結構,數據結構在問題解決中主要用來:

  • 存放要處理的數據
  • 實現算法策略

數據結構可以用一個四元組來表示:

DataStructure = (D, L, S, O)

它包括數據元素(D)、數據元素之間的邏輯關係(L)、邏輯關係在計算機中的存儲結構(S)和所規定的操作(O)這四部分。
image

1. 邏輯結構

邏輯結構是指數據元素之間客觀存在的關係,和數據在計算機中怎麼存儲無關,主要用於人們理解和交流以及指導算法的設計。邏輯結構分為四類:

  • 線性結構:數據元素之間存在一對一的關係
  • 樹形結構:數據元素之間存在一對多的關係
  • 圖形結構:數據元素之間存在多對多的關係
  • 集合結構:數據元素屬於同一個集合

image
學習研究了這四種邏輯關係是如何存儲與操作後,以後我們要解決任何問題,只要分析出要解決問題的數據關係,都可以通過這四種邏輯關係來思考,如果關係比較複雜,也是由這四種關係組成的,只要一層一層地分析就可以了。

2. 存儲結構

邏輯結構主要用於算法設計,而存儲結構用於指導算法編程實現。存儲結構有基本的兩種結構:

  • 順序存儲:邏輯上相鄰的元素存儲在物理位置相鄰的存儲單元中
  • 鏈式存儲:在數據元素中添加一些地址域或輔助結構,用於存放數據元素之間的關係

image
順序存儲結構在內存中的地址是連續的,所以存取速度很快,但是在插入或刪除操作效率低,因為插入或刪除操作會移動數據元素。

鏈式存儲結構在內存中地址可以是不連續的,插入和刪除操作效率高,因為增加了尋址的操作,所以查找和遍歷效率低。

同樣的邏輯結構(線性、樹形、圖形、集合)既可以採用順序存儲結構也可以採用鏈式存儲結構來存儲數據和關係。存儲結構的選擇主要考慮算法的效率,算法的時間和空間哪個更好,具體選擇哪種和需求有關,基本存儲結構既可以單獨使用,也可以組合使用。

image

3. 運算操作

數據結構中的操作主要是指數據元素的查找、插入、刪除、遍歷和排序等等,具體需要實現的操作根據業務需求確定。

二、算法

算法用來設計並實現一種用計算機來解決問題的方法。它滿足下列性質:

  • 輸入:有零個或多個輸入量
  • 輸出:產生至少一個輸出量
  • 確定性:算法的指令清晰、無歧義
  • 有限性:算法的指令執行次數有限,執行時間有限

image
在使用計算機解決問題的過程可以分為下面五個步驟:

  1. 問題的理解:搞清楚問題的輸入、要求和輸出
  2. 數據結構設計:設計能處理問題中數據的數據結構,還要設計能支持算法策略的數據結構
  3. 算法設計:選擇算法策略,用適當的方式描述和逐步細化算法步驟
  4. 算法分析:發現有優化的地方,返回第二步,重新設計數據結構和算法
  5. 程序實現:用計算機編程,定義數據結構,編寫代碼實現,並調試和運行

image
一個需求問題有多種解決方案,我們經常需要通過不斷嘗試和積累經驗才能找到最好的方案,如果熟練掌握了基本的數據結構和算法,對於在設計高效算法中是有很大幫助的,能更高效地解決需求問題。