树hash树BtreeB+tree
目錄:
- 樹
- Hash樹
- Btree
- B+tree
樹
樹的特性
- 一棵樹中的任意兩個結點有且僅有唯一的一條路徑連通
- 一棵樹如果有n個結點,則它一定有n?1條邊
- 在一棵樹中加一條邊將會構成一個回路
二叉樹
二叉樹是一種特殊的樹,二叉樹的特點是每個結點最多有兩個兒子
二叉樹使用范圍最廣,一顆多叉樹也可以轉化為二叉樹
滿二叉樹
二叉樹中每個內部節點都有兩個兒子,滿二叉樹所有的葉節點都有相同的深度
滿二叉樹是一棵深度為h且有2h?1個結點的二叉樹
完全二叉樹
若設二叉樹的高度為h,除了第h層外,其他層的結點數都達到最大個數,第h層從右向左連續 缺若干個結點,則為完全二叉樹
樹的特點
- 如果一棵完全二叉樹的父節點編號為K,則其左兒子的編號是2K,右兒子的結點編號為2K+1
- 已知完全二叉樹的總節點數為n求葉子節點個數:
當n為奇數時:(n+1)/2
當n為偶數時 : (n)/2
- 已知完全二叉樹的總節點數為n求父節點個數:為:n/2
- 已知完全二叉樹的總節點數為n求葉子節點為2的父節點個數:
當n為奇數時:n/2
當n為偶數時 : n/2-1
- 如果一棵完全二叉樹有N個結點,那么這棵二叉樹的深度為【log2(N+1)log2(N+1)】(向上取整)
Hash樹
hash樹描述(就是散列樹)
hash樹特點
注:關系型數據庫中,索引大多采用B/B+樹來作為存儲結構,而全文搜索引擎的索引則主要采用hash的存儲結構,這兩種數據結構有什么區別?
- 如果是等值查詢,那么哈希索引明顯有絕對優勢,因為只需要經過一次算法即可找到相應的鍵值
- 當然了,這個前提是,鍵值都是唯一的,如果鍵值不是唯一的,就需要先找到該鍵所在位置,然后再根據鏈表往后掃描,直到找到相應的數據
- 如果是范圍查詢檢索,這時候哈希索引就毫無用武之地了,因為原先是有序的鍵值,經過哈希算法后,有可能變成不連續的了,就沒辦法再利用索引完成范圍查詢檢索
- 同理,哈希索引也沒辦法利用索引完成排序,以及like ‘xxx%’ 這樣的部分模糊查詢(這種部分模糊查詢,其實本質上也是范圍查詢)
建立hash樹
- 選擇從2開始的連續質數來建立一個十層的哈希樹
- 第一層結點為根結點,根結點下有2個結點;第二層的每個結點下有3個結點
- 依此類推,即每層結點的子節點數目為連續的質數。到第十層,每個結點下有29個結點
- 同一結點中的子結點,從左到右代表不同的余數結果
-
例如:第二層結點下有三個子節點。那么從左到右分別代表:除3余0,除3余1,除3余2.對質數進行取余操作得到的余數決定了處理的路徑
- 以隨機的10個數的插入為例,來圖解HashTree的插入過程
- 其實也可以把所有的鍵-值節點放在哈希樹的第10層葉節點處,這第10層的滿節點數就包含了所有的整數個數,但是如果這樣處理的話,所有的非葉子節點作為鍵-值節點的索引,這樣使樹結構龐大,浪費空間
查找編輯
刪除編輯
hash樹優點
1)結構簡單
2)查找迅速
3)結構不變
hash樹缺點
- 哈希樹不支持排序,沒有順序特性
- 如果在此基礎上不做任何改進的話并試圖通過遍歷來實現排序,那么操作效率將遠遠低于其他類型的數據結構
hash索引使用范圍
如果在此基礎上不做任何改進的話并試圖通過遍歷來實現排序,那么操作效率將遠遠低于其他類型的數據結構
因為hash索引比較的是經常hash運算之后的hash值,因此只能進行等值的過濾,不能基于范圍的查找,因為經過hash算法處理后的hash值的大小關系,并不能保證與處理前的hash大小關系對應
這樣要定位某一條記錄時就會非常麻煩,會浪費多次表數據的訪問,而造成整體性能低下
Hash索引:
索引列值的哈希值+數據行指針:因此找到后還需要根據指針去找數據,造成隨機I/O
適合: 精確匹配
不適合: 模糊匹配 、范圍匹配 、不能排序
Btree
一棵m階的Btree有如下特性
- 每個節點最多有m個孩子
- 除了根節點和葉子節點外,其它每個節點至少有Ceil(m/2)個孩子(Ceil返回大于或者等于指定表達式的最小整數)
- 若根節點不是葉子節點,則至少有2個孩子
- 所有葉子節點都在同一層,且不包含其它關鍵字信息
- 每個非終端節點包含n個關鍵字信息(P0,P1,…Pn, k1,…kn)
- 關鍵字的個數n滿足:ceil(m/2)-1 <= n <= m-1
- ki(i=1,…n)為關鍵字,且關鍵字升序排序
- Pi(i=1,…n)為指向子樹根節點的指針。P(i-1)指向的子樹的所有節點關鍵字均小于ki,但都大于k(i-1)
以一個3階的Btree舉例
模擬查找關鍵字29的過程
# 根據根節點找到磁盤塊1,讀入內存?!敬疟PI/O操作第1次】 # 比較關鍵字29在區間(17,35),找到磁盤塊1的指針P2。 # 根據P2指針找到磁盤塊3,讀入內存?!敬疟PI/O操作第2次】 # 比較關鍵字29在區間(26,30),找到磁盤塊3的指針P2。 # 根據P2指針找到磁盤塊8,讀入內存。【磁盤I/O操作第3次】 # 在磁盤塊8中的關鍵字列表中找到關鍵字29。Btree的特點:
- 所有鍵值分布在整個樹中
- 任何關鍵字出現且只出現在一個節點中
- 搜索有可能在非葉子節點結束
- 在關鍵字全集內做一次查找,性能逼近二分查找算法
B+tree
B+tree特點
B+tree(以每個節點可存4個建值及指針信息為例)
B+tree優點
說明:
實際情況中每個節點可能不能填充滿,因此在數據庫中,B+Tree的高度一般都在2~4層
mysql的InnoDB存儲引擎在設計時是將根節點常駐內存的,也就是說查找某一鍵值的行記錄時最多只需要1~3次磁盤I/O操作
Btree和B+tree的區別:
- 非葉子節點只存儲鍵值信息
- 所有葉子節點之間都有一個鏈指針
- 數據記錄都存放在葉子節點中
- B+tree的非葉子節點不存儲真正的data,而btree可以
- btree支持數據的延展性,B+tree支持數據的擴展性
參考原址來自于此
總結
以上是生活随笔為你收集整理的树hash树BtreeB+tree的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL数据库的优化
- 下一篇: 分库分表读写分离