索引算法 索引算法介紹

索引算法介紹

線性查找

線性查找就是最簡單的查找算法,在一個數組或者鏈表從頭到尾遍歷查找,時間複雜度是o(n)

二分查找

二分法相比於線性查找時間複雜度降低到了o(logn)級別,但是添加了一些限制

  • 必須是數組,支持隨機訪問
  • 數組中元素必須是有序的

二叉搜索樹

二分法的缺點就是必須支持隨機訪問,但是對於數組而言如果進行插入操作的話時間複雜度是o(n)級別;二分搜索樹就是結合了二分法和鏈表的優勢實現的,二分搜索樹有如下特點

  • 二分搜索樹是滿二叉樹
  • 二分搜索樹中任一節點大於左子樹的所有節點、小於右子樹的所有節點
  • 搜索、插入、刪除的時間複雜度是o(logn)級別的

平衡搜索樹

平衡二叉樹本質上還是二分搜索樹,只不過平衡二叉樹約束了左子樹和右子樹的高度,比如紅黑樹要求任意節點左右子樹的高度差不能超過1

二分搜索樹在左右子樹極不平衡的情況下會退化成鏈表,平衡二叉樹就是爲了解決此問題的

B樹

平衡二叉樹有兩個問題:

  • 平衡二叉樹一個節點只能存儲一個數據

    在內存中這樣並沒有問題,但是在數據庫場景下落盤就會存在問題:硬盤讀取的最小單位是扇區,可能是512字節或者4KB;假設我們讀取一個節點,那麼從硬盤中一次讀取的數據只有很少一部分有用

  • 平衡二叉樹深度較高

    平衡二叉樹很容易達到幾十層,對於硬盤IO來說代價還是有點大


B樹是類似於圖中這樣的樹,它是結合了線性查找和二分搜索樹的特點而來的:

  • 每一個節點可以存儲多項內容,每一項同時包含索引和數據


備註:普通的二叉樹或B樹每個節點存儲的就是整數,這個整數既是節點的數據也是節點用來索引/排序的標記;但是在真正的場景中如MySQL中,一項數據包括很多內容而索引可能只是其中一項。

B+樹

B樹同樣存在問題,就是在範圍查找時非常困難

B+樹和B樹的區別在於

  • 底層是一個雙向鏈表,存儲了所有的數據
  • 上層只存儲索引而不存儲數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章