一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

B-Tree與二叉查找樹(shù)的對(duì)比

Linux閱碼場(chǎng) ? 來(lái)源:未知 ? 作者:李倩 ? 2018-04-15 10:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

什么是B-Tree

B-Tree就是我們常說(shuō)的B樹(shù),一定不要讀成B減樹(shù),否則就很丟人了。B樹(shù)這種數(shù)據(jù)結(jié)構(gòu)常常用于實(shí)現(xiàn)數(shù)據(jù)庫(kù)索引,因?yàn)樗牟檎倚时容^高。

磁盤(pán)IO與預(yù)讀

磁盤(pán)讀取依靠的是機(jī)械運(yùn)動(dòng),分為尋道時(shí)間、旋轉(zhuǎn)延遲、傳輸時(shí)間三個(gè)部分,這三個(gè)部分耗時(shí)相加就是一次磁盤(pán)IO的時(shí)間,大概9ms左右。這個(gè)成本是訪問(wèn)內(nèi)存的十萬(wàn)倍左右;正是由于磁盤(pán)IO是非常昂貴的操作,所以計(jì)算機(jī)操作系統(tǒng)對(duì)此做了優(yōu)化:預(yù)讀;每一次IO時(shí),不僅僅把當(dāng)前磁盤(pán)地址的數(shù)據(jù)加載到內(nèi)存,同時(shí)也把相鄰數(shù)據(jù)也加載到內(nèi)存緩沖區(qū)中。因?yàn)榫植款A(yù)讀原理說(shuō)明:當(dāng)訪問(wèn)一個(gè)地址數(shù)據(jù)的時(shí)候,與其相鄰的數(shù)據(jù)很快也會(huì)被訪問(wèn)到。每次磁盤(pán)IO讀取的數(shù)據(jù)我們稱(chēng)之為一頁(yè)(page)。一頁(yè)的大小與操作系統(tǒng)有關(guān),一般為4k或者8k。這也就意味著讀取一頁(yè)內(nèi)數(shù)據(jù)的時(shí)候,實(shí)際上發(fā)生了一次磁盤(pán)IO。

B-Tree與二叉查找樹(shù)的對(duì)比

我們知道二叉查找樹(shù)查詢(xún)的時(shí)間復(fù)雜度是O(logN),查找速度最快和比較次數(shù)最少,既然性能已經(jīng)如此優(yōu)秀,但為什么實(shí)現(xiàn)索引是使用B-Tree而不是二叉查找樹(shù),關(guān)鍵因素是磁盤(pán)IO的次數(shù)。

數(shù)據(jù)庫(kù)索引是存儲(chǔ)在磁盤(pán)上,當(dāng)表中的數(shù)據(jù)量比較大時(shí),索引的大小也跟著增長(zhǎng),達(dá)到幾個(gè)G甚至更多。當(dāng)我們利用索引進(jìn)行查詢(xún)的時(shí)候,不可能把索引全部加載到內(nèi)存中,只能逐一加載每個(gè)磁盤(pán)頁(yè),這里的磁盤(pán)頁(yè)就對(duì)應(yīng)索引樹(shù)的節(jié)點(diǎn)。

一、 二叉樹(shù)

我們先來(lái)看二叉樹(shù)查找時(shí)磁盤(pán)IO的次:定義一個(gè)樹(shù)高為4的二叉樹(shù),查找值為10:

第一次磁盤(pán)IO:

第二次磁盤(pán)IO

第三次磁盤(pán)IO:

第四次磁盤(pán)IO:

從二叉樹(shù)的查找過(guò)程了來(lái)看,樹(shù)的高度和磁盤(pán)IO的次數(shù)都是4,所以最壞的情況下磁盤(pán)IO的次數(shù)由樹(shù)的高度來(lái)決定。

從前面分析情況來(lái)看,減少磁盤(pán)IO的次數(shù)就必須要壓縮樹(shù)的高度,讓瘦高的樹(shù)盡量變成矮胖的樹(shù),所以B-Tree就在這樣偉大的時(shí)代背景下誕生了。

二、B-Tree

m階B-Tree滿(mǎn)足以下條件:

1、每個(gè)節(jié)點(diǎn)最多擁有m個(gè)子樹(shù)

2、根節(jié)點(diǎn)至少有2個(gè)子樹(shù)

3、分支節(jié)點(diǎn)至少擁有m/2顆子樹(shù)(除根節(jié)點(diǎn)和葉子節(jié)點(diǎn)外都是分支節(jié)點(diǎn))

4、所有葉子節(jié)點(diǎn)都在同一層、每個(gè)節(jié)點(diǎn)最多可以有m-1個(gè)key,并且以升序排列

如下有一個(gè)3階的B樹(shù),觀察查找元素21的過(guò)程:

第一次磁盤(pán)IO:

第二次磁盤(pán)IO:

這里有一次內(nèi)存比對(duì):分別跟3與12比對(duì)

第三次磁盤(pán)IO:

這里有一次內(nèi)存比對(duì),分別跟14與21比對(duì)

從查找過(guò)程中發(fā)現(xiàn),B樹(shù)的比對(duì)次數(shù)和磁盤(pán)IO的次數(shù)與二叉樹(shù)相差不了多少,所以這樣看來(lái)并沒(méi)有什么優(yōu)勢(shì)。

但是仔細(xì)一看會(huì)發(fā)現(xiàn),比對(duì)是在內(nèi)存中完成中,不涉及到磁盤(pán)IO,耗時(shí)可以忽略不計(jì)。另外B樹(shù)種一個(gè)節(jié)點(diǎn)中可以存放很多的key(個(gè)數(shù)由樹(shù)階決定)。

相同數(shù)量的key在B樹(shù)中生成的節(jié)點(diǎn)要遠(yuǎn)遠(yuǎn)少于二叉樹(shù)中的節(jié)點(diǎn),相差的節(jié)點(diǎn)數(shù)量就等同于磁盤(pán)IO的次數(shù)。這樣到達(dá)一定數(shù)量后,性能的差異就顯現(xiàn)出來(lái)了。

三、B樹(shù)的新增

在剛才的基礎(chǔ)上新增元素4,它應(yīng)該在3與9之間:

四、B樹(shù)的刪除

刪除元素9:

五、總結(jié)

插入或者刪除元素都會(huì)導(dǎo)致節(jié)點(diǎn)發(fā)生裂變反應(yīng),有時(shí)候會(huì)非常麻煩,但正因?yàn)槿绱瞬抛孊樹(shù)能夠始終保持多路平衡,這也是B樹(shù)自身的一個(gè)優(yōu)勢(shì):自平衡;B樹(shù)主要應(yīng)用于文件系統(tǒng)以及部分?jǐn)?shù)據(jù)庫(kù)索引,如MongoDB,大部分關(guān)系型數(shù)據(jù)庫(kù)索引則是使用B+樹(shù)實(shí)現(xiàn)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 磁盤(pán)
    +關(guān)注

    關(guān)注

    1

    文章

    390

    瀏覽量

    25825
  • 二叉樹(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12636

原文標(biāo)題:什么是B-Tree

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    二叉查找樹(shù)(GIF動(dòng)圖講解)

    二叉查找樹(shù)(Binary Search Tree),也稱(chēng)二叉搜索樹(shù),是指一棵空
    發(fā)表于 07-29 15:24

    基于Hash和二叉樹(shù)的路由表查找算法

    基于Hash和二叉樹(shù)的路由表查找算法 :提出了一種基于Hash和樹(shù)的路由表查找算法,這一算法可以滿(mǎn)足()C-768的轉(zhuǎn)發(fā)要求,支持超過(guò)
    發(fā)表于 02-22 17:06 ?35次下載

    二叉樹(shù)層次遍歷算法的驗(yàn)證

    實(shí)現(xiàn)二叉樹(shù)的層次遍歷算法,并對(duì)用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”創(chuàng)建的二叉樹(shù)進(jìn)行測(cè)試。
    發(fā)表于 11-28 01:05 ?2218次閱讀
    <b class='flag-5'>二叉樹(shù)</b>層次遍歷算法的驗(yàn)證

    AVL 樹(shù)和普通的二叉查找樹(shù)的詳細(xì)區(qū)別分析

    那 AVL 樹(shù)和普通的二叉查找樹(shù)有何區(qū)別呢?如圖,如果我們插入的是一組有序上升或下降的數(shù)據(jù),則一棵普通的二叉
    的頭像 發(fā)表于 01-15 14:36 ?6169次閱讀
     AVL <b class='flag-5'>樹(shù)</b>和普通的<b class='flag-5'>二叉</b><b class='flag-5'>查找</b><b class='flag-5'>樹(shù)</b>的詳細(xì)區(qū)別分析

    詳解電源二叉樹(shù)到底是什么

    作為數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),樹(shù)分很多種,像 AVL 樹(shù)、紅黑樹(shù)、二叉搜索樹(shù)....今天我想分享的是關(guān)于二叉樹(shù)
    的頭像 發(fā)表于 06-06 15:05 ?1.1w次閱讀
    詳解電源<b class='flag-5'>二叉樹(shù)</b>到底是什么

    紅黑樹(shù)(Red Black Tree)是一種自平衡的二叉搜索樹(shù)

    平衡(Balance):就是當(dāng)結(jié)點(diǎn)數(shù)量固定時(shí),左右子樹(shù)的高度越接近,這棵二叉樹(shù)越平衡(高度越低)。而最理想的平衡就是完全二叉樹(shù)/滿(mǎn)二叉樹(shù),高度最小的二叉樹(shù)。
    的頭像 發(fā)表于 07-01 15:05 ?6194次閱讀
    紅黑<b class='flag-5'>樹(shù)</b>(Red Black <b class='flag-5'>Tree</b>)是一種自平衡的<b class='flag-5'>二叉</b>搜索<b class='flag-5'>樹(shù)</b>

    二叉樹(shù)操作的相關(guān)知識(shí)和代碼詳解

    樹(shù)是數(shù)據(jù)結(jié)構(gòu)中的重中之重,尤其以各類(lèi)二叉樹(shù)為學(xué)習(xí)的難點(diǎn)。在面試環(huán)節(jié)中,二叉樹(shù)也是必考的模塊。本文主要講二叉樹(shù)操作的相關(guān)知識(shí),梳理面試??嫉膬?nèi)容。請(qǐng)大家跟隨小編一起來(lái)復(fù)習(xí)吧。 本篇針對(duì)面
    的頭像 發(fā)表于 12-12 11:04 ?2263次閱讀
    <b class='flag-5'>二叉樹(shù)</b>操作的相關(guān)知識(shí)和代碼詳解

    二叉樹(shù)的前序遍歷非遞歸實(shí)現(xiàn)

    我們之前說(shuō)了二叉樹(shù)基礎(chǔ)及二叉的幾種遍歷方式及練習(xí)題,今天我們來(lái)看一下二叉樹(shù)的前序遍歷非遞歸實(shí)現(xiàn)。 前序遍歷的順序是, 對(duì)于樹(shù)中的某節(jié)點(diǎn),先遍歷該節(jié)點(diǎn),然后再遍歷其左子樹(shù),最后遍歷其右子
    的頭像 發(fā)表于 05-28 13:59 ?2176次閱讀

    如何修剪二叉搜索樹(shù)

    ? 如果不對(duì)遞歸有深刻的理解,本題有點(diǎn)難。單純移除一個(gè)節(jié)點(diǎn)那還不夠,要修剪! 669. 修剪二叉搜索樹(shù) ? 給定一個(gè)二叉搜索樹(shù),同時(shí)給定最小邊界L 和最大邊界 R。通過(guò)修剪
    的頭像 發(fā)表于 10-11 14:16 ?1573次閱讀

    二叉排序樹(shù)AVL如何實(shí)現(xiàn)動(dòng)態(tài)平衡

    熟悉的二叉樹(shù)種類(lèi)有二叉搜索(排序、查找)樹(shù)、二叉平衡樹(shù)、伸展
    的頭像 發(fā)表于 10-28 17:02 ?2086次閱讀
    <b class='flag-5'>二叉排序樹(shù)</b>AVL如何實(shí)現(xiàn)動(dòng)態(tài)平衡

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu):什么是二叉樹(shù)?

    完全二叉樹(shù):完全二叉樹(shù)是效率很高的數(shù)據(jù)結(jié)構(gòu)。對(duì)于深度為K,有n個(gè)節(jié)點(diǎn)的二叉樹(shù),當(dāng)且僅當(dāng)每一個(gè)節(jié)點(diǎn)都與深度為K的滿(mǎn)二叉樹(shù)中編號(hào)從1至n的節(jié)點(diǎn)一一對(duì)應(yīng)時(shí),稱(chēng)為完全
    的頭像 發(fā)表于 04-21 16:20 ?3669次閱讀

    怎么就能構(gòu)造成二叉樹(shù)呢?

    一直跟著公眾號(hào)學(xué)算法的錄友 應(yīng)該知道,我在二叉樹(shù):構(gòu)造二叉樹(shù)登場(chǎng)!,已經(jīng)講過(guò),只有 中序與后序 和 中序和前序 可以確定一顆唯一的二叉樹(shù)。前序和后序是不能確定唯一的二叉樹(shù)的。
    的頭像 發(fā)表于 07-14 11:20 ?1863次閱讀

    使用C語(yǔ)言代碼實(shí)現(xiàn)平衡二叉樹(shù)

    這篇博客主要總結(jié)平衡二叉樹(shù),所以,二叉排序樹(shù)知識(shí)不會(huì)提及,但是會(huì)用到。
    的頭像 發(fā)表于 09-21 11:00 ?1392次閱讀

    二叉樹(shù)的代碼實(shí)現(xiàn)

    二叉樹(shù)的主要操作有遍歷,例如有先序遍歷、中序遍歷、后序遍歷。在遍歷之前,就是創(chuàng)建一棵二叉樹(shù),當(dāng)然,還需要有刪除二叉樹(shù)的算法。
    的頭像 發(fā)表于 01-18 10:41 ?1480次閱讀
    <b class='flag-5'>二叉樹(shù)</b>的代碼實(shí)現(xiàn)

    C++自定義二叉樹(shù)并輸出二叉樹(shù)圖形

    使用C++構(gòu)建一個(gè)二叉樹(shù)并輸出。
    的頭像 發(fā)表于 01-10 16:29 ?2037次閱讀
    C++自定義<b class='flag-5'>二叉樹(shù)</b>并輸出<b class='flag-5'>二叉樹(shù)</b>圖形