B樹、B+樹發展史

来源:https://www.cnblogs.com/lverkou/archive/2020/06/08/13063324.html
-Advertisement-
Play Games

順序查找:就是從第一個元素開始,按索引順序遍歷待查找序列,直到找出給定目標或者查找失敗 缺點:效率低 -- 需要遍歷整個待查序列 二分法查找:也稱為折半法,是一種在有序數組中查找特定元素的搜索演算法。 1:首先,從數組的中間元素開始搜索,如果該元素正好是目標元素,則搜索過程結束,否則執行下一步。 2: ...


順序查找:就是從第一個元素開始,按索引順序遍歷待查找序列,直到找出給定目標或者查找失敗

缺點:效率低 -- 需要遍歷整個待查序列

二分法查找:也稱為折半法,是一種在有序數組中查找特定元素的搜索演算法。

  1:首先,從數組的中間元素開始搜索,如果該元素正好是目標元素,則搜索過程結束,否則執行下一步。

  2:如果目標元素大於/小於中間元素,則在數組大於/小於中間元素的那一半區域查找,然後重覆步驟1的操作。

  3:如果某一步數組為空,則表示找不到目標元素

樹的概念

樹:連通無迴路的無向圖是一棵樹.

根:樹中的根是樹的一個節點,任意節點都可以為根,根據不同問題可以選擇樹的一個頂點為根.

子節點&父節點:樹根為0層,直接和樹根相連的節點為根節點的子節點,根節點為其父節點,根節點的子節點為樹的1層.對於除了根節點以外的節點u來說,直接與其相連的節點中,除了一個父節點以外的所有節點都是u的子節點,u節點的子節點的層數為u節點的層數加1.

子樹:對於樹中的一個節點u來說,包含其一個兒子節點以及兒子節點的所有後輩節點的樹稱為節點u的子樹.

兄弟節點:同一父節點的子節點.

葉子節:沒有子節點的節點稱為葉子節點.

分支節點:除了根節點和葉子節點之外的所有節點都稱為分支節點.

樹高:樹的總層數.

樹的種類

無序樹:任意子節點之間沒有順序關係,也稱自由樹

有序樹:任意節點的子節點之間有順序關係,如下:

二叉樹:如果每個節點的兒子節點不多於兩個,則稱這棵樹為二叉.每個父節點的子節點用左右兒子節點來加以區分,以左兒子節點為根的子樹稱為左子樹,以右兒子節點為根的樹稱為右子樹.

滿二叉樹:如果一個二叉樹的任何節點或者樹葉,或者恰好有兩顆非空子樹,則此二叉樹稱為滿二叉樹.

完全二叉樹:如果一棵二叉樹最多只有最下麵的兩次節點度數小於2,並且最下麵一層的節點都集中在該層的最左邊的連續位置,成稱其實完全二叉樹.

平衡二叉樹(Balanced Binary Tree)又被稱為AVL樹(有別於AVL演算法),且具有以下性質:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹.

儲存:鏈式儲存。

紅黑樹: 在平衡二叉樹穩定性的基礎上,再優化一下,減少旋轉次數 特性: 1、每個節點要麼是紅色,要麼是黑色。 2、根節點必須是黑色。 3、紅色節點不能連續(也即是,紅色節點的孩子和父親都不能是紅色)。 4、對於每個節點,從該點至null(樹尾端)的任何路徑,都含有相同個數的黑色節點。

二叉樹特點:查找速度和比較次數最小,但是磁碟IO,當數據量過大的時候,索引大小可能有幾個G,不可能全都載入到記憶體

引出下麵的樹更穩

B樹與B+樹

B樹 、B - 樹都讀B樹。

B樹與B+樹區別:

B樹每個節點都存儲數據,所有節點組成這棵樹。B+樹只有葉子節點存儲數據(B+數中有兩個頭指針:一個指向根節點,另一個指向關鍵字最小的葉節點),葉子節點包含了這棵樹的所有數據,所有的葉子結點使用鏈表相連,便於區間查找和遍歷,所有非葉節點起到索引作用。

B樹中葉節點包含的關鍵字和其他節點包含的關鍵字是不重覆的,B+樹的索引項只包含對應子樹的最大關鍵字和指向該子樹的指針,不含有該關鍵字對應記錄的存儲地址。

B樹中每個節點(非根節點)關鍵字個數的範圍為[m/2(向上取整)-1,m-1](根節點為[1,m-1]),並且具有n個關鍵字的節點包含(n+1)棵子樹。B+樹中每個節點(非根節點)關鍵字個數的範圍為[m/2(向上取整),m](根節點為[1,m]),具有n個關鍵字的節點包含(n)棵子樹。

B+樹中查找,無論查找是否成功,每次都是一條從根節點到葉節點的路徑。

B樹的優點:B樹的每一個節點都包含key和value,因此經常訪問的元素可能離根節點更近,因此訪問也更迅速。

M階B+數特點

有n棵子樹的非葉子結點中含有n個關鍵字(b樹是n-1個),這些關鍵字不保存數據,只用來索引,所有數據都保存在葉子節點(b樹是每個關鍵字都保存數據)。
所有的葉子結點中包含了全部關鍵字的信息,及指向含這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接(葉子節點組成一個鏈表)。
所有的非葉子結點可以看成是索引部分,結點中僅含其子樹中的最大(或最小)關鍵字。
通常在b+樹上有兩個頭指針,一個指向根結點,一個指向關鍵字最小的葉子結點。
同一個數字會在不同節點中重覆出現,根節點的最大元素就是b+樹的最大元素。

B+樹的優點

所有的葉子結點使用鏈表相連,便於區間查找和遍歷。B樹則需要進行每一層的遞歸遍歷。相鄰的元素可能在記憶體中不相鄰,所以緩存命中性沒有B+樹好。

b+樹的中間節點不保存數據,能容納更多節點元素。

B樹和B+樹的共同優點

考慮磁碟IO的影響,它相對於記憶體來說是很慢的。資料庫索引是存儲在磁碟上的,當數據量大時,就不能把整個索引全部載入到記憶體了,只能逐一載入每一個磁碟頁(對應索引樹的節點)。所以我們要減少IO次數,對於樹來說,IO次數就是樹的高度,而“矮胖”就是b樹的特征之一,m的大小取決於磁碟頁的大小。

雖然查詢次數比二叉樹多,尤其當單一節點元素多時,但是相比磁碟IO速度,記憶體中的比較耗時幾乎可以忽略

所以只要樹的高度是夠低,IO次數是足夠少,就可以提升查找性能

IO:每一次讀取的數據稱之為一頁.

B樹示意圖:

 

 

以下為 B+樹示意圖:

 

 在MySQL中,最常用的兩個存儲引擎是MyISAM和InnoDB,它們對索引的實現方式是不同的

MyISAM : data存的是數據地址。索引是索引,數據是數據。索引放在XX.MYI文件中,數據放在XX.MYD文件中,所以也叫非聚集索引

 

 

InnoDB: data存的是數據本身。索引也是數據。數據和索引存在一個XX.IDB文件中,所以也叫聚集索引。

 

 我們的Mysql資料庫用的InnoDB。

瞭解了數據結構再看索引,一切都不費解了,只是順著邏輯推而已。另加兩種存儲引擎的區別:

1、MyISAM是非事務安全的,而InnoDB是事務安全的

2、MyISAM鎖的粒度是表級的,而InnoDB支持行級鎖

3、MyISAM支持全文類型索引,而InnoDB不支持全文索引

4、MyISAM相對簡單,效率上要優於InnoDB,小型應用可以考慮使用MyISAM

5、MyISAM表保存成文件形式,跨平臺使用更加方便

6、MyISAM管理非事務表,提供高速存儲和檢索以及全文搜索能力,如果在應用中執行大量select操作可選擇

7、InnoDB用於事務處理,具有ACID事務支持等特性,如果在應用中執行大量insert和update操作,可選擇。

 

參考文獻:

https://www.cnblogs.com/daguozb/p/8665506.html

https://www.cnblogs.com/Ash-ly/p/5459688.html

https://www.jianshu.com/p/f456d7c80ffb

https://blog.csdn.net/weixin_42228338/article/details/97684517

https://blog.csdn.net/zhuanzhe117/article/details/78039692


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 布不會對場景中的所有碰撞體做出反應,也不會將力施加到世界。 當它被添加時,布組件將不會反應或影響任何其他身體。 因此,布和世界不會相互識別或看到對方,直到你手動添加碰撞者從世界到布組件。 即使在那之後,模擬仍然是單向的:布料對這些物體做出反應,但不施加力。 此外,您只能使用三種類型的碰撞器與布:球體 ...
  • 0. 前言 在《asp.net core 系列》之前的幾篇文章中,我們簡單瞭解了路由、控制器以及視圖的關係以及靜態資源的引入,讓我們對於asp.net core mvc項目有了基本的認識。不過,這些並不是 asp.net core mvc項目的全部內容,剩下的內容我將結合實戰項目為大家講解其中的知識 ...
  • 系列文章 基於 abp vNext 和 .NET Core 開發博客項目 - 使用 abp cli 搭建項目 基於 abp vNext 和 .NET Core 開發博客項目 - 給項目瘦身,讓它跑起來 基於 abp vNext 和 .NET Core 開發博客項目 - 完善與美化,Swagger登場 ...
  • 從1992年linux誕生至今產生了數百種之多的Linux發行版 ...
  • Linux 內核,這個經常聽見,卻不不知道它具體是幹嘛的東西,是不是覺得非常神秘? Linux 內核看不見摸不著,而對於這類東西,我們經常無從下手。本文就以淺顯易懂的語言,帶你鑽進 Linux 內核,看它到底長啥樣。 內核是 Linux 操作系統的核心組件,它向上連接應用程式,向下直接與硬體打交道。 ...
  • windows10安裝配置WSL(Ubuntu) 怎麼在windows系統上用上Linux?有這麼幾種方法: 1. 安裝雙系統。這種方法的缺點是每次切換系統都需要關機、切換系統。 2. 虛擬機+Linux。這種方法需要一定硬體配置,因為虛擬機運行還是比較吃記憶體的。 3. windows10+WSL。 ...
  • docker倉庫就是用來存放鏡像的地方;其實docker registry我們理解為存放docker鏡像倉庫的倉庫比較準確吧;因為docker的鏡像倉庫通常是把同一類的鏡像用不同的版本來區別,而registry則是用來存放這些倉庫的倉庫;預設安裝docker都是從dockerhub鏡像倉庫下載鏡像... ...
  • 初始onion omega2+設置方法。1. wifi AP上電wifi熱點自動打開,ssid為omega-xxxx,預設ip地址為192.168.3.1。2. 電腦連接到wifi APomega-xxxx,預設密碼是123456783. 以瀏覽器,連接192.168.3.1密碼onioneer。設... ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...