武漢理工大學-數據結構-2019年期末複習提綱

數據結構2019年期末複習提綱

製作:紀元 - 楊怡雯- 劉一秀

本提綱遵循CC-BY-NC-SA協議

(署名-非商業性-相同方式共享)

文章目錄

緒論

什麼是算法

P20、21

算法(Algorithm):是對特定問題求解方法(步驟)的一種描述,是指令的有限序列,其中每一條指令表示一個或多個操作。不是所有的計算機程序都是算法
算法的五個特性
① 有窮性: 一個算法必須總是在執行有窮步之後結束,且每一步都在有窮時間內完成。
② 確定性:算法中每一條指令必須有確切的含義。不存在二義性。且算法只有一個入口和一個出口。
③ 可行性: 一個算法是能行的。即算法描述的操作都可以通過已經實現的基本運算執行有限次來實現。
④ 輸入: 一個算法有零個或多個輸入,這些輸入取自於某個特定的對象集合。
⑤ 輸出: 一個算法有一個或多個輸出,這些輸出是同輸入有着某些特定關係的量。

怎麼去評價一個算法

好算法標準

PPT22

① 正確性(Correctness ): 算法應滿足具體問題的需求。
② 可讀性(Readability): 算法應容易供人閱讀和交流。可讀性好的算法有助於對算法的理解和修改。
③ 健壯性(Robustness): 算法應具有容錯處理。當輸入非法或錯誤數據時,算法應能適當地作出反應
或進行處理,而不會產生莫名其妙的輸出結果。
④ 通用性(Generality): 算法應具有一般性 ,即算法的處理結果對於一般的數據集合都成立。
⑤ 效率與存儲量需求: 效率指的是算法執行的時間;存儲量需求指算法執行過程中所需要的最大存儲空間。一般地,這兩者與問題的規模有關。

算法分析

時間複雜度

PPT25

定義

算法中基本操作重複執行的次數是問題規模n的某個函數,其時間量度記作 T(n)=O(f(n)),稱作算法的漸近時間複雜度(Asymptotic Time complexity),簡稱時間複雜度。一般地,常用最深層循環內的語句中的原操作的執行頻度(重複執行的次數)來表示。

表示階
  • O(1) :常量時間階
  • O (n):線性時間階
  • O(logn) :對數時間階
  • O(nlogn) :線性對數時間階
  • O (nk): k≥2 ,k次方時間階
階間大小關係

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)
其中指數時間的關係爲:O(2n)<O(n!)<O(nn)

空間複雜度

PPT32

定義

指算法編寫成程序後,在計算機中運行時所需存儲空間大小的度量,記作: S(n)=O(f(n))
其中: n爲問題的規模(或大小)一般地,算法的空間複雜度指的是輔助空間。

包含方面
  • 指令常數變量所佔用的存儲空間;
  • 輸入數據所佔用的存儲空間;
  • 輔助(存儲)空間。

什麼是數據結構

PPT9、10

數據結構(Data Structure):是指相互之間具有(存在)一定聯繫(關係)的數據元素的集合。元素之間的相互聯繫(關係)稱爲邏輯結構。

形式定義:數據結構是一個二元組:Data-Structure=(D,S)
其中:D是數據元素的有限集,S是D上關係的有限集。

數據結構有哪些類型

PPT9

① 集合:結構中的數據元素除了“同屬於一個集合”外,沒有其它關係。
② 線性結構:結構中的數據元素之間存在一對一的關係。
③ 樹型結構:結構中的數據元素之間存在一對多的關係。
④ 圖狀結構或網狀結構:結構中的數據元素之間存在多對多的關係。

基本概念、術語

PPT8

數據(Data) :是客觀事物的符號表示。在計算機科學中指的是所有能輸入到計算機中並被計算機程序處理的符號的總稱。
數據元素(Data Element) :是數據的基本單位,在程序中通常作爲一個整體來進行考慮和處理。
數據項(Data Item):是數據的不可分割的最小單位。一個數據元素可由若干個數據項組成。數據項是對客觀事物某一方面特性的數據描述。
數據對象(Data Object):是性質相同的數據元素的集合,是數據的一個子集。如字符集合C={‘A’,’B’,’C,…} 。
數據類型(Data Type):指的是一個值的集合定義在該值集上的一組操作的總稱。

邏輯結構

PPT11

邏輯結構:自然或人爲定義的 “關係”稱爲數據元素之間的邏輯關係,相應的結構稱爲邏輯結構。算法的設計取決於所選定的邏輯結構

存取結構

隨機存取:就是直接存取,與存儲位置無關,是可以通過下標直接訪問的數據結構。(取數據時無需訪問之前的數據,直接對第N個數據進行操作即可)
eg:數組

順序存取:就是非隨機存取,與存儲位置有關,不能通過下標訪問,只能按照存儲順序存取。(取第N個數據時必須訪問前N-1個數據)
eg:鏈表

存儲結構

PPT12、14

存儲結構:數據元素在計算機中的存儲及其邏輯關係的表現稱爲數據的存儲結構或物理結構。而算法的實現依賴於所採用的存儲結構

順序存儲結構:用數據元素在存儲器中的相對位置來表示數據元素之間的邏輯結構(關係)。數據元素存放的地址是連續的,在C語言中,用一維數組表示。

鏈式存儲結構:在每一個數據元素中增加一個存放另一個元素地址的指針(pointer),用該指針來表示數據元素之間的邏輯結構(關係)。數據元素存放的地址是否連續沒有要求。在C語言中,用結構體類型表示。

順序存儲結構 鏈式存儲結構
定義 用數據元素在存儲器中的相對位置來表示數據元素之間的邏輯結構(關係) 在每一個數據元素中增加一個存放另一個元素地址的指針(pointer),用該指針來表示數據元素之間的邏輯結構(關係)
存放地址連續性 數據元素存放的地址是連續的 數據元素存放的地址是否連續沒有要求
在C語言中表示方法 一維數組 結構體類型
優點 可以直接計算節點存儲地址,無需一個個查找 ①存儲密度小,相同空間能存更多數據。②邏輯上相鄰的節點在物理上不一定相鄰。③插入刪除相比更靈活
缺點 插入、刪除慢 查找慢(需要一個個找)
數據邏輯結構層次關係圖
數據邏輯結構
線性結構
一般線性表
受限線性表
棧和隊列
線性表推廣
數組
廣義表
非線性結構
集合
樹形結構
一般樹
二叉樹
圖狀結構
有向圖
無向圖

線性表

定義

PPT36

線性表(Linear List) :是由n(n≧0)個數據元素(結點)a1,a2, …an組成的有限序列。該序列中的所有結點具有相同的數據類型。其中數據元素的個數n稱爲線性表的長度。

基本術語

PPT36、37

  • 空表、非空表
    • 首節點(a1)、尾結點(an)
    • 前驅(a1 ~ ai-1)、直接前驅(ai-1)
    • 後繼(ai+1 ~ an)、直接後繼(ai+1)
  • 有序線性表:線性表中的結點是按值(或按關鍵字值)由小到大(或由大到小)排列的
  • 關鍵字:元素的可以唯一標識每個結點的數據項組

特點

PPT39

線性表是一種相當靈活的數據結構,其長度可根據需要增長或縮短。 對線性表的數據元素可以訪問、插入和刪除。

線性表的存儲

順序存儲

PPT41、42

定義

順序存儲 :把線性表的結點按邏輯順序依次存放在一組地址連續的存儲單元裏。
用這種方法存儲的線性表簡稱順序表

特點

  • 線性表的邏輯順序與物理順序一致;
  • 數據元素之間的關係是以元素在計算機內“物理位置相鄰”來體現。

計算

線性表中第i+1個數據元素的存儲位置LOC(ai+1)和第i個數據元素的存儲位置LOC(ai)之間滿足下列關係:LOC(ai+1)=LOC(ai)+l
線性表的第i個數據元素
ai
的存儲位置爲:*LOC(ai)=LOC(a1)+(i-1)l

基本操作

PPT44-53

插入

時間複雜度O(n)

實現步驟

(1) 將線性表L中的第i個至第n個結點後移一個位置。
(2) 將結點e插入到結點ai-1之後。
(3) 線性表長度加1。

刪除

時間複雜度Q(n)

實現步驟

(1) 將線性表L中的第i+1個至第n個結點依此向前移動一個位置。
(2) 線性表長度減1。

定位刪除

時間複雜度O(n)

實現步驟

(1) 在線性表L查找值爲x的第一個數據元素。
(2) 將從找到的位置至最後一個結點依次向前移動一個位置。
(3) 線性表長度減1。

C語言下定義

PPT43

#define OK 1
#define ERROR -1
#define MAX_SIZE 100
typedef int Status ;
typedef int ElemType ; 
typedef struct sqlist
{ ElemType Elem_array[MAX_SIZE] ;
	int length ;
} SqList ;

抽象數據類型定義

PPT40

ADT List{
	數據對象:D = { ai | ai∈ElemSet, i=1,2,…,n, n≧0 }
	數據關係:R = {<ai-1, ai> | ai-1, ai∈D, i=2,3,…,n }
	基本操作:
	InitList( &L )
		操作結果:構造一個空的線性表L;
	ListLength( L )
		初始條件:線性表L已存在;
		操作結果:若L爲空表,則返回TRUE,否則返回FALSE;
	GetElem( L, i, &e )
		初始條件:線性表L已存在,1≦i≦ListLength(L);
		操作結果:用e返回L中第i個數據元素的值;
	ListInsert ( L, i, &e )
		初始條件:線性表L已存在,1≦i≦ListLength(L) ;
		操作結果:在線性表L中的第i個位置插入元素e;
} ADT List

棧和隊列

棧的順序存儲表示

棧的順序存儲結構簡稱爲順序棧,和線性表相類似,用一維數組來存儲棧。根據數組是否可以根據需要增大,又可分爲靜態順序棧動態順序棧

棧的動態順序存儲表示PPT111

棧的靜態順序存儲表示PPT117

棧的鏈式表示

PPT124

棧的鏈式存儲結構稱爲鏈棧,是運算受限的單鏈表。其插入和刪除操作只能在表頭位置上進行。因此,鏈棧沒有必要像單鏈表那樣附加頭結點,棧頂指針top就是鏈表的頭指針。

棧的應用

  • 數制轉換PPT129

  • 括號匹配問題PPT131

  • 棧與遞歸調用的實現PPT135

隊列的基本概念

隊列(Queue):也是運算受限的線性表。是一種先進先出(First In First Out ,簡稱FIFO)的線性表。只允許在表的一端進行插入,而在另一端進行刪除。

隊首(front) :允許進行刪除的一端。

隊尾(rear) :允許進行插入的一端。

隊列的表示與實現

隊列的順序表示和實現PPT141
隊列的鏈式表示和實現PPT151

基本術語

(字符串):是零個或多個字符組成的有限序列。記作: S=“a1a2a3…”,其中S是串名,ai(1≦i≦n)是單個,可以是字母、數字或其它字符。
串值:雙引號括起來的字符序列是串值。
串長:串中所包含的字符個數稱爲該串的長度。
空串(空的字符串):長度爲零的串稱爲空串,它不包含任何字符。
空格串(空白串):構成串的所有字符都是空格的串稱爲空白串。
子串(substring):串中任意個連續字符組成的子序列稱爲該串的子串,包含子串的串相應地稱爲主串。
特別地,空串是任意串的子串,任意串是其自身的子串
子串的序號:將子串在主串中首次出現時的該子串的首字符對應在主串中的序號,稱爲子串在主串中的序號或位置)
串相等:如果兩個串的串值相等(相同),稱這兩個串相等。換言之,只有當兩個串的長度相等,且各個對應位置的字符都相同時才相等。
通常在程序中使用的串可分爲兩種:串變量串常量

串的存儲表示和實現

串在計算機中有3種表示方式:

定長順序存儲表示

PPT168

將串定義成字符數組,利用串名可以直接訪問串值。用這種表示方式,串的存儲空間在編譯時確定,其大小不能改變。

堆分配存儲方式

PPT171

仍然用一組地址連續的存儲單元來依次存儲串中的字符序列,但串的存儲空間是在程序運行時根據串的實際長度動態分配的。

塊鏈存儲方式

PPT174

一種鏈式存儲結構表示。

串的模式匹配算法

模式匹配(模範匹配):子串在主串中的定位稱爲模式匹配或串匹配(字符串匹配) 。模式匹配成功是指在主串S中能夠找到模式串T,否則,稱模式串T在主串S中不存在。

Brute-Force模式匹配算法

PPT178

時間複雜度爲O(n*m) ,其中n 、m分別是主串和模式串的長度。通常情況下,實際運行過程中,該算法的執行時間近似於O(n+m)

KMP算法

PPT182

其改進在於:每當一趟匹配過程出現字符不相等時,主串指示器不用回溯,而是利用已經得到的“部分匹配”結果,將模式串的指示器向右“滑動”儘可能遠的一段距離後,繼續進行比較。

數組

數組這種數據結構可以看成是線性表的推廣。
廣義表是另一種推廣形式的線性表,是一種靈活的數據結構,在許多方面有廣泛的應用

數組特性

  • 數組中的數據元素具有相同數據類型。
  • 數組是一種隨機存取結構,給定一組下標,就可以訪問與其對應的數據元素。
  • 數組中的數據元素個數是固定的

稀疏矩陣的壓縮存儲

PPT215

廣義表

PPT238

基本的數組,特殊的矩陣(稀疏矩陣等)
十字鏈表,廣義表的儲存等基本概念

樹 二叉樹

基本術語

樹型結構是以分支關係定義的層次結構。
結點的度(degree) 、樹的度:結點所擁有的子樹的棵數稱爲結點的度。樹中結點度的最大值稱爲樹的度。
孩子結點(child)或子結點:一個結點的子樹的根。
雙親結點(parent)或父結點:子節點的根。
兄弟結點:同一雙親結點的所有子結點。
堂兄弟結點:雙親結點在同一層上的所有結點。
森林(forest):是m(m≧0)棵互不相交的樹的集合。
對任何一棵二叉樹,若其葉子結點數爲n0,度爲2的結點數爲n2,則n0=n2+1

滿二叉樹,完全二叉樹

二叉樹的存儲結構

  • 順序存儲結構
  • 鏈式存儲結構

遍歷二叉樹(Traversing Binary Tree):是指按指定的規律對二叉樹中的每個結點訪問一次且僅訪問一次。

先序、中序、後序遍歷二叉樹

PPT276

(遞歸算法、非遞歸算法)非遞歸算法需要藉助棧

層次遍歷二叉樹

PPT291

二叉樹遍歷算法的應用

PPT293

線索樹

PPT305

樹與森林

PPT323

最優二叉樹

PPT346

基本術語

表結點:鏈表中的結點
鄰接點域(adjvex) :每個結點的三個域組成其鄰接點域,指示與頂點V i 鄰接的頂點在圖中的位置( 頂點編號)
**鏈域(nextarc)**指向下一個與頂點V i 鄰接的表結點
數據域(info) 存儲和邊或弧相關的信息,如權值等。對於無權圖,如果沒有與邊相關的其他信息,可省略此域

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8QqLzzVL-1578456398730)(C:\Users\紀元\AppData\Roaming\Typora\typora-user-images\image-20200108102543044.png)]

表結點存儲結構

adjvex info nextare

頂點節點存儲結構

data firstare

常見存儲結構

(PPT385)

鄰接矩陣:(二維數組):A[i][j]存放的數據爲頂點i到頂點j的關係信息
無權:連接爲1,不連接爲0
有權:連接爲A [ i ] [ j ]=權重,不連接爲無窮

無向圖:

  • 鄰接矩陣是對稱方陣 ;
  • 對於頂點v i ,其度數是第i 行的非0 元素的個數;
  • 無向圖的邊數 上(或下)三角矩陣中非0元素個數

有向圖:

  • 對於頂點vi,第i行的非0元素的個數是其 出度OD(vi);第i 列的非0 元素的個數是其入度ID(v i )
  • 非0元素個數爲其弧數

鄰接表

  • 稀疏時,比矩陣節省空間

  • 在無向圖,頂點V i 的度是第i 個鏈表的結點數;

  • 對 有向圖 可以建立 正鄰接表逆鄰接表

    • 正鄰接表是以頂點V i爲出度( 即爲弧的起點) 而建立的鄰接表;
    • 逆鄰接表是以頂點V i 爲入度( 即爲弧的終點)而建立的鄰接表;
  • 在有向圖中,已知一頂點出度求入讀,須遍歷整個鄰接表;

遍歷頂點:

數據結構:鄰接表;注意非連通圖遍歷;總時間複雜度爲O(n+e)

深度:DFS

沿着路徑找,直到沒路,往回看有沒有分叉路可以抵達不了的點;遞歸

  1. 從圖中某個頂點v i 出發 ,訪問v i ;然後找到v i 的一個鄰接頂點v i1
  2. 從v i1 出發,深度優先搜索訪問和v i1 相 鄰接且未被訪問的所有頂點
  3. 轉⑴ ,直到和v i 相 鄰接的所有頂點都被訪問爲止
  4. 繼續選取圖中未被訪問頂點vj 作爲起始頂點,轉 (1)

廣度:BFS

先訪問所有跟它連着的點(有多個時順序取決於鄰接表),然後找經過一個頂點能到的未訪問點,然後是經過兩個點能到,依次往下;隊列反覆取首結點

  1. 從圖中某個頂點v i 出發 ,訪問v i
  2. 訪問v i 的所有相 鄰接且未被訪問的所有頂點v i1 ,v i2 , ,… ,v im
  3. 以v i1 , ,v i2 , , … ,v im 的次序 ,以v ij (1 ≦j ≦m)依 依此作爲v i ,轉⑴
  4. 繼續選取圖中 未被訪問 頂點v k 作爲起始頂點 ,轉⑴,直到圖中所有頂點都被訪問爲止。

連通分量、生成樹

連通分量

連通分量:調用遍歷函數遍歷完全圖的次數

序列集:每次遍歷的節點組成的集合

深(廣)度優先生成樹

當給定無向圖要求畫出其對應的生成樹或生成森林時, 必須先給出相應的鄰接表,然後才能根據鄰接表畫出其對應的生成樹或生成森林(按遍歷的順序在原圖上畫軌跡,畫出來的就是生成樹,連通圖畫出來是樹,非連通是森林)

非連通有向圖強連通分量

任意兩頂點可達,稱爲一個強連通分量

求有向圖G 的強連通分量的基本步驟

①  對G 進行深度優先遍歷 , 生成G 的深度優先生成森林T。
② 對森林T 的頂點按中序遍歷順序進行編號 。
③ 改變G 中每一條弧的方向 ,構成一個新的有向圖G’
④ 按⑵中標出的頂點編號,從編號最大的頂點開始對G’ 進行深度優先搜索,得到一棵深度優先生成樹。若一次完整的搜索過程沒有遍歷G’ 的所有頂點,則從未訪問的頂點中選擇一個編號最大的頂點,由它開始再進行深度優先搜索,並得到另一棵深度優先生成樹。在該步驟中,每一次深度優先搜索所得到的生成樹中的頂點就是G 的一個強連通分量的所有頂點。
⑤  重複步驟⑷ ,直到G’ 中的所有頂點都被訪問。

最小生成樹(針對帶權圖)

  • 儘可能選取權值最小的邊,但不能構成迴路
  • 選擇n-1條邊(連通)

Prim算法

任一點出發,每次找已訪問點集和未訪問點集連接邊中權值最小的邊;
算法複雜度與邊數無關,是頂點數的平方O(n2 )

Kruskal算法

找帶權值最小的邊,且要求該邊兩頂點中至少一個未被訪問,或兩個已訪問點不在同一個連通分量
時間複雜度:

  • Vset(記錄連通分量的數組) 數組初始化 :時間複雜度是O(n)
  • 表按權值排序 :若採用堆排序或快速排序,時間複雜度是O(e log e)
  • while 循環:最大執行頻度是O(n) ,其中包含修改Vset 數組,共執行n-1 次,時間複雜度是O(n 2 )
  • 整個算法的時間複雜度是O(e loge+n2 ) 。

有向無環圖:

拓撲排序:(AOV網)

工程中:圖中頂點表示活動,有向邊表示活動之間的優先關係,這樣的有向圖稱爲AOV 網
① AOV 網中選擇一個沒有前驅的頂點且輸出 ;
② 在AOV網中刪除該頂點以及從該頂點出發的(以該頂點爲尾的弧) 所有有向弧(邊)
③ 重複 ① 、 ② ,直到圖中全部頂點都已輸出(圖中無環)或圖中不存在無前驅的頂點(圖中必有環)

算法:

  • 採用正鄰接鏈作爲AOV 網的存儲結構
  • 設立堆棧,用來暫存入度爲0 的頂點
  • 刪除頂點以它爲尾的弧:弧頭頂點的入度減1
  • 時間複雜度O(n+e)

關鍵路徑

(AOE,AOV(V:Vertex)用頂點表示活動,AOE(E:Edge)用邊表示活動。)
從輸入到輸出經過的延時最長的路徑;求關鍵路徑是在拓撲排序的前提下進行的,不能進行拓撲排序,自然也不能求關鍵路徑;時間複雜度是O(n+e)(n個點,e條邊)

性質:

  • 只有在進入某頂點的活動都已經結束,該頂點所代表的事件才發生;
    例如:a1和a2活動都結束了,頂點V2所代表的事件纔會發生。
  • 只有在某頂點所代表的事件發生後,從該頂點出發的各活動纔開始;
    例如:只有頂點V1所代表的事件結束之後,活動a2和a4纔會開始。

算法:

① 利用拓撲排序求出AOE 網的一個拓撲序列
② 從拓撲排序的序列的第一個頂點(源點) 開始按拓撲順序 依次計算每個事件的最早發生時間(最早開始時間:順着推)
③ 從拓撲排序的序列的最後一個頂點(匯點) 開始,按逆拓撲順序依次計算 每個頂點的最晚開始時間(最晚開始時間:倒着推,根據最後一個點最早開始時間,從最後一個點往前減,頂點最晚開始時間取出度減出來的幾個值中最小的。)

最短路徑:(帶權圖)

Dijkstra算法

按路徑長度遞增次序,時間複雜度O(n2),找到的是單一點到其他點的最短路徑

算法

把頂點集合V分成兩組:
(1)S:已求出的頂點的集合(初始時只含有源點V0)
(2)V-S=T:尚未確定的頂點集合
將T中頂點按遞增的次序加入到S中,保證:
(1)從源點V0到S中其他各頂點的長度都不大於從V0到T中任何頂點的最短路徑長度
(2)每個頂點對應一個距離值
S中頂點:從V0到此頂點的長度
T中頂點:從V0到此頂點的只包括S中頂點作中間頂點的最短路徑長度
依據:可以證明V0到T中頂點Vk的,或是從V0到Vk的直接路徑的權值;或是從V0經S中頂點到Vk的路徑權值之和

Floyd算法

時間複雜度O(n 3 ),找到的是每一對點間的最短路徑

算法

1,從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權爲無窮大。
2,對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比已知的路徑更短。如果是更新它。
把圖用鄰接矩陣G表示出來,如果從Vi到Vj有路可達,則G[ i ][ j ]=d,d表示該路的長度;否則G[ i ][ j ]=無窮大。定義一個矩陣D用來記錄所插入點的信息,D[ i ] [ j]表示從Vi到Vj需要經過的點,初始化D[ i ][ j ]=j。把各個頂點插入圖中,比較插點後的距離與原來的距離,G[ i ][ j ] = min( G[ i ][ j ], G[ i ][ k ]+G[ k ][ j ] ),如果G[ i ][ j ]的值變小,則D[ i ][ j ]=k。在G中包含有兩點之間最短道路的信息,而在D中則包含了最短通路徑的信息。

查找

靜態

  1. 順序查找(平均查找長度ASL=3(n+1)/4)
  2. 折半查找(畫判定二叉樹,ASL≈ log2 (n+1)-1)
  3. 分塊查找(順序索引查找)
順序查找 折半查找 分塊查找
ASL max min middle
表結構 有序表、無序表 有序表 分塊有序表
存儲結構 順序存儲結構線性鏈表 順序存儲結構 順序存儲結構線性鏈表

動態

BST二叉排序樹

時間複雜度:O(logn)

插入:

每次插入的新結點都是BST 樹的葉子結點 ,即在插入時不必移動其它結點,僅需修改某個結點的指針)

刪除

  • 若* p結點爲葉子結點,即PL(左子樹)和PR(右子樹)均爲空樹。由於刪去葉子結點不破壞整棵樹的結構,則可以直接刪除此子結點。
  • 若* p結點只有左子樹PL或右子樹PR,此時只要令PL或PR直接成爲其雙親結點* f的左子樹(當* p是左子樹)或右子樹(當* p是右子樹)即可,作此修改也不破壞二叉排序樹的特性。
  • 若* p結點的左子樹和右子樹均不空。在刪去* p之後,爲保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,可以有兩種做法:其一是令* p的左子樹爲* f的左/右(依* p是* f的左子樹還是右子樹而定)子樹,* s爲* p左子樹的最右下的結點,而* p的右子樹爲* s的右子樹;其二是令* p的直接前驅(或直接後繼)替代* p,然後再從二叉排序樹中刪去它的直接前驅(或直接後繼)即讓* f的左子樹(如果有的話)成爲* p左子樹的最左下結點(如果有的話),再讓* f成爲* p的左右結點的父結點。

平衡二叉樹

在排序樹的基礎上,插入時做平衡操作;刪除時做平衡

判斷平衡條件:平衡因子爲(左孩的深度-右孩的深度)只能爲0,-1,1

LL:

在a的左子樹根節點的左子樹上插入節點而破壞平衡,做LL操作
在這裏插入圖片描述

RR:

在a的右子樹根節點的右子樹上插入節點而破壞平衡,做RR操作
在這裏插入圖片描述

LR:

在a的左子樹根節點的右子樹上插入節點而破壞平衡,做LR操作
在這裏插入圖片描述

RL:

在a的右子樹根節點的左子樹上插入節點而破壞平衡,做RL操作
在這裏插入圖片描述

B+樹、B-樹:

添加

  1. 在B_ 樹的中查找關鍵字K ,若找到,表明關鍵字已存在,返回;否則,K 的查找操作失敗於某個葉子結點,轉 ②

  2. 將K 插入到該 葉子結點中,插入時,若:葉子結點的關鍵字數<m-1 :直接插入;葉子結點的關鍵字數= =m-1 :將結點 “ 分裂”

刪除

  1. 若 結點N 中的關鍵字 個數>m/2-1 :在結點中直接刪除關鍵字K
  2. 若結點N 中的關鍵字 個數=m/2-1 :若 結點N 的左( 右) 兄弟結點中的關鍵字個數>m/2-1 ,則將 結點N 的左( 或右) 兄弟結點中的最大( 或最小) 關鍵字上移到其父結點中 ,而父結點中大於( 或小於) 且緊靠上到關鍵字的 關鍵字下移到結點N
  3. 若結點N 和其兄弟結點中的 關鍵字數=m/2-1: 刪除 結點N 中的關鍵字 ,再將 結點N 中的關鍵字、指針與其兄弟結點以及分割二者的父結點中的某個 關鍵字K i , 合併爲一個結點 ,若因此使 父結點中的關鍵字個數<m/2-1 ,則依此類推。

哈希法(Hashtable)

哈希函數是一種映象,其設定很靈活,只要使任何關鍵字的哈希函數值都落在表長允許的範圍之內即可 。

評價因素

  • 散列函數的構造簡單
  • 能 “ 均勻 ” 地將散列表中的關鍵字映射到地址空間。所謂 “ 均勻” ”(uniform) 是指發生衝突的可能性儘可能最少。

構造方法:

  • 直接定址法(H(key)=key 或 H(key)=a*key+b)

  • 數字分析法

  • 平方取中法
    將關鍵字平方後取中間幾位作爲哈希地址 。一個數平方後中間幾位和數的每一位都有關,則由隨機分佈的關鍵字得到的散列地址也是隨機的 。散列函數所取的位數由散列表的長度決定。這種方法 適於不知道全部關鍵字情況,是一種較爲常用的方法

  • 摺疊法(適於關鍵字位數很多,且每一位上數字分佈大致均勻情況 )

  • 移位疊加:將分割後的幾部分低位對齊相加

  • 間界疊加:從一端到另一端沿分割界來回折迭,然後對齊相加 。

  • 留取餘數法(某個不大於哈希表表長m 的數p 除後所得餘數作哈希地址,即H(key)=key MOD p (p≤m)

  • 隨機數法(當散列表中關鍵字長度不等時 , 該方法比較合適)H(key)=random(key)

解決衝突:

  • 開放地址法(H i (key)=(H(key)+di ) MOD m ,i=1, 2, …, k(k≤m-1))
    • 線性探測(衝突之後向後找空位)
    • 二次探測(d i =1²,-1²,2²,-2²,3²,……±k²)
    • 僞隨機探測(增量序列使用一個僞隨機函數來產生一個落在閉區間[1 ,m-1]的隨機序列)
  • 再哈希法:當發生衝突時,再次利用哈希法建立序列
  • 鏈地址法
  • 建立公共溢出區

平均查找長度:α=表中記錄數/哈希表長

排序(內部排序爲主)

基本術語

主關鍵字:排序後得到的結果是唯一的
次關鍵字:排序後得到的結果是不唯一的
就地排序:排序算法所需的輔助空間不依賴問題的規模n,即空間複雜度是O(1)
非就地排序:排序算法所需的輔助空間依賴問題的規模n,即空間複雜度是O(n)
內部排序:待排序的記錄數不太多,所有的記錄都能存放在內存中進行排序
外部排序:待排序的記錄數太多,所有的記錄不可能存放在內存中,排序過程中必須在內外存之間進行數據交換

內部排序

基本操作

  • 比較兩個關鍵字的大小(必不可少)
  • 存儲位置的移動:從一個位置移到另一個位置(不是必須的,取決於記錄的存儲方式)
    • 記錄存儲在一組連續地址的存儲空間,記錄的移動是必不可少的,適用較少記錄
    • 記錄採用鏈式存儲方式,僅需修改結點的指針,而不需要移動記錄,適用較多記錄
    • 記錄存儲在一組連續地址的存儲空間,不需要移動記錄,而僅需修改輔助表中的指針,排序後視具體情況決定是否調整記錄的存儲位置,適用較多記錄

內部排序分類

插入排序

依次將無序序列中的一個記錄,按關鍵字值的大小插入到已排好序一個子序列的適當位置,直到所有的記錄都插入爲止

  • 直接插入PPT695
  • 折半插入PPT701
  • 表插入PPT701
  • 2-路插入PPT705
  • shell排序PPT711

交換排序

對於待排序記錄序列中的記錄,兩兩比較記錄的關鍵字,並對反序的兩個記錄進行交換,直到整個序列中沒有反序的記錄偶對爲止

  • 冒泡排序PPT717
  • 快速排序PPT722

選擇排序

不斷地從待排序的記錄序列中選取關鍵字最小的記錄,放在已排好序的序列的最後,直到所有記錄都被選取爲止

  • 簡單些選擇排序PPT734
  • 樹形選擇排序PPT739
  • 堆排序PPT741

歸併排序

PPT751利用“歸併”技術不斷地對待排序記錄序列中的有序子序列進行合併,直到合併爲一個有序序列爲止

基數排序

按待排序記錄的關鍵字的組成成分(“位”)從低到高(或從高到低)進行。每次是按記錄關鍵字某一“位”的值將所有記錄分配到相應的桶中,再按桶的編號依次將記錄進行收集,最後得到一個有序序列

  • 多關鍵字排序PPT760
  • 鏈式基數排序PPT762

排序的穩定性

若記錄序列中有兩個或兩個以上關鍵字相等的記錄: Ki =Kj(i≠j,i, j=1, 2, … n),且在排序前Ri
先於Rj(i<j),排序後的記錄序列仍然是Ri先於Rj,稱排序方法是穩定的,否則是不穩定的。

評價標準

執行時間和所需的輔助空間,其次是算法的穩定性。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nKbOcoR2-1578456110012)(C:\Users\紀元\AppData\Roaming\Typora\typora-user-images\image-20200108111248402.png)]

發佈了18 篇原創文章 · 獲贊 4 · 訪問量 3115
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章