1. 程式人生 > >讀書筆記_資料結構-使用C++語言描述(第2版)

讀書筆記_資料結構-使用C++語言描述(第2版)

第一章    基礎知識

資料:計算機加工處理的物件,分為數值資料和非數值資料。

資料結構的設計過程分為抽象層(資料的邏輯結構及運算)、資料結構層、實現層。

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

儲存表示方法:順序和連結(以及索引和雜湊)。

資料結構常見運算:建立、清除、插入、刪除、搜尋、更新、訪問、遍歷。

建立後結構是否變化分為:靜態資料結構和動態資料結構。

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

第二章    線性表

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

第三章    堆疊和佇列

堆疊

佇列

中綴表示式轉化為字尾表示式(匹配括號)

字尾表示式的計算(遇到操作符彈出兩個數)

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

第四章    數字和字串

特殊矩陣:對稱矩陣(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  折半插入排序:由於前半部分為已排好序的數列,這樣我們不用按順序依次尋找插入點,可以採用折半查詢的方法來加快尋找插入點的速度。只是減少了比較次數而已。元素移動次數不變。

第十一章 外排序

檔案組織方式:順序檔案、雜湊檔案、索引檔案、倒排檔案。