【數據結構】B樹

1 B樹介紹

B樹(英語:B-tree),是一種在計算機科學自平衡的樹,能夠保持數據有序。這種數據結構能夠讓查找數據、順序訪問、插入數據及刪除的動作,都在對數時間內完成。B樹,概括來說是一個一般化的二叉搜索樹(binary search tree)一個節點可以擁有2個以上的子節點。與自平衡二叉查找樹不同,B樹適用于讀寫相對大的數據塊的存儲系統,例如磁盤。B樹減少定位記錄時所經歷的中間過程,從而加快訪問速度。B樹這種數據結構可以用來描述外部存儲。這種數據結構常被應用在數據庫和文件系統的實現上。

那為什么要使用 B-樹呢(或者說為啥要有 B-樹呢)?

要解釋清楚這一點,我們假設我們的數據量達到了億級別,主存當中根本存儲不下,我們只能以塊的形式從磁盤讀取數據,與主存的訪問時間相比,磁盤的 I/O 操作相當耗時,而提出 B-樹的主要目的就是減少磁盤的 I/O 操作。大多數平衡樹的操作(查找、插入、刪除,最大值、最小值等等)需要?O(?)?次磁盤訪問操作,其中???是樹的高度。但是對于 B-樹而言,樹的高度將不再是logn(其中 n是樹中的結點個數),而是一個我們可控的高度???(通過調整 B-樹中結點所包含的鍵【你也可以叫做數據庫中的索引,本質上就是在磁盤上的一個位置信息】的數目,使得 B-樹的高度保持一個較小的值)。一般而言,B-樹的結點所包含的鍵的數目和磁盤塊大小一樣,從數個到數千個不等。由于B-樹的高度 h 可控(一般遠小于logn ),所以與 AVL 樹和紅黑樹相比,B-樹的磁盤訪問時間將極大地降低。

平衡二叉排序樹是利用插入的成本緩解查找效率---------->紅黑樹來解決(最長子樹不超過最短子樹的2倍。數據量大的時候,樹會很深,查找次數變多)----------->B樹(多叉,多路查找樹)

動畫顯示樹調整的網站:Data Structure Visualization

2 B樹特點

B樹是一種平衡的多叉樹,通常我們說m階的B樹,它必須滿足如下條件:

  • 每個節點最多有m個子節點。
  • 每一個非葉子節點(除根節點)最少有[m/2]個子節點。
  • 如果根節點不是葉子節點,那么它至少有兩個子節點。
  • 有k個子節點的非葉子節點擁有k-1個鍵,且升序排列,滿足k[i] < k[i + 1]
  • 每個節點至多包含2*k-1個鍵。
  • 所有的葉子節點都在同一層。
  • 每個節點的結構是

其中:

n記錄這個節點關鍵字的個數;

P0存儲的是第一個孩子的地址,P1存儲的是第二個孩子的地址,以此類推。。。。。。

K1是第一個關鍵字,K2是第二個關鍵字,以此類推。。。。。。

B樹中一個節點的子節點數目的最大值,用m表示,假如最大值為4,則為4階,如下圖

性質:

  • 每個節點最多有m個子節點。
  • 每一個非葉子節點(除根節點)最少有[m/2]個子節點。
  • 如果根節點不是葉子節點,那么它至少有兩個子節點。
  • 有k個子節點的非葉子節點擁有k-1個鍵,且升序排列,滿足k[i] < k[i + 1]
  • 每個節點至多包含2*k-1個鍵。
  • 所有的葉子節點都在同一層。
  • 滿足n叉排序樹

3 B樹的增刪改查

磁盤預讀

內存跟磁盤發生數據交互的時候,一般情況下有一個最小的邏輯單元,稱之為頁,datapage

頁一般由操作系統決定是多大,一般是4k或者8k,我們在數據交互時,可以取頁的整數倍來進行讀取。

電腦的文件都是datapage的整數倍

每個節點放在磁盤塊里,用B樹做索引,這個磁盤大小是16k

三層數據。

對比B樹和B+樹

有一個很重要的不同是:B+樹的數據都存在葉子節點上。

參考:

[1]?https://zh.wikipedia.org/zh-hans/B%E6%A0%91

[2]?圖解:什么是B樹?(心中有 B 樹,做人要虛心)一文讀懂B-樹 - 知乎 (zhihu.com)

[3]?B 樹 - OI Wiki (oi-wiki.org)

[4]?終于把B樹搞明白了(四)_B樹的刪除操作_嗶哩嗶哩_bilibili

[5]?notes/docs/B樹和B+樹詳解.md at master · wardseptember/notes · GitHub

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

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

相關文章

MySQL高可用性攻略:快速搭建MySQL主從復制集群 !

MySQL高可用性攻略&#xff1a;快速搭建MySQL主從復制集群 &#xff01; MySQL基礎知識&#xff1a;介紹MySQL數據庫的基本概念和常用命令&#xff0c;如何創建數據庫、表、用戶和權限管理等。 MySQL安裝教程&#xff1a;Centos7 安裝MySQL5.7.29詳細安裝手冊 MySQL數據類型&…

【大廠AI課學習筆記NO.63】模型的維護

說是模型的維護&#xff0c;其實這堂課都是在講“在工業環境中開發和部署機器學習模型的流程”。 上圖來自于我的筆記思維腦圖&#xff0c;已經上傳&#xff0c;要鏈接的訪問的主頁查看資源。 一路走來&#xff0c;我們學習了數據管理、模型學習、模型驗證、模型部署等重要的步…

arm板運行程序時尋找動態庫的路徑設置

問題&#xff1a;error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file&#xff1f; 第一種方法---- 解決&#xff1a; ①復制需要用到的arm庫到板子上。 ②pwd指令獲取該庫的絕對路徑&#xff0c;把路徑復制到/etc/ld.so.conf文件 ③輸…

Leetcoder Day37| 動態規劃part04 背包問題

01背包理論基礎 面試掌握01背包&#xff0c;完全背包和重背包就夠用了。 背包問題的理論基礎重中之重是01背包&#xff0c;一定要理解透&#xff01; 01 背包 有n件物品和一個最多能背重量為w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的價值是value[i] 。每件物品…

隱式馬爾科夫算法

隱式馬爾科夫算法 隱式馬爾科夫算法概述算法使用HMM 模型參數設置HMM 模型分類1. Gaussian HMM2. Multinomial HMM3. GMM HMM 其他機器學習算法&#xff1a;機器學習實戰工具安裝和使用 隱式馬爾科夫算法概述 隱式馬爾科夫算法是一種用于處理時序數據的強大工具&#xff0c;其…

css通過calc動態計算寬度

max-width: calc(100% - 40px) .m-mj-status-drawing-info-data{ display: inline-block; margin: 10px; min-width: 200px; padding: 10px;border-radius: 10px; background: #ddd;max-width: calc(100% - 40px);word-wrap: break-word;white-space: pre-line;}我開發的chatg…

計算機二級(Python)真題講解每日一題:《字典字符查找》

描述???????????????????????????????????????????????????????????????????????????????????????????????????????????????? 在右側的答題模板中&#xf…

Crash 實例

1.spinlock原理 為了解決這個spinlock的不公平問題&#xff0c;linux 2.6.25內核以后&#xff0c;spinlock采用了一種"FIFO ticket-based"算法的spinlock機制&#xff0c;可以很好的實現先來先搶占的思想。具體的做法如下&#xff1a; (1)、spinlock的核心字段有ow…

C語言-柔性數組成員的使用

文章目錄 摘要柔性數組成員基本使用細節探究 零長度數組-定長數組-變長數組 摘要 本文先介紹柔性數組成員(flexible array member)的基本使用&#xff0c;然后介紹其內存結構。最后&#xff0c;補充了一些數組相關的其他概念。 柔性數組成員 基本使用 參考: 【C語言內功修煉…

[項目設計] 從零實現的高并發內存池(一)

&#x1f308; 博客個人主頁&#xff1a;Chris在Coding &#x1f3a5; 本文所屬專欄&#xff1a;[高并發內存池] ?? 前置學習專欄&#xff1a;[Linux學習] ? 我們仍在旅途 ? 目錄 前言 項目介紹 1.內存池 1.1 什么是內存池 池化技術 內存池 1.2 為什…

word使用bib添加參考文獻

文章目錄 安裝TexLive安裝bibtex4word使用在word中添加參考文獻使用bibtex4word在word中添加參考文獻設置參考文獻格式為畢業論文格式 參考 安裝TexLive 從下載地址下載鏡像iso文件texlive2023.iso雙擊打開iso鏡像文件運行 install-tl-windows.bat點擊安裝非常非常非常耐心地安…

Shell學習 - 2.20 Shell exit命令:退出當前進程

exit 是一個 Shell 內置命令&#xff0c;用來退出當前 Shell 進程&#xff0c;并返回一個退出狀態&#xff1b;使用$?可以接收這個退出狀態&#xff0c;這一點已在《Shell $?》中進行了講解。 exit 命令可以接受一個整數值作為參數&#xff0c;代表退出狀態。如果不指定&…

Linux命令-clock命令(用于調整 RTC 時間)

說明 clock命令用于調整 RTC 時間。 RTC 是電腦內建的硬件時間&#xff0c;執行這項指令可以顯示現在時刻&#xff0c;調整硬件時鐘的時間&#xff0c;將系統時間設成與硬件時鐘之時間一致&#xff0c;或是把系統時間回存到硬件時鐘。 語法 clock [--adjust][--debug][--dir…

客戶端/服務器協議是啥意思?

客戶端/服務器協議是指在網絡通信中&#xff0c;客戶端和服務器之間進行數據傳輸時所使用的規定。簡單來說&#xff0c;客戶端是用戶使用的設備&#xff0c;如電腦或手機&#xff0c;而服務器則是提供數據或服務的遠程計算機。當客戶端需要獲取數據或服務時&#xff0c;它會向服…

【RT-DETR有效改進】結合SOTA思想利用雙主干網絡改進RT-DETR(全網獨家創新,重磅更新)

一、本文介紹 本文給大家帶來的改進機制是結合目前SOTAYOLOv9的思想利用雙主干網絡來改進RT-DETR&#xff08;本專欄目前發布以來改進最大的內容&#xff0c;同時本文內容為我個人一手整理全網獨家首發 | 就連V9官方不支持的模型寬度和深度修改我都均已提供&#xff0c;本文內…

【活動】金三銀四,前端工程師如何把握求職黃金期

隨著春意盎然的氣息彌漫大地&#xff0c;程序員群體中也迎來了一年一度的“金三銀四”求職熱潮。這個時間段對于廣大前端工程師而言&#xff0c;不僅象征著生機勃發的新起點&#xff0c;更是他們職業生涯中至關重要的轉折點。眾多知名公司在這一時期大規模開啟招聘通道&#xf…

ChatGPT 4.0使用之論文閱讀

文章目錄 閱讀環境準備打開AskYourPDF進入主站 粗讀論文直接通過右側邊框進行提問選中文章內容翻譯或概括插圖的理解 總結 擁有了GPT4.0之后&#xff0c;最重要的就是學會如何充分發揮它的強大功能&#xff0c;不然一個月20美元的費用花費的可太心疼了&#xff08;家境貧寒&…

WP外貿營銷型網站模板

WordPress外貿獨立站主題 簡潔實用的WordPress外貿獨立站主題&#xff0c;適合時尚服裝行業搭建wordpress企業官網使用。 零件配件WordPress外貿建站模板 汽車行業零配件WordPress外貿建站模板&#xff0c;賣配件、零件的外貿公司可以使用的WordPress主題。 https://www.jia…

RocketMQ—消費者的兩種消費模式

RocketMQ—消費者的兩種消費模式 RocketMQ消息消費的模式分為兩種&#xff1a;負載均衡模式和廣播模式&#xff0c;負載均衡模式表示多個消費者交替消費同一個主題里面的消息&#xff1b;廣播模式表示每個每個消費者都消費一遍訂閱的主題的消息。 負載均衡模式 CLUSTERING 集…

vue2 element 實現表格點擊詳情,返回時保留查詢參數

先直觀一點&#xff0c;上圖 列表共5條數據&#xff0c;準備輸入Author過濾條件進行查詢 進入查看詳情頁&#xff0c;就隨便搞了個按鈕 啥都沒調啦 點擊返回后 一開始準備用vuex做這個功能&#xff0c;后來放棄了&#xff0c;想到直接用路由去做可能也不錯。有時間再整一套…