B樹系列(詳解)

目錄

一、B-樹

二、B+樹

三、B*樹

四、時間復雜度

五、Mysql與B樹系列


一、B-樹

????????首先再說B樹的性質以及其他的之前,先要說一聲,好多人都把這個樹叫B減樹,其實不是,他就叫B樹,至于原因我覺的沒必要再這個名字上糾結吧!!

????????其實簡單點說B樹就是多叉平衡樹,為什么這么說呢?其實他就是在平衡二叉樹原有的基礎上,進行改進的。為什么要改進呢?其實也很簡單,就像我們排序的時候一樣,我們不可能一直在內存中進行排序,也有可能在內存外排序,也就是外排序,這個同樣的道理,就是當我們的數據多到一定程度的時候,內存中也就存不下了,而且就算存的下,也不會存,先不說大型項目中的那些數據,如果一不小把程序給關了,那么這些數據就沒了,所以我們選擇存儲在磁盤上。但是我們在磁盤上怎么找他呢?如果我們在代碼中找他的時候,那么勢必要把磁盤數據加載到內存中,而我們找數據講究的是快,所以我們采用一定的數據結構來管理這些數據,以方便我們查找的時候,可以快速的找到。

? ? ? ? 我們學習過的數據結構中,查找能排上號的就是哈希,AVL,紅黑樹等。但是此時要想到一個問題就是,用這些數據結構中的其中一個來保存這些數據,那么我們勢必要進行IO,這個是無可避免的,因為我們要知道的是,這個是從磁盤上讀取數據到內存中。所以我們每次進行比較的時候,都是一次IO,這樣就大大的降低了我們查找的效率。

如上圖中的二叉樹,其實我們一般存儲的是文件塊的地址,來一個數據,因為這里是地址,所以我們每個節點都要進行IO,所以此時就效率就低了。

也有人說用哈希,哈希其實也是一個道理,它也要進行IO。我們查找數據的時候嗎,總不能拿著地址訪問把,且有的時候,哈希沖突嚴重的時候,每個桶下面掛鏈表還不如掛成紅黑樹,此時不就又繞回來了嗎?所以,此時B樹就閃亮登場了。

B樹的規則:

規則如上,這里就不再詳細說了。

好了,我們知道了B樹的規則,那么我們為什么要用B樹呢?其實B樹是減少了IO次數。為什么呢?因為我們用B樹的時候,B樹的每個節點的所存儲的關鍵字數量比AVL,紅黑樹等數據結構要多,所以他每次進行IO 的時候,就可以一次讀取多個關鍵子和孩子所指向的文件數據塊。這樣,我們就變相的減少了IO次數。且B樹的每個節點的m一般系統會設置成1024,至于為什么,深入了解過文件系統的伙伴大概知道(這里我自己也是看到過網上有人說,至于原因,個人了解的也不太清楚,好像是跟文件系統的什么大小有關來著,也是1024,知道的伙伴可以說一下),這樣就大大減少了B樹的高度,最差情況下,也是進行高度次IO,而此時的IO次數最多也就是4次。所以大大提高了效率。

二、B+樹

B+樹在原有的B樹的基礎上進行了改進,就是把每個節點的孩子數量改成和關鍵字數量相等了。然后是每個分支節點只有索引,沒有映射的值。葉子結點改成了類似于鏈表的形式,且葉子結點包含映射的值,并且葉子結點中包含了所有節點的索引(關鍵字),并且是有序的。并且每個分支節點的第一個關鍵字是其對應的孩子節點的最小值。如下:

這樣的改進就使得每次搜索必然是要到葉子結點,因為只有這樣才可以拿到關鍵字所映射的內容。

而這樣的話,其實是在一定程度上減少了IO次數,因為B樹是每個節點都有關鍵字和其所映射的內容,而B+樹都是關鍵字,所以每個節點的關鍵相對于B樹是增加了的。也就是在相同空間下,B+樹一次IO的節點數比B樹一次IO的節點數要多。

其次,就是B+樹的比那里遍歷相對于B樹來說是方便了很多。它直接可以遍歷葉子結點,就可以得到所有內容。

三、B*樹

其實B*樹就是在B+樹上做了一些相應的改進,它整體是提高了空間利用率,但是其他方面與B+樹沒有什么本質區別。且在運用的時候,B+樹用的較多。而B*樹不是沒用,而是相對于B+樹來說,運用的較少而已。

四、時間復雜度

其實怎么說,老師講課的時候說的是logMN(m為底,n的對數),但是我感覺這樣有點不太對勁。后來我在網上查了些資料,有的說是mlogmn、logm*logmn,logn。其實我個人認為logmn是不對的,我自己也想了很久,其實也不能說是不對,只是這個時間復雜度是是最好的情況下是logmn,我認為我剛剛說的以上的三個是比較正確的(logmn只是個人感覺不太對,不是錯的,就是這個是最好的情況以下,才是logmn)。

1.m*logmn

因為我們都知道的是,B樹的每個節點都是有M-1個關鍵字,這里1影響不大,所以直接省略。那么最壞的情況下是每個節點都比較得到最后一個節點,比較B樹的高度次,所以就應該是m*logmn。有些伙伴說這里可以把m給省略了,就是logmn,但是我想說的是,這里不可以省略。因為將近十億個數據的高度是將近3-4層,也就是3<=logmn<=4,而系統默認給的B樹的每個節點m=1024,所以這里m的影響還是很大的,所以我認為是不可以省略的。而其實這里的時間復雜度也是跟m的取值有關。如果m取值相對于logmn的影響較小,此時才可以省略。如果就用系統默認給的m,這里我認為是不可以省略的。

2.logm*logmn

這個就很好理解了,因為每個節點的關鍵字都是有序的,所以我們在查找每個節點的關鍵字的時候,不要遍歷,只需要直接用二分查找就好,所以是logm*logmn。

后面的一個是logn其實就是二分查找這個方法的時間復雜度化簡得到的。這里簡單說一下,就是用換底公式就可以化簡出來。

五、Mysql與B樹系列

其實學習過數據庫的都知道,數據庫本質是管理文件中的數據,而數據結構是管理內存中的數據。那么,我們B樹系列的數據結構與數據庫有什么關系呢?其實也很容易就也可以想到。因為B樹系列的誕生使得我們可以進行在磁盤上進行查找數據時大大提高了效率。但是,特悶到底是什么關系呢?

其實Mysql本質就是cs模型,這里就不詳細說明。建立數據庫其實本質上就是在存儲引擎的這里建立B+樹。然后存儲引擎下面就是文件系統。而其實緩存就是把磁盤數據加載到緩存中。就是類似于LRU這種緩存。而這里主要說一下兩種搜索引擎

1.MyISAM

其建立的B+樹是索引文件與數據文件分開的。索引在我理解來說就是B+樹種的關鍵字。再用SQL語句建立表的時候,一般都會有個主鍵,主鍵是唯一的。(這里是數據庫的知識),而B+樹建立的時候,其key就是這個主鍵,葉子結點是會掛一個val的值來對應映射。如果想用其他搜索,只需建立索引就可以。建立索引數據庫重新建立一個B+樹,然后把這個索引當成key。

2.InnoDB

其建立的B+樹是索引文件與數據文件不分離的,也就是在一起的。注意的是,這個搜索引擎建立索引的B+樹的時候,其葉子結點的val是主鍵值。

Mysql這里講的比較淺,如果有伙伴想了解的,也可以私信,可以互相探討一下。過幾天會發B樹系列的代碼實現,到時候也會詳細說數據庫與B樹系列的關系。有了代碼就好理解了。

最后,希望大家支持一下,謝謝!!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715736.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715736.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715736.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker 轉為docker-compose(composerize 命令)

可以使用Composerize將Docker命令轉換為Docker Compose文件。 例如&#xff1a;將docker run命令轉換為Docker Compose格式&#xff0c;只需用Composerize運行它&#xff0c;如下所示&#xff1a; composerize docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/…

【JavaSE】異常

異常概述 異常指的是程序在執行的過程中&#xff0c;出現的非正常情況&#xff0c;如果不處理最終會導致JVM的非正常停止。 在Java中&#xff0c;使用不同的類來表示不同的異常&#xff08;正所謂萬物皆對象&#xff0c;因此異常也使用類來表示&#xff09;。一旦程序出現某種…

【HTML】HTML基礎5(特殊字符)

目錄 特殊字符的作用 常用的特殊字符 使用效果 特殊字符的作用 例如 當我在兩個文字間打出空格時 <p>“銀河護衛隊”系列 在漫威電影宇宙中一直是異數般的存在&#xff0c;不僅因為影片主角是一群反英雄&#xff0c;<strong>與超級英雄相比顯得格格不入<…

讀書筆記-三國演義-三英戰呂布

三英戰呂布是《三國演義》中的一段著名戰役&#xff0c;張飛、關羽和劉備三兄弟聯手擊敗了當時的霸主呂布&#xff0c;展現了他們的武藝和忠義。 介紹 "三英戰呂布"是《三國演義》中的一個著名戰役&#xff0c;發生在三國時期&#xff0c;講述了三位蜀漢名將——劉…

LeetCode 刷題 [C++] 第347題.前 K 個高頻元素

題目描述 給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回其中出現頻率前 k 高的元素。你可以按 任意順序 返回答案。 題目分析 據題意可知&#xff0c;我們需要先遍歷整個數組&#xff0c;并統計每個數字出現的次數&#xff0c;保存在哈希表中&#xff1b;對元素…

synchrosized 的可重入特性、死鎖、哲學家就餐問題以及解決死鎖的方法等干貨

文章目錄 &#x1f490;synchrosized的可重入特性關于死鎖&#xff1a;哲學家就餐問題&#x1f4a1;如何避免/解決死鎖 &#x1f490;synchrosized的可重入特性 可重入特性&#xff1a;當一個線程針對一個對象同時加鎖多次&#xff0c;不會構成死鎖&#xff0c;這樣的特性稱為…

前端學習第一天-html基礎

達標要求 網頁的形成過程 常用的瀏覽器及常見的瀏覽器內核 web 標準三層組成 什么是HTML 熟練掌握HTML文檔結構 熟練掌握HTML常用標簽 1. 初識web前端 Web前端是創建Web頁面或App等前端界面呈現給用戶的過程。 Web前端開發是從網頁制作演變而來&#xff0c;早期網站主…

sklearn.preprocessing.RobustScaler(解釋和原理,分位數,四分位差)

提示&#xff1a;sklearn.preprocessing.RobustScaler&#xff08;解釋和原理&#xff0c;分位數&#xff0c;四分位差&#xff09; 文章目錄 [TOC](文章目錄) 一、RobustScaler 是什么&#xff1f;二、代碼1.代碼2.輸出結果 總結 提示&#xff1a;以下是本篇文章正文內容&…

ELK學習

ELK 一、ELK介紹 &#x1f604; “ELK”是三個開源項目的首字母縮寫&#xff0c;這三個項目分別是&#xff1a;Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一個搜索和分析引擎。Logstash 是服務器端數據處理管道&#xff0c;能夠同時從多個來源采集數據&#xff0…

網絡編程(IP、端口、協議、UDP、TCP)【詳解】

目錄 1.什么是網絡編程&#xff1f; 2.基本的通信架構 3.網絡通信三要素 4.UDP通信-快速入門 5.UDP通信-多發多收 6.TCP通信-快速入門 7.TCP通信-多發多收 8.TCP通信-同時接收多個客戶端 9.TCP通信-綜合案例 1.什么是網絡編程&#xff1f; 網絡編程是可以讓設…

Redis的事務

在 Redis 中&#xff0c;事務&#xff08;Transaction&#xff09;是一組命令的集合&#xff0c;可以作為一個單獨的操作來執行&#xff0c;保證這組命令要么全部執行成功&#xff0c;要么全部執行失敗&#xff0c;具有原子性。在 Redis 中&#xff0c;事務是通過 MULTI、EXEC、…

repo介紹和安裝

介紹 https://blog.devwiki.net/2023/11/27/Windows-repo.html 安裝&#xff1a; https://blog.csdn.net/ysy950803/article/details/104188793

網絡安全-appcms-master

一、環境 gethub上面自己找appcms-master 二、開始闖關 原理&#xff1a;在評論的時候提交可以提交到管理員列表去&#xff0c;管理員一看cookie和地址就被盜走了 點進去軟件后會發現提交按鈕 隨便提交一下看看 放到div標簽里面是不是有可能可以做&#xff0c;看看后臺吧 那…

初學者如何學習python

Python 作為當今最受歡迎的編程語言之一&#xff0c;已經被包括谷歌、優步、Instagram 等知名公司廣泛采用于他們的應用程序開發。由于其易學易用的特性&#xff0c;Python 成為了編程初學者的首選語言。特別是在機器學習和數據科學領域&#xff0c;Python 的應用更是讓它成為了…

VUE CLI3項目搭建 ESLint配置

VUE項目框架配置 一、工具準備 Node.js安裝 安裝方法&#xff1a;點擊查看WebStorm安裝 下載地址&#xff1a;點擊查看 二、環境準備 鏡像準備 1.查看代理&#xff1a;npm get registry 2.設置淘寶鏡像 2.1臨時使用. npm --registry https://registry.npm.taobao.org ins…

【電機仿真】空間矢量脈寬調制(SVPWM)算法與實現

前言 文章【電機仿真】永磁同步電機模型中所提及了PMSM數學模型&#xff0c;模型算法是電機控制的理論基礎&#xff0c;但在實際控制中&#xff0c;需要將這兩部分具象化。實際電機所需要的總是三相電流或者電壓&#xff0c;控制對象為逆變器中的開關器件&#xff0c;我們需要將…

springboot基于web的音樂網站論文

音樂網站 摘要 隨著信息技術在管理上越來越深入而廣泛的應用&#xff0c;管理信息系統的實施在技術上已逐步成熟。本文介紹了音樂網站的開發全過程。通過分析音樂網站管理的不足&#xff0c;創建了一個計算機管理音樂網站的方案。文章介紹了音樂網站的系統分析部分&#xff0c…

114.龍芯2k1000-pmon(13)- 串口如何用

本文是講原理圖的部分&#xff0c;跟pmon的關系不大&#xff01;&#xff01; 參考手冊&#xff1a;《龍芯2K1000處理器用戶手冊.pdf》 剛剛看數據手冊&#xff0c;讓我是有點驚訝&#xff0c;但是也讓我迷惑。&#xff08;一個串口復用為4個是啥意思&#xff1f;&#xff09;…

Java項目:32 基于springboot的課程作業管理系統(含源碼數據庫+文檔免費送)

作者主頁&#xff1a;源碼空間codegym 簡介&#xff1a;Java領域優質創作者、Java項目、學習資料、技術互助 文中獲取源碼 項目介紹 管理員&#xff1a;首頁、個人中心、公告信息管理、班級管理、學生管理、教師管理、課程類型管理、課程信息管理、學生選課管理、作業布置管理…

CK98-數學家鍵盤配置

官方驅動和說明書下載地址 https://www.coolkiller.cn/download/lists_6.html 介紹&#xff1a;https://new.qq.com/rain/a/20221229A09B1M00 官方CK-98數學家驅動版本&#xff08;謹慎更新&#xff09; 如果升級驅動出現問題&#xff0c;重啟驅動軟件后會默認讓你恢復的。 …