基本概念
程序 = 數據結構 + 算法
數據 是對客觀事物的符號表示,在計算機科學中是指所有能輸入到計算機中並被計算機程序處理的符號的總稱。
數據元素 是數據的基本單位,在計算機程序中通常作爲一個整體進行考慮和處理。有時,一個數據元素可由若干個數據項組成。數據項是數據的不可分割的最小單位。
數據對象 是性質相同的數據元素的集合,是數據的一個子集。
數據類型 是一個值的集合和定義在此集合上的一組操作的總稱。
- 原子類型。其值不可再分的數據類型。
- 結構類型。其值可以再分解爲若干分量的數據類型。如:C語言中的結構體
抽象數據類型(ADT)是抽象數據組織及與之相關的操作。
數據結構是相互之間存在一種或多種特定關係的數據元素的集合。
數據結構三要素:
- 邏輯結構:數據元素間的邏輯關係是什麼
- 物理結構(存儲結構):如何用計算機表示數據元素的邏輯關係
- 數據的運算:施加在數據上的運算包括運算的定義和實現。運算的定義是針對邏輯結構的,指出運算的功能;運算的實現是針對存儲結構的,指出運算的具體操作步驟。
邏輯結構
集合
線性結構
:數據元素之間是一對一的關係。樹形結構
:數據元素之間是一對多的關係。圖狀結構(網狀結構)
:數據元素之間是多對多的關係。
物理結構或存儲結構
數據結構在計算機中的表示(又稱映像)稱爲數據的物理結構。
順序存儲
:邏輯上相鄰的元素在物理位置上也相鄰的存儲單元中,元素之間的關係由存儲單元的鄰接關係來體現。鏈式存儲
:邏輯上相鄰的元素在物理位置上可以不相鄰,藉助指示元素存儲地址的指針來表示元素之間的邏輯關係。索引存儲
:存儲元素信息的同時,還建立附加的索引表。散列存儲
:根據元素的關鍵字直接計算出該元素的存儲地址,又稱哈希(Hash)存儲
。
算法是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示一個或多個操作。算法特性:
- 有窮性
- 確定性
- 可行性
- 輸入
- 輸出
線性表
- 線性表的
順序表示
指的是用一組地址連續的存儲單元依次存儲線性表的數據元素。 - 線性表的
鏈式存儲結構
的特點是用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是連續的,也可以是不連續的)。結點(node)。
鏈式存儲結構
單鏈表
鏈表的每個結點中只包含一個指針域,故又稱線性鏈表或單鏈表。循環鏈表
雙向鏈表
結點中有兩個指針域,其一指向直接後繼,另一指向直接前趨。
棧和隊列
棧實現的是一種後進先出
(last-in,first-out,LIFO)策略。
棧上的 INSERT 操作稱爲壓入(PUSH),而無元素參數的 DELETE 操作稱爲彈出(POP)。
隊列實現的是一種先進先出
(first-in,first-out,FIFO)策略。
數組和廣義表
數組是在內存中存儲相同數據類型的連續的內存空間。
樹
樹作爲一種樹狀的數據結構,其數據節點之間的關係也如大樹一樣,將有限個節點根據不同層次關係進行排列,從而形成數據與數據之間的父子關係。常見的數的表示形式更接近“倒掛的樹”,因爲它將根朝上,葉朝下。
基本術語
- 祖先結點:從根到該結點的所經分支上的所有結點。
- 子孫結點
- 雙親結點:B 結點是 A 結點的孩子,則 A 結點是 B 結點的雙親。
- 孩子結點
- 兄弟結點:同一雙親的孩子結點。
- 結點的度:結點子樹的個數。
- 樹的度: 樹中最大的結點度。
- 分支結點:度不爲 0 的結點。
- 葉子結點:度爲 0 的結點。
- 結點層:根結點的層定義爲1(或0);根的孩子爲第二層結點,依此類推。
- 結點高度:從葉節點由下到上數。
- 結點深度:從根結點由上到下數。
- 樹的高度(深度):樹中結點的層數。
- 有序樹:子樹有序的樹,如:家族樹。
- 無序樹:不考慮子樹的順序。
- 路徑:兩個結點之間所經過的結點序列。
- 路徑長度:所經歷邊的個數。
- 森林:n 棵互不相交的樹的集合。
樹的性質
- 樹中的結點數等於所有結點的度數加 1。
二叉樹
樹可以衍生出許多的結構,若將指針域設置爲雙指針,那麼即可形成最常見的二叉樹,即每個結點最多有兩個子樹的樹結構。二叉樹根據結點的排列和數量還可進一度劃分爲完全二叉樹、滿二叉樹、平衡二叉樹、紅黑樹等。
將二叉樹從上到下,從左到右依次編號。對於編號爲 i 的結點,其雙親的編號爲 i/2,左孩子爲 2i,右孩子爲 2i + 1。
二叉樹由3個基本單元組成:根節點、左子樹、右子樹。
遍歷二叉樹
若限定先左後右,則有 3 種情況,先序遍歷、中序遍歷、後序遍歷。
先序遍歷
:根左右
中序遍歷
:左根右
後序遍歷
:左右根
- 滿二叉樹:除了最後一層,其它層的結點都有兩個子結點。
- 完全二叉樹:除了最後一層結點,其它層的結點數都達到了最大值;同時最後一層的結點都是按照從左到右依次排布。
二叉排序樹
:又稱二叉查找樹或二叉搜索樹。若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值。平衡二叉樹
:又稱AVL樹。任意結點的左子樹和右子樹的深度差不超過 1。紅黑樹
- B樹
- B+樹
紅黑樹具有五個特性:
- 每個結點要麼是紅的要麼是黑的。
- 根結點是黑的。
- 每個葉結點(葉結點即指樹尾端NIL指針或NULL結點)都是黑的。
- 如果一個結點是紅的,那麼它的兩個兒子都是黑的。
- 對於任意結點而言,其到葉結點樹尾端NIL指針的每條路徑都包含相同數目的黑結點。
散列表
散列表也叫哈希表,是一種通過鍵值對直接訪問數據的結構。
圖
圖結構一般包括頂點和邊,頂點通常用圓圈來表示,邊就是這些圓圈之間的連線。邊還可以根據頂點之間的關係設置不同的權重,默認權重相同皆爲1。此外根據邊的方向性,還可將圖分爲有向圖和無向圖。
字符串
計算機上的非數值處理的對象基本上是字符串數據。