在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

B-Tree與二叉查找樹的對比

Linux閱碼場 ? 來源:未知 ? 作者:李倩 ? 2018-04-15 10:54 ? 次閱讀

什么是B-Tree

B-Tree就是我們常說的B樹,一定不要讀成B減樹,否則就很丟人了。B樹這種數據結構常常用于實現數據庫索引,因為它的查找效率比較高。

磁盤IO與預讀

磁盤讀取依靠的是機械運動,分為尋道時間、旋轉延遲、傳輸時間三個部分,這三個部分耗時相加就是一次磁盤IO的時間,大概9ms左右。這個成本是訪問內存的十萬倍左右;正是由于磁盤IO是非常昂貴的操作,所以計算機操作系統對此做了優化:預讀;每一次IO時,不僅僅把當前磁盤地址的數據加載到內存,同時也把相鄰數據也加載到內存緩沖區中。因為局部預讀原理說明:當訪問一個地址數據的時候,與其相鄰的數據很快也會被訪問到。每次磁盤IO讀取的數據我們稱之為一頁(page)。一頁的大小與操作系統有關,一般為4k或者8k。這也就意味著讀取一頁內數據的時候,實際上發生了一次磁盤IO。

B-Tree與二叉查找樹的對比

我們知道二叉查找樹查詢的時間復雜度是O(logN),查找速度最快和比較次數最少,既然性能已經如此優秀,但為什么實現索引是使用B-Tree而不是二叉查找樹,關鍵因素是磁盤IO的次數。

數據庫索引是存儲在磁盤上,當表中的數據量比較大時,索引的大小也跟著增長,達到幾個G甚至更多。當我們利用索引進行查詢的時候,不可能把索引全部加載到內存中,只能逐一加載每個磁盤頁,這里的磁盤頁就對應索引樹的節點。

一、 二叉樹

我們先來看二叉樹查找時磁盤IO的次:定義一個樹高為4的二叉樹,查找值為10:

第一次磁盤IO:

第二次磁盤IO

第三次磁盤IO:

第四次磁盤IO:

從二叉樹的查找過程了來看,樹的高度和磁盤IO的次數都是4,所以最壞的情況下磁盤IO的次數由樹的高度來決定。

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

二、B-Tree

m階B-Tree滿足以下條件:

1、每個節點最多擁有m個子樹

2、根節點至少有2個子樹

3、分支節點至少擁有m/2顆子樹(除根節點和葉子節點外都是分支節點)

4、所有葉子節點都在同一層、每個節點最多可以有m-1個key,并且以升序排列

如下有一個3階的B樹,觀察查找元素21的過程:

第一次磁盤IO:

第二次磁盤IO:

這里有一次內存比對:分別跟3與12比對

第三次磁盤IO:

這里有一次內存比對,分別跟14與21比對

從查找過程中發現,B樹的比對次數和磁盤IO的次數與二叉樹相差不了多少,所以這樣看來并沒有什么優勢。

但是仔細一看會發現,比對是在內存中完成中,不涉及到磁盤IO,耗時可以忽略不計。另外B樹種一個節點中可以存放很多的key(個數由樹階決定)。

相同數量的key在B樹中生成的節點要遠遠少于二叉樹中的節點,相差的節點數量就等同于磁盤IO的次數。這樣到達一定數量后,性能的差異就顯現出來了。

三、B樹的新增

在剛才的基礎上新增元素4,它應該在3與9之間:

四、B樹的刪除

刪除元素9:

五、總結

插入或者刪除元素都會導致節點發生裂變反應,有時候會非常麻煩,但正因為如此才讓B樹能夠始終保持多路平衡,這也是B樹自身的一個優勢:自平衡;B樹主要應用于文件系統以及部分數據庫索引,如MongoDB,大部分關系型數據庫索引則是使用B+樹實現。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 磁盤
    +關注

    關注

    1

    文章

    379

    瀏覽量

    25209
  • 二叉樹
    +關注

    關注

    0

    文章

    74

    瀏覽量

    12325

原文標題:什么是B-Tree

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    二叉查找(GIF動圖講解)

    二叉查找(Binary Search Tree),也稱二叉搜索,是指一棵空
    發表于 07-29 15:24

    基于Hash和二叉樹的路由表查找算法

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

    二叉樹層次遍歷算法的驗證

    實現二叉樹的層次遍歷算法,并對用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”創建的二叉樹進行測試。
    發表于 11-28 01:05 ?2100次閱讀
    <b class='flag-5'>二叉樹</b>層次遍歷算法的驗證

    AVL 和普通的二叉查找的詳細區別分析

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

    詳解電源二叉樹到底是什么

    作為數據結構的基礎,分很多種,像 AVL 、紅黑二叉搜索....今天我想分享的是關于二叉樹
    的頭像 發表于 06-06 15:05 ?1w次閱讀
    詳解電源<b class='flag-5'>二叉樹</b>到底是什么

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

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

    二叉樹操作的相關知識和代碼詳解

    是數據結構中的重中之重,尤其以各類二叉樹為學習的難點。在面試環節中,二叉樹也是必考的模塊。本文主要講二叉樹操作的相關知識,梳理面試常考的內容。請大家跟隨小編一起來復習吧。 本篇針對面
    的頭像 發表于 12-12 11:04 ?2051次閱讀
    <b class='flag-5'>二叉樹</b>操作的相關知識和代碼詳解

    二叉樹的前序遍歷非遞歸實現

    我們之前說了二叉樹基礎及二叉的幾種遍歷方式及練習題,今天我們來看一下二叉樹的前序遍歷非遞歸實現。 前序遍歷的順序是, 對于中的某節點,先遍歷該節點,然后再遍歷其左子樹,最后遍歷其右子
    的頭像 發表于 05-28 13:59 ?1964次閱讀

    如何修剪二叉搜索

    ? 如果不對遞歸有深刻的理解,本題有點難。單純移除一個節點那還不夠,要修剪! 669. 修剪二叉搜索 ? 給定一個二叉搜索,同時給定最小邊界L 和最大邊界 R。通過修剪
    的頭像 發表于 10-11 14:16 ?1380次閱讀

    二叉排序樹AVL如何實現動態平衡

    熟悉的二叉樹種類有二叉搜索(排序、查找)二叉平衡、伸展
    的頭像 發表于 10-28 17:02 ?1821次閱讀
    <b class='flag-5'>二叉排序樹</b>AVL如何實現動態平衡

    C語言數據結構:什么是二叉樹

    完全二叉樹:完全二叉樹是效率很高的數據結構。對于深度為K,有n個節點的二叉樹,當且僅當每一個節點都與深度為K的滿二叉樹中編號從1至n的節點一一對應時,稱為完全
    的頭像 發表于 04-21 16:20 ?2520次閱讀

    怎么就能構造成二叉樹呢?

    一直跟著公眾號學算法的錄友 應該知道,我在二叉樹:構造二叉樹登場!,已經講過,只有 中序與后序 和 中序和前序 可以確定一顆唯一的二叉樹。前序和后序是不能確定唯一的二叉樹的。
    的頭像 發表于 07-14 11:20 ?1592次閱讀

    使用C語言代碼實現平衡二叉樹

    這篇博客主要總結平衡二叉樹,所以,二叉排序樹知識不會提及,但是會用到。
    的頭像 發表于 09-21 11:00 ?1099次閱讀

    二叉樹的代碼實現

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

    C++自定義二叉樹并輸出二叉樹圖形

    使用C++構建一個二叉樹并輸出。
    的頭像 發表于 01-10 16:29 ?1755次閱讀
    C++自定義<b class='flag-5'>二叉樹</b>并輸出<b class='flag-5'>二叉樹</b>圖形
    主站蜘蛛池模板: 色橹橹| 狠狠干最新网址| 午夜h| 亚洲综合色吧| 美女h片| 亚洲精品美女| 激情婷婷六月| 国产精品99r8在线观看| 久久午夜综合久久| 国产视频第一页| 久久女人网| 黄色网址免费在线| 一级毛片免费网站| 国产清纯白嫩大学生正在播放 | 欧美午夜视频一区二区三区| 一区二区三区精品视频| 久久99热精品| 久久综合九色欧美综合狠狠| 一区二区午夜| 中文字幕二区三区| 啪啪大片| 人人干人| 在线播放国产一区| 全国男人的天堂网站| 天天干天天干| 高清不卡一区| 国产一级特黄aa级特黄裸毛片| 成人窝窝午夜看片| 婷婷欧美| 午夜无遮挡怕怕怕免费视频| 轻点太大了好深好爽h文| 免费在线黄视频| 国产在线观看午夜不卡| 五月情婷婷| 停停五月天| aaaaa国产毛片| 丁香月婷婷| 色网站免费视频| 欧美一级黄色片视频| 男女激情做爰叫床声视频偷拍| 亚洲怡红院在线|