讀書筆記_數據結構-使用C++語言描述(第二版)

 

第一章    基礎知識

數據:計算機加工處理的對象,分爲數值數據和非數值數據。

數據結構的設計過程分爲抽象層(數據的邏輯結構及運算)、數據結構層、實現層。

數據的邏輯結構:集合結構、線性結構、樹形結構、圖狀結構。(線性和非線性)

存儲表示方法:順序和鏈接(以及索引和散列)。

數據結構常見運算:創建、清除、插入、刪除、搜索、更新、訪問、遍歷。

創建後結構是否變化分爲:靜態數據結構和動態數據結構。

抽象:實質是抽取共同和本質的內容。

第二章    線性表

線性表是一種動態數據結構,它的表長可以變化。

第三章    堆棧和隊列

堆棧

隊列

中綴表達式轉化爲後綴表達式(匹配括號)

後綴表達式的計算(遇到操作符彈出兩個數)

遞歸算法的有點:程序非常簡潔和清晰,且易於分析;缺點:費時間、費空間。

第四章    數字和字符串

特殊矩陣:對稱矩陣(aij=aji),帶狀矩陣,稀疏矩陣(順序表示和轉置)。

字符串:簡單模式匹配算法,模式匹配的KMP算法。

第五章    樹

樹的定義和樹的遞歸定義。

結點,邊,路徑,雙親,孩子,兄弟,後裔,祖先,度,葉子,分支結點,樹的度,層次,樹的高度,無序樹,有序樹,森林,果園或稱有序森林,不能爲空樹,可以爲空森林。

二叉樹(可爲空)分左子樹和右子樹,有五種基本形態。

滿二叉樹:高度爲h的二叉樹恰好有2h-1個結點。

完全二叉樹:一棵二叉樹中,只有最下面兩層結點的度可以小於2,並且最下一層的葉結點集中在靠左的若干位置上。(n個結點則高度爲不大於log2(n+1)的最大整數)

擴充二叉樹:也稱2-樹,除了葉結點外,其餘結點都必須有兩個孩子。

二叉樹的存儲表示:順序表示(不適合),鏈接表示。

應當避免共享結點。

森林和二叉樹的轉換(遞歸定義)。兄弟變父子。父子變兄弟。

樹是非線性數據結構,一般採用鏈接方式存儲,如果樹結構的大小和形狀改變不大時也可以採取順序方式存儲。鏈接方式:多重鏈表表示法,孩子兄弟表示法,雙親表示法,三重鏈表表示法,帶右鏈的先序表示法。

樹和森林的遍歷:深度優先遍歷(先序、中序、後序)和寬度優先遍歷(按層次)。

大小爲n的堆:一棵包含n個結點的完全二叉樹,該樹中的每個結點的關鍵字值大於等於其雙親的關鍵字,爲最小堆。反之爲最大堆。

堆的向上調整和向下調整是優先權隊列的基礎。

哈夫曼編碼是不等長編碼。

從根到樹中任意結點的路徑長度,是指從根結點到該結點的路徑上所包括的邊的數目。樹的內路徑長度(除去葉子結點路徑長度和)和樹的外路徑長度(到葉子結點的路徑長度和)。

設I和E分別是一棵擴充二叉樹的內路徑長度和外路徑長度,n是樹中非葉結點的數目,則E=I+2n。

樹的加權路徑長度爲樹中所有葉子結點的加權路徑長度之和。WPL=wklk的1到m的求和。

哈夫曼算法:構造具有最小加權路徑長度的擴充二叉樹的算法。對應的則爲哈夫曼(編碼)樹。

第六章    集合和搜索

主關鍵字,次關鍵字。內搜索,搜索成功,搜索失敗。內搜索,外搜索。靜態搜索,動態搜索。符號表算法。基於關鍵字比較的搜索(線性表和搜索樹),基於計算地址的搜索(跳錶和散列表)。

無序表的順序搜索。有序表的順序搜索。

平均搜索長度。

二分搜索算法(對半搜索只適用於有序表且是順序存儲)。

第七章    搜索樹

二叉搜索樹也稱二叉排序樹(中序遍歷),是一種最容易實現的搜索樹。若左子樹不空,左子樹關鍵字值小於根結點關鍵字值。若右子樹不空,右子樹上鄋關鍵字值大於根,左右子樹都是二叉搜索樹。

二叉搜索樹的搜索:將x與根結點比較,若x小於該結點的值,則用相同的方法搜索左子樹,大於則搜索右子樹,相等則搜索成功。

二叉搜索樹的插入:搜索後插入(可能重複)。

二叉搜索樹的刪除:搜索中序遍歷下的直接後繼,替代,再刪除。

二叉搜索樹操作的平均時間爲O(log2n)。

二叉平衡樹(AVL樹):特殊的二叉搜索樹,有效控制樹的高度,避免產生普通二叉搜索樹的“退化”樹形。左右子樹的高度差絕對值不超過1,左右子樹都爲二叉平衡樹。平衡因子爲左子樹高度減去右子樹高度,其值只能爲-1,、0、1。

二叉平衡樹的平衡旋轉(LL、RR、LR)、插入、刪除、高度。

二叉平衡樹的搜索最壞情況時間複雜度是O(log2n)。

B-樹(外搜索樹):多叉平衡樹。

第八章 跳錶和散列表

字典是記錄的集合。表示字典:線性表、搜索樹、跳錶、散列表。

跳錶在實現的難度和性能之間做了很好的折中。

跳錶是一個有序鏈表,每個結點包含可變數目的鏈(指針),結點中的第i層鏈,跳過那些只包含低於第i層鏈的結點,構成一個單鏈表。一個有n個元祖的跳錶,在理想情況下的鏈級數爲ceiling(log2n),即跳錶的最大層次爲ceiling(log2n)-1。

隨機跳錶。

跳錶的搜索、插入、刪除。

散列表:元素在存儲結構中的位置與元素的關鍵字值之間存在直接的確定關係。

散列技術中的衝突:是指對於關鍵字集合中的兩個關鍵字值Ki和Kj,當Ki不等於Kj時,有h(Ki)=h(Kj),h是散列函數。

散列函數應該:能快速計算,具有均勻性。

目前比較通用的散列函數:

除留餘數法,h(key) = key mod M;M是散列表的大小,M的選擇十分重要。

平方取中法,h(key) = floor(M/W(key2 mod W));W是計算機字長,M是散列表長,key是無符號整數。

摺疊法,

數字分析法,。

解決衝突也稱爲“溢出”處理技術:拉鍊的方法(開散列法)和開地址法(閉散列法)。

開地址法:線性探查法,僞隨機探查法,二次探查法,雙散列法。

 

第九章 圖

圖,頂點,有向圖,無向圖,自回圖,多重圖,完全圖。

無向完全圖有n(n-1)/2條邊,有向完全圖有n(n-1)條邊。

路徑,路徑的長度,子圖,簡單路徑,迴路。

連通圖,強連通圖,帶權的圖稱爲網。

連通分量:無向圖的一個極大連通子圖。

圖運算:深度優先遍歷圖,寬度優先遍歷圖,拓撲排序,關鍵路徑,普里姆算法求最小代價生成樹,克魯斯卡爾算法求最小代價生成樹,迪杰特斯拉算法求單元最短路徑,弗洛伊德算法求所有頂點之間的最短路徑。

圖的存儲結構:矩陣表示法:鄰接矩陣,關聯矩陣;鄰接表表示法;

圖的遍歷(可能到不了和存在迴路問題):深度優先遍歷(鄰接矩陣表示圖則時間複雜度爲O(n2)),寬度優先遍歷(鄰接矩陣表示圖則時間複雜度爲O(n2))。

拓撲排序是求解網絡問題的主要算法之一。管理技術,如計劃評審技術和關鍵路徑法都用到了這一算法。

AOV網絡(頂點活動網絡):一個有向圖G,若各頂點代表活動,各條邊表示活動之間的領先關係。(擬序關係,傳遞性和反自反性)(一般是一個有向無環圖)

AOE網絡(頂點事件網絡):與AOV對應的活動網絡。

生成樹:一個無向連通圖的生成樹是一個極小連通圖,它包括圖中全部頂點,並且有儘可能少的邊。

最小代價生成樹:一個網絡的各生成樹中,具有最小代價的生成樹。

普里姆算法(Prim):選n-1條邊,選邊準則:尋找一條代價最小的邊(u’,v’),是所有一個端點u在構造中的生成樹上,而另一個端點不在該樹上的邊(u,v)中代價是最小的。O(n2)。

克魯斯卡爾算法(Kruskal):選邊原則:每次選擇一條代價最小的邊,如果不形成迴路就加入集合,直到有了n-1條邊。e條邊,O(elog2e)。

單元最短路徑問題:迪杰特斯拉算法(Dijkstra):首先求得長度最短的一條最短路徑,再求得長度次短的的一條最短路徑,以此類推,直到從源頭到其他所有頂點之間的最短路徑都已經求得爲止。O(n3)。

所有頂點之間的最短路徑問題:弗洛伊德算法(Floyd):集合S每次加入一個頂點,保存各條最短路徑的長度,從i到j中間只經過S中的點,可以認爲是“當前最短路徑”。O(n3)。

第十章 內排序

穩定排序算法:相等元素排序後的先後順序不變。反之爲不穩定排序。

時間複雜度:元素比較次數和移動次數衡量,一般按平均情況估算,也常估算最好和最壞。

整個排序過程可以在內存中進行,則稱之爲內部排序。如果不能全部放入內存而需要訪問外存則爲外部排序。

l  簡單選擇排序:每次找出最小與未排好的最前一個元素交換。最好最壞和平均:O(n2)。不穩定。

l  直接插入排序:每次插入一個元素使之有序。最好O(n),最壞O(n2),平均O(n2)。穩定。

l  冒泡排序:每趟交換,最大元素沉底。最好O(n),最壞O(n2),平均O(n2)。穩定。

l  快速排序:給定元素分割爲左右,分到只有一個元素。最好O(nlog2n),最壞O(n2),平均O(nlog2n)。存儲空間O(n)。不穩定。

l  兩路合併排序(歸併排序):兩兩合併。最好最壞平均O(nlog2n)。存儲空間O(n)。穩定。

l  堆排序:構造堆,調整。最好最壞平均O(nlog2n)。不穩定。

l  基數排序:位數從低到高進行排序。最好最壞平均O(d*(radix+n))。存儲空間O(radix*d+n)。穩定。

l  希爾排序(插入排序一種,縮小增量排序):按步長間隔分組進行直接插入排序。最好O(n),最壞O(n2),平均O(n1.3)。不穩定。

l  計數排序:非比較排序(比較排序時間下限是O(nlog2n)),被排序的數組爲A,排序後存儲到B,C爲臨時數組,C[A[i]]表示小於等於a[i]的元素個數,正好是A[i]排序後應該在的位置。最好最壞平均O(n+k),k爲最大的數加一,穩定。

l  桶排序(箱排序,非比較排序):將n個數放入m個桶裏面,每個桶裏面再用其他排序算法。要求數據的長度必須完全一樣,要被排序的數組內的數值是均勻分配的。O(n),穩定,耗空間。

l  雙向冒泡排序(雞尾酒排序):先讓冒泡排序由左向右進行,再讓冒泡排序由右往左進行,如此往復,使用left與right兩個旗標來記錄左右兩端已排序的元素位置。最好O(n),最壞O(n2),平均O(n2)。穩定。

l  折半插入排序:由於前半部分爲已排好序的數列,這樣我們不用按順序依次尋找插入點,可以採用折半查找的方法來加快尋找插入點的速度。只是減少了比較次數而已。元素移動次數不變。

第十一章 外排序

文件組織方式:順序文件、散列文件、索引文件、倒排文件。

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