說起為什麼重新拿起這本書,著實非常慚愧。是因為面試的時候,第一個面試官面試完專案之後。第二面試官說我們就當聊聊天,考考資料結構,演算法就好了。結果以一個問題就把我難住了,這個問題是:雜湊表是什麼?
所以我打算花兩天的時間重新把這本書看一遍,並做下筆記,這次我一定會記住。
第一章 緒論
目前,計算機已深入到社會生活的各個領域,其應用已不再僅僅侷限於科學計算,而更多的是用於控制,管理及資料處理等非數值計算領域。計算機是一門研究用計算機進行資訊表示和處理的科學。這裡面涉及到兩個問題:資訊的表示,資訊的處理。
資訊的表示和組織又直接關係到處理資訊的程式的效率。隨著應用問題的不斷複雜,導致資訊量劇增與資訊範圍的拓寬,使許多系統程式和應用程式的規模很大,結構又相當複雜。因此,必須分析待處理問題中的物件的特徵及各物件之間存在的關係,這就是資料結構這門課所要研究的問題。
1.1 什麼是資料結構?
這必須是第一個問題。
大家有沒有想過,計算機在解決一個具體問題時需要幾個步驟呢?
- 從一個具體問題抽象出來一個數學模型
- 設計一個解決此模型的演算法
- 編出程式
- 進行測試
- 得到答案
下面舉三個例子:
- 圖書館書目檢索系統(按照書名或作者名進行排序):表結構(一對一)
- 下棋遊戲(每一步都對應著多種棋局):樹形結構(一對多)
- 多叉交通路口問題(每個路口之間互相影響):圖結構(多對多)
1.2 基本概念和術語
-
data(資料):對客觀事物的符號表示。
-
data element :資料的基本單位。
-
data object : 性質相同的資料元素的集合,是資料元素的一個子集。
-
data structure :是相互之間存在一種或多種特定關係的資料元素的集合。
-
structure :結構(通常有下列4種結構)
- 集合(除屬於一個集合外無其他關係)
- 線性結構(一對一)
- 樹形結構(一對多)
- 圖狀結構(多對多)
-
資料結構在計算機中的表示
資料結構在計算機中的表示稱為資料結構的物理結構,又稱儲存結構。
- bit(位):二進位制中的一位,是計算計中的最小單位。
- element(元素) or node(節點):若干位組成的位串。
- data field(資料域):當資料元素由若干資料項組成時位串中對應於各個資料項的子位串稱為資料域。
資料元素在計算機中的兩種關係
-
順序映像,儲存結構為順序儲存結構
特點:藉助元素在儲存器中的相對位置來表示資料元素之間的邏輯關係。
如表示複數:z1 = 3.0-2.3i 和 z2 = -0.7+4.8i 。(如圖a)
-
非順序映像,儲存結構為鏈式儲存結構
特點:藉助元素儲存地址的指標表示元素之間的邏輯關係。
如表示複數:z1 = 3.0-2.3i。(如圖b)
資料型別(data type)
資料型別是一個值的集合和定義在這個值上一注操作的總稱。例如 C 語言上的整形變數,其值為某個區間上的整數,定義在其上的操作為加減乘除取模等算術運算。
高階語言的資料型別可分為兩類:
1. 原子型別:原子型別的值是不可分割的。
2. 結構型別:結構型別的值由若干結構的某種結構的值組成,因此是可以分解的,並且它的成分可以是結構的,也可以是非結構的。
複製程式碼
抽象資料型別(abstract data type)
抽象資料型別是指一個數學模型以及定義在該模型上的一組操作。
一個抽象資料型別的軟體模組通常有定義,表示和實現三個部分組成。
-
定義可分為三種型別:
- 原子型別(atomic data type)
- 固定聚合型別(fixed-aggregate data type):其值由確定數目的成分按某種結構組成。複數由兩個實數依確定的次序關係組成。
- 可變聚合型別(variable-aggregate data type):構成其值的成分,數目是不確定的。
後兩種可統稱為結構型別。
抽象資料型別可用以下三元組組成:
(D , S , P)
其中 D 是資料物件,S 是 D 上的關係集,P 是對 D 的基本操作。
本書採用以下格式對應抽象資料型別:
ADT <抽象資料型別名>{
資料物件: <資料物件的定義>
資料關係: <資料關係的定義>
基本操作: <基本操作的定義>
} ADT <抽象資料型別名>
-
其中資料物件和資料關係的定義用偽碼描述。
-
基本操作的定義是:
<基本操作名>(<參數列>)
初始條件: <初始條件描述>
操作結果: <操作結果描述>
- 初始條件:描述操作執行之前資料結構和引數應滿足的條件;若不滿足,則操作失敗,返回相應的出錯資訊。
- 操作結果:描述操作正常完成之後,資料結構的變化狀況和 應返回的結果。