資料結構之查詢(順序、折半、分塊查詢,B樹、B+樹)
一、線性結構查詢
1、順序查詢
(1)無序的線性查詢
基本思想:從線性表的一端開始,逐個檢查關鍵字是否滿足給定的條件。特點:當N比較大時,查詢效率低。
(2)有序的線性查詢:查效率比無序查詢略高。
2、折半查詢
基本思想:折半查詢又稱二分查詢,僅適用於有序的順序表。將給定的值與表中間位置的元素比較,相等則查詢成功;不相等則繼續在中間元素以外的前半部分或後半部分繼續查詢;如此重複,直到找到為止,若沒有指定元素,則查詢失敗。
案例:
3、分塊查詢
基本思想:吸取了順序查詢和折半查詢各自的優點,既有動態結構,又適於快速查詢。將表分為若干子塊,塊內元素可以無序,塊之間必須是有序的。
案例:88、24、72、61、21、6、32、11、8、31、22、83、78、54
二、樹形結構查詢
1、B樹
B樹:又叫多路平衡查詢樹,B樹種所有結點的孩子個數的最大值稱為B樹的階,通常用m表示。B樹也是所有結點的平衡因子均等於0的多路平衡查詢樹。
(1)m叉樹的特性:
- 1)樹中每個結點至多有m棵子樹,即至多含有m-1個關鍵字;
- 2)若根節點不是終端結點,則至少有兩棵子樹;
- 3)除根結點外的所有非葉節點至少有m/2棵子樹,至少有m/2-1個關鍵字;
- 4)所有非葉結點的結構如下:
- 5)所有的葉結點都出現在同一層次上,並且不帶資訊
案例:
(2)B樹的高度範圍:
(3)B樹的用途
使用B-tree結構可以顯著減少定位記錄時所經歷的中間過程,從而加快存取速度。這個資料結構一般用於資料庫的索引,綜合效率較高。
(4)B樹的查詢
B樹的查詢:類似二叉排序樹的查詢,不同的是B樹每個結點上是有多個關鍵字的有序表,在到達某個結點時,先在有序表中查詢,若找到,則查詢成功;否則,到按照對應的指標資訊指向的子樹中去查詢,當到達葉子結點時,則說明樹中沒有對應的關鍵碼。
案例:
- 1)首先從根節點a開始,因為 a 節點中只有一個關鍵字35,且給定值47 > 關鍵字35,則若存在必在指標A1所指的子樹內。
- 2)順指標找到 c節點,該節點有兩個關鍵字(43和 78),而43 < 47 < 78,若存在比在指標A1所指的子樹中。
- 3)同樣,順指標找到 g節點,在該節點找到關鍵字47,查詢成功。
(4)B樹的插入(可能涉及結點的分裂)
案例:3階B樹,假設需依次插入關鍵字30,26,85。
- 1)首先通過查詢確定插入的位置。由根節點a開始查詢,確定30應插入的在d 節點中。由於d 中關鍵字數目不超過2(即m-1),故第一個關鍵字插入完成:如圖(b)
- 2)同樣,通過查詢確定關鍵字26亦應插入 d, 由於d節點關鍵字數目超過2,此時需要將 d分裂成兩個節點,關鍵字26及其前、後兩個指標仍保留在 d 節點中。而關鍵字37 及其前、後兩個指標儲存到新的產生的節點 d
中。同時將關鍵字30 和指示節點 d
的指標插入到其雙親的節點中。由於 b節點中的關鍵字數目沒有超過2,則插入完成.如圖(c)(d)
- 3) (e) -(g) 為插入85後;
(5)B樹的刪除(可能涉及結點的合併操作)
- 1)被刪關鍵字K不在終端結點,可以用K的前驅或後繼k來替代K,然後在相應的結點中刪除k,關鍵字k必定落在某個終端結點中。
- 2)被刪的關鍵字在終端結點中,有三種情況:
a、直接刪除關鍵字:若被刪關鍵字所在結點的關鍵字個數≥m/2,則可直接刪除關鍵字;
b、兄弟夠借:若被刪關鍵字所在結點的關鍵字個數=m/2-1,且與此節點相鄰的兄弟結點的關鍵字個數≥m/2,則需要調整該結點、兄弟結點及其雙親結點,以達到新的平衡;
c:兄弟不夠借:若被刪關鍵字所在結點的關鍵字個數=m/2-1,且與此節點相鄰的兄弟結點的關鍵字個數均=m/2-1,則將關鍵字刪除後與兄弟節點及其雙親節點中的關鍵字合併。
2、B+樹
(1)B+樹的特徵以及與B樹的差別
(2)每個葉子節點都有一個指標,指向下一個資料,形成一個有序連結串列。而只有葉子節點才會有data,其他都是索引。
(3)B+樹的插入
案例:階數為5。
-
a)空樹中插入5。
-
b)依次插入8,10,15,16。
插入16後產生分裂:
-
c)插入17,18
插入18後產生分裂:
-
d) 插入幾個資料後。
-
e)再繼續插入7。
最終的分裂結果:
三、雜湊表
相關文章
- 【資料結構】折半查詢(二分查詢)資料結構
- B樹查詢,磁碟查詢資料
- 查詢|有序表折半查詢判定樹|二叉排序樹|3階B-樹排序
- 資料結構之「B+樹」資料結構
- 多路查詢樹(2-3 樹、2-3-4 樹、B 樹、B+ 樹)
- #查詢演算法#【1】簡單查詢:順序、折半查詢演算法
- B樹(多路查詢樹)
- 淺談演算法和資料結構(10):平衡查詢樹之B樹演算法資料結構
- 【資料結構】B樹、B+樹詳解資料結構
- 查詢之折半查詢
- 折半查詢排序樹畫圖和排序
- Java資料結構(十五)—— 多路查詢樹Java資料結構
- 資料結構 折半查詢 swift的版本資料結構Swift
- 順序查詢和二分查詢
- javascript資料結構之順序查詢簡單介紹JavaScript資料結構
- Hierarchical Queries 級聯查詢(樹狀結構查詢)
- DS靜態查詢之順序查詢
- 轉:C++實現的變種二分查詢法(折半查詢)--二叉查詢樹C++
- NKMySQL 查詢樹結構方式gllMySql
- 樹狀資料結構儲存方式——查詢篇資料結構
- 分塊查詢【大規模資料查詢演算法優化】【索引順序查詢】演算法 PHP 版演算法優化索引PHP
- 資料結構之MySQL獨愛B+樹(二叉樹、AVL樹、紅黑樹、B樹對比)資料結構MySql二叉樹
- 順序查詢
- 淺談演算法和資料結構(9):平衡查詢樹之紅黑樹演算法資料結構
- 資料結構與演算法——單詞查詢樹資料結構演算法
- 淺談演算法和資料結構(8):平衡查詢樹之2-3樹演算法資料結構
- 【演算法資料結構Java實現】折半查詢演算法資料結構Java
- 關於樹結構的查詢優化,及許可權樹的查詢優化優化
- 多路查詢樹:B-tree/b+tree
- DNS查詢順序DNS
- 如何找東西?查詢演算法之順序查詢和二分查詢詳解演算法
- 多路查詢樹
- 平衡查詢樹
- oracle 樹查詢Oracle
- 樹形查詢
- 資料結構與演算法-二叉查詢樹資料結構演算法
- 資料結構:二叉查詢樹的相關操作資料結構
- Java實現遞迴查詢樹結構Java遞迴