關於資料結構的泛談

2022-03-10 21:52:46 字數 3716 閱讀 3532

ps:提到郝斌老師只是對無私的前輩心懷感激,並非廣告

1.資料結構

狹義:資料結構是專門研究資料儲存問題的

資料的儲存包含兩個方面:個體的儲存 + 個體關係的儲存

從某個角度而言,資料儲存最核心的問題是對個體關係的儲存,個體的儲存可以忽略不計

廣義:資料結構既包含資料的儲存也包含對資料的操作

對儲存的資料的操作就是演算法

2.演算法

狹義:演算法和資料的儲存方式密切相關

廣義:演算法和資料的儲存結構無關

(也就是泛型的思想:對於同一種邏輯結構,無論該邏輯結構的物理儲存是什麼樣子的,我們都可以對它執行相同的操作)

3.資料結構的分類

邏輯結構

線性陣列

鍊錶棧和佇列是特殊的線性結構(操作受限)

非線性樹

圖物理結構

線性一維的連續單元(記憶體)

4.資料的儲存結構

線性連續儲存(陣列)

優點訪問速度很快

缺點插入、刪除操作效率很低

事先必須知道陣列的長度

需要大塊連續的記憶體塊

離散儲存(鍊錶)

優點空間沒有限制(不需要一塊連續的記憶體)

插入、刪除操作效率很高

缺點訪問速度很慢

線性結構的應用1  棧

定義一種可以實現「先進後出」的儲存結構

分類靜態棧

動態棧演算法

出棧壓棧

應用函式呼叫(函式的巢狀)

中斷表示式求值

記憶體分配

緩衝處理

迷宮線性結構的應用2  佇列

定義一種可以實現「先進先出」的儲存結構

分類鏈式佇列——用鍊錶實現

靜態佇列——用陣列實現,靜態佇列通常都是迴圈佇列

演算法入隊

出隊具體應用

所有和時間有關的操作都有佇列的影子

【專題】遞迴

定義乙個函式自己直接或間接呼叫自己

棧與遞迴的實現

1.當在乙個函式執行期間,呼叫另乙個函式時,在執行被調函式之前,系統需要完成3件事:

將所有實參、返回位址等資訊傳給被調函式儲存

給被調函式的區域性變數(包括形參)分配儲存區域

將控制轉移到被調函式的入口

2.從被調函式返**用函式之前,系統也需要完成3件工作:

儲存被調函式的返回結果

釋放被調函式所佔的儲存空間

依照被調函式儲存的返回值位址,將控制轉移給呼叫函式

ps:當多個函式迭代呼叫時,按照「後呼叫先返回」

(後進先出)的規則進行,上述函式之間的傳遞和控制轉移必須借助棧來實現,所以,系統將整個程式執行所需的儲存區域安排在乙個棧中,每當呼叫乙個函式時,就為它在棧頂分配乙個儲存區域,每當從乙個函式退出時,就釋放它的儲存區域,則當前執行的函式的資料區域必須在棧頂。

3.遞迴需要滿足的3個條件

1)遞迴必須要有乙個明確的終止條件

2)該函式所處理的資料規模必須在遞減

3)這個轉化必須是可解的

4.迴圈和遞迴的關係

所有的迴圈都可以轉化成遞迴,但用遞迴可以解決的問題不一定能用迴圈解決

遞迴易於理解

速度慢所需儲存空間大

迴圈不易理解

速度快所需儲存空間小

例子求階乘

求1+ 2 + 3 + 4 +…… + 100的和

漢諾塔問題

走迷宮應用

樹和森林就是以遞迴方式定義的

樹和圖的很多演算法都是用遞迴來實現的

很多數學公式就是以遞迴的方式定義的(如斐波那契數列)

非線性樹

定義專業定義(遞迴定義)

有且只有乙個稱為根的節點

有若干個互不相交的子樹,這些子樹本身也是一棵樹

通俗定義

樹由節點和邊組成

每個節點只有乙個父節點,但可以有多個子節點

但有乙個節點例外,該節點沒有父節點,該節點稱為根節點

專業術語

深度從根節點到最底層節點的層數稱為深度(根節點是第一層)

度某一節點的度是該節點下子節點的個數

分類一般樹

任意乙個節點的子節點的個數都不受限制

二叉樹任意乙個節點的子節點的個數最多兩個,且子節點的位置不可更改

分類一般二叉樹

滿二叉樹

在不增加樹的層數的前提下,無法再新增乙個節點的二叉樹

完全二叉樹

如果只刪除了滿二叉樹最底層最右邊的連續若干個節點,這樣形成的二叉樹就是完全二叉樹

森林n個互不相交的樹的集合

儲存二叉樹的儲存

連續儲存(完全二叉樹,把一般二叉樹補成完全二叉樹)

優點查詢某個節點的父節點和子節點(判斷有沒有父、子節點)速度很快

缺點耗用記憶體空間過大

鏈式儲存

一般樹的儲存

雙親表示法(陣列)

孩子表示法(邊鍊錶)

雙親孩子表示法(陣列加邊鍊錶)

二叉樹表示法(把一般樹轉換成二叉樹來儲存)

森林的儲存

先把森林轉換為二叉樹,再儲存二叉樹

操作遍歷(遍歷實質上是把非線性結構轉化為線性結構的一種方式,以下三種遍歷是三種不同的轉化方式,並沒有本質區別)

先序遍歷(根、左、右)

中序遍歷(左、根、右)

後序遍歷(左、右、根)

已知兩種遍歷序列,求原始二叉樹(已知任意一種序列不能推出原始二叉樹,已知先中或者中後可以推出,已知先後不行)

應用樹是資料庫中資料組織的一種重要形式

作業系統子、父程序的關係本身就是一棵樹

物件導向語言中類的繼承關係本身就是一棵樹

赫(哈)夫曼樹

圖(略)

5.排序

排序氣泡排序(相鄰位置比較交換,每趟找出乙個)

插入排序(2和1比插入形成長度為2的序列a,3和a比插入形成長度為3的序列b,直至結束)

選擇排序(找出最大(小)的,與第乙個位置的元素互換,在找出剩餘元素中最大(小)的,與第二個位置的元素互換,直至結束)

快速排序(先找出某一元素(一般取第乙個元素)的最終位置,這時無序數列被分為兩塊,再分別對兩塊繼續這樣進行排序(遞迴),直至分成的兩塊長度為1)

示例:9,0,8,10,-5,2,13,7(需要兩個指標l、h和乙個中間變數temp = 9(第乙個元素),假定l指向9,h指向7,先比較h所指向值與temp,h值大則向前移動h,直至h值小於temp時賦值:l值 = h值,h值視為垃圾數字,用「 * 」表示,若h值始終大於temp,則當l與h指向同一元素時一趟排序停止)

第二步:7,0,8,*,-5,2,13,10(0 < temp ,移動l,8 < temp ,移動l,10 > temp,賦值:h值 = l值,下一步移動h)

第四步:7,0,8,2,-5,9,13,10(-5 < temp,移動l,l與h重合,得到temp 的最終位置,賦值:l值(h值) = temp,一趟排序結束)

ps:上述結果是一趟排序的結果(一趟結束條件:l與h重合),下一趟對7,0,8,2,-5用同樣的方法排序(遞迴),下下一趟對13,10排序,直至所有待排序的無序列長度為1時,排序完成。

歸併排序(2個2個比,4個4個比,8個8個比,直至結束)

排序和查詢的關係

排序是查詢的前提(也就是說排序是重點)

關於資料結構

定義,性點 二叉樹是一種樹形結構,其特點是每個結點至多只有兩顆子樹,並且二叉樹的子樹有左右之分。非空二叉樹葉子結點數等於度為2的結點的個數加1,即n0 n2 1 非空二叉樹上第k層上至多有2 k 1 個結點。高度為h的二叉樹至多有2 h 1個結點 樹的最大度為2 樹的高度 從所有葉節點開始數高度到根...

關於HashMap的資料結構

一hashmap的資料結構 jdk1.8以前是陣列 鍊錶 jdk1.8以後是陣列 鍊錶 紅黑色 二資料結構的物理結構 是指資料的邏輯結構在計算機中的儲存形式 資料元素的儲存結構形式有如下兩種 兩種結構,各有優點和缺點,可以相互結合的運用 hashmap正好兩種資料結構都用到了 三陣列 hashmap...

關於資料結構 一

資料儲存 的目的是便於資料訪問,這個關係就是資料結構 演算法 是計算機解題的模型 輸入,輸出,順序執行,跳轉,迴圈,分支,有限步驟 人大腦組織資料的方式有線,樹,圖三種邏輯結構,而計算機儲存採用順序,鏈式和兩者混合的方式。前者是概念性的東西,後者是物理實現。線形結構 演算法是迭代演算法,你只要注意規...