數據結構與算法分析筆記——B樹

2020-12-04 簡單說架構

數據結構與算法分析筆記——B樹

B樹

AVL樹的特徵是,通過在插入或刪除時的微調,使得整個樹中任意節點的左子樹和右子樹之間的高度差不超過1。這樣的結果是,整棵樹的高度不至於太高。那麼,如果我們想要得到一棵更低的樹?該如何呢?合理的設想是增加每個節點的子節點數,比如說,把每個節點的子節點樹從2增加到3或5,樹的高度就會降得更低。這就是B樹的由來。把一棵M階B樹和二叉樹進行比較,有以下不同:

二叉樹中,每個節點最多有兩個子樹,而B樹中,每個節點最多有M個子樹。二叉樹中,每個節點中都存儲著一項數據,而B樹中,真正在數據都存儲在樹葉節點上,中間節點只存儲幫助找到相應樹葉的索引關鍵值。對M階B樹來說,每個中間節點如果有k個子樹,則會存儲k-1個關鍵值。每個樹葉節點中會包含L/2 到 L個數據項,每個節點中的數據項或關鍵值都和其父節點中的關鍵值存在某種關聯關係,以便於搜索。二叉樹中,樹葉節點的深度可能會相差1到2,而B樹中,每個樹葉節點都在同一層階上。比如說,如下就是一棵二叉樹到B樹的轉換:

直觀的就可以看到,B樹比二叉樹更加的矮胖。也就是說,在最壞的情況下,B樹的查找是要比二叉樹快的。但是,由於B樹所有數據都存在樹葉上,所以,二叉樹有可能直接在根節點就找到要找的數據,而B樹,則仍需要通過不斷索引,找到要找的樹葉。也就是,在查詢上來說,B樹比二叉樹更加的均衡。在插入和刪除來說,B樹必然要比二叉樹更加複雜一些。

B樹的意義——減少磁碟訪問次數

用插入和刪除時的效率來換取查詢時的平衡,B樹這樣做是否值得?我們知道,B樹這種數據結構,在資料庫、ES等許多數據存儲中間件中都有使用。所以,我們可以猜測,B樹是有意義的,且意義重大。假設現在有足夠多的數據,使得它們無法全部放到計算機的內存中,那麼,它們就必然要存儲到磁碟上。這時候,要讀取數據,就必然要去讀取磁碟。當程序涉及到磁碟IO的時候,由於磁碟讀取的時間是遠大於內存指令執行時間的,計算機每秒大約可以進行120次磁碟訪問,卻可以執行大約5億條指令。所以,這個時候,程序的運行時間就不再取決於程序表面的複雜度,而在於程序讀取磁碟的次數。B樹就剛剛好符合這樣的需求。內存中有一棵高度為n的B樹,其樹葉上,存儲的都是數據在磁碟中位置,那麼,通過若干的指令和一次磁碟訪問,就可以找到數據。又假如由於數據更多了,那麼,我們可以考慮把n和n-1層都放在磁碟中,這樣,需要的磁碟訪問次數就是2。

B樹的實現

這裡,我們只是討論B樹的某種可能的實現,以幫助我們更深入的理解B樹這種數據結構的內存含義。

關鍵值如何取

關鍵值如何取,一種可能的方式是根據子節點的值的最大值或最小值來界定。比如某個節點包含了兩個關鍵值,2和6,那麼,它就應該有三個子節點,n1,n2和n3。且有n1上的數據一定小於2,n2上的數據一定大於等於2且小於6,n3上的數據一定大於等於6。那麼,有同學可能會問,大於6的都在n3上嗎?當然不是,比如該節點向右有一個兄弟節點,也包含兩個關鍵值,10和14,並有三個子節點,n4,n5和n6。那麼,n3上的數據就應該是大於6且小於10。大於10的數據將會放到n4,n5或n6上。以上這種關鍵值的取法,適用於要存放的數據項有一個可以轉化為數字的關鍵屬性。事實上,關鍵值的取法還可以更靈活些,比如說,要存放的數據項有一個可以轉化為一個英語單詞的關鍵屬性。那麼,我們可以設計出一棵如下的B樹:

第一層用於劃分單詞的長度,某長度上的單詞較少,可以和其它合併到一起。以下若干層用於確定單詞第1到第n個字母。那麼,要尋找apple這個單詞對應的數據項,可能的索引線就會是:5 -> a -> p -> p -> l -> e -> apple。根據要存放的數據項的特徵,還可以設計出更複雜的B樹出來,總之,我們的目的就是不害怕程序的相對複雜,就是要達到減少磁碟訪問次數的目的。當然了,這樣設計出來的B樹,可能已經不是一個普通的B樹了,它可能已經具備了B樹的某些變體的特質。

最少數據項的意義

前面提到,一個M階B樹,要求所有中間節點的兒子樹在 M/2到M之間,所有樹葉節點上的數據項在 L/2到L之間。最大值的設定容易理解,最小值的設定是為什麼呢?這是為了避免B樹的退化。如果不設定最小值,在某些極端情況下,某個B樹中的節點的子樹可能會變成2,1甚至0,也就是說,該子節點退化成了一棵二叉樹。所以,最小值要求你在這樣極端情況下,要去重新規劃節點及節點中的關鍵值,以保持B樹不退化。

B+樹

B+樹相比B樹來說,主要有以下不同:

B樹中,中間節點的關鍵值總比子節點少1,而B+樹中,關鍵值和子節點樹相等。B+樹中,樹葉節點會構建成一個鍊表。也就是說,不通過其父節點,可以直接按序遍歷所有的樹葉節點。B+樹相比B樹而言,最大的一個優勢在就在於,查範圍內批量數據時,只需要確定第一條數據所在的樹葉節點,就可以通過鍊表直接定位到下一個樹葉節點。所以,資料庫採用的不是基本的B樹,而是B+樹。

相關焦點

  • b樹和b+樹有什麼不同 b樹和b+樹特點區別匯總
    > b樹和b+樹有什麼不同 b樹和b+樹特點區別匯總 b+樹和b+樹有哪些不同之處,這兩者的特徵區別具體是什麼樣的呢,在資料庫索引中,b樹和
  • 我們到底該如何學習《數據結構與算法》
    一、算法與數據結構到底是個什麼東東?在這裡我不想去解釋哪些常見的名詞了,像什麼是數據項、數據對象、元素等等這些概念。稍微有點基礎的人,對這些概念都應該很清楚,畢竟都是中國人。我主要想說一下,我們到底該如何理解數據結構與算法。1、什麼是數據結構?
  • 人工智慧算法有助於快速分析蛋白質摺疊結構
    近日,英國《自然》雜誌報導,美國哈佛大學醫學院生物學家AlQuraishi開發出新型人工智慧算法,能夠快速分析預測蛋白質三維結構,大大提高蛋白質三維結構預測的效率,將預測時間從若干小時或幾天縮短至幾毫秒
  • 阿里三面慘遭被虐,關於數據結構與算法竟然一竅不通!
    以Java為描述語言,介紹計算機編程中使用的數據結構和算法,覆蓋相應競爭性考試的主題,目的不是提供關於數據結構和算法的定理及證明,而是強調問題及其分析,講解必備知識和解題技巧。書中匯集知名IT企業經典的編程面試題目並給出解題思路,為學生應試和軟體開發人員面試提供有益指導。本書特點:所有代碼用Java實現。數據結構難點啟發思考。為每個問題列舉可能的解決辦法。
  • JAVA必須掌握的數據結構和算法
    常見的數據結構鍊表LinkedHashSet LinkedList 底層數據結構由鍊表和哈希表組成。數據的添加和刪除都較為方便,就是訪問比較耗費時間。數組ArrayList 訪問數據十分簡單,而添加和刪除數據比較耗工夫堆堆是一種圖的樹形結構,被用於實現「優先隊列",優先隊列是一種數據結構,可以自由添加數據,但取出數據時要從最小值開始按順序取出
  • 常用數據無損壓縮算法分析
    事實上,從壓縮軟體WINRAR到熟知的MP3,數據壓縮技術早已應用於各個領域。2 數據壓縮技術概述 本質上壓縮數據是因為數據自身具有冗餘性。數據壓縮是利用各種算法將數據冗餘壓縮到最小,並儘可能地減少失真,從而提高傳輸效率和節約存儲空間。 數據壓縮技術一般分為有損壓縮和無損壓縮。
  • 競品分析報告:有道雲筆記與印象筆記
    本文作者針對兩款產品——有道雲筆記和印象筆記,進行了對比分析,其中包括用戶分析、產品定位、互動設計、功能結構等方面,最後針對分析比較給出相關建議。本文選取產品定位同為辦公類應用,且知名度與活躍用戶量與有道雲筆記相當的印象筆記作為主要競品進行分析。作為一名產品初學者,我在本文中將試從主要競品的整體情況、用戶與產品定位、視覺設計、功能結構等層面進行分析,並重點討論創建筆記這一核心功能的產品交互特點。在文末,我將以提升用戶粘性、實現用戶增長為目標,提出四點改進建議。
  • 從數據結構到算法:圖網絡方法初探
    什麼是圖圖是一種常見的數據結構,用於表示對象及其之間的關係。其中,對象又稱節點(node)或頂點(vertex),關係用邊(edge)來描述。因此也催化出一系列在圖上進行數據挖掘的任務,如為用戶推薦感興趣的好友、判斷蛋白質結構、預測交通流量、檢測異常帳戶等等。但是真實圖的數據量龐大,動輒上億節點、而且內部拓撲結構複雜,很難將傳統的圖分析方法如最短路徑、DFS、BFS、PageRank 等算法應用到這些任務上。鑑於機器學習在圖像、文本領域的廣泛應用,一部分研究者嘗試將機器學習方法和圖數據結合起來,逐漸成為機器學習領域的一股熱潮。
  • 數據結構與算法-2
    回溯定義:回溯算法實際是一個類似枚舉的搜索過程,在搜索中發現原先選擇並不優或達不到目標,就返回一步嘗試別的選擇。走不通(剪枝)就退回再走的技術稱為回溯法。藉助遞歸去解決,類似DFS。定義:貪心算法又被稱為貪婪算法。
  • 產品分析|你的第二大腦——印象筆記
    本文將從以下幾個方面進行分析:用戶分析用戶調研優化方案報告總結01 用戶分析1.1 用戶畫像02 用戶調研問題列表2.1 調研目的本次用戶調研目的是針對印象筆記作為「知識管理」的使用情況,探尋用戶出現「信息囤積」的情況及其原因分析,力求尋找解決「囤積問題」的辦法,主要通過收集用戶反饋、問卷調查、語音深度訪談進行
  • 微軟、優步,老工程師告訴你哪些數據結構和算法最重要
    一位在 Uber 等科技公司工作過的開發者分享了他的一手經驗,告訴你實際工作中會用到哪些數據結構和算法。日常工作中,你經常使用算法和數據結構嗎?曾就職於 Uber 等科技公司的工程師 Gergely Orosz 提出了這樣一個問題。此外,他也注意到,越來越多的人覺得算法是無用的,並認為它們只是科技公司提出的一種強制性措施罷了。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    22機器學習 23深度學習 24數據結構和算法 25python網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰2 32深度學習必備原理與實戰3
  • 數據科學家應該知道的頂級機器學習算法
    示例算法包括邏輯回歸和反向傳播神經網絡。無監督學習在此無監督機器學習中,輸入數據未標記並且沒有已知結果。我們必須通過推導輸入數據中存在的結構來準備模型。這可能是提取一般規則。可以通過數學過程來減少冗餘。示例問題包括聚類,降維和關聯規則學習。示例算法包括Apriori算法和k-Means。半監督學習輸入數據是帶標籤和未帶標籤的示例的混合。存在期望的預測問題。
  • 資料|《常用數據挖掘算法總結及 Python 實現》
    今日資料推薦《 常用數據挖掘算法總結及 Python 實現 》這份資源非常適合相關的從業人員或大數據愛好者,該文檔總結了常用的數據挖掘的算法原理以及 Python 實踐內容,為初學者提供良好的參考資料目錄:第一部分:數據挖掘與機器學習數學基礎第二部分:機器學習概述第三部分:監督學習--分類與回歸第四部分:非監督學習--聚類與關聯分析
  • 大數據分析與數據分析的根本區別在哪裡?
    如今大數據分析和數據分析火爆,要說時機,可謂處處都是時機,關鍵要明了的一點是,大數據分析和數據分析兩者的根本區別在哪裡,只有真正了解了,才會知曉更加適合自己的領域是大數據分析師還是數據分析師。畢竟職場如戰場,時間就是生活,不容兒戲,更不容怠慢。下面我來好好告訴大家兩者的本質區別到底是什麼!大數據分析:指無法在可承受的時間範圍內用常規軟體工具進行捕捉、管理和處理的數據集合。
  • 吳信東:數據挖掘算法的經典與現代
    今天主要回顧三個方面,第一方面是數據挖掘比較有代表性的領域;第二方面是分析2006年在IEEE ICDM會議上排名前十位的數據挖掘算法;第三方面是分析2006年以後,數據挖掘兩個比較有代表性的方向。無論是模型研究還是應用,數據挖掘主要有10個代表性的領域。第一個領域是大家耳熟能詳的「分類」,主要內容是探討如何將數據進行歸類。
  • WGCNA新手入門筆記(含代碼和數據)
    其實,WGCNA用起來也沒那麼難,今天給大家分享一下新手學習WGCNA的經驗、常見問題的解決辦法,以及如何理解WGCNA分析流程中的關鍵點,以達到應用的目的。讓大家能夠入門WGCNA進行實操是我整理這一學習筆記的最終目的。筆記內容涉及到WGCNA的簡介,安裝運行,代碼解析和靈活變換,跑出的圖有什麼意義等,準備分3-4次說。
  • 2018國家電網考試備考計算機之數據結構與算法(6)
    2018國家電網考試備考計算機之數據結構與算法(6)由北京事業單位考試網提供:更多關於2018國家電網考試,計算機數據結構與算法,事業單位考試網的內容請關注北京事業單位考試網!或關注北京華圖微信公眾號(bjhuatu),事業單位培訓諮詢電話:400-010-1568。
  • 從零開始數據分析:一個數據分析師的數據分析流程 | 網際網路數據...
    數據分析過程1、探索性數據分析初步獲取的數據是雜亂無章的,通過圖表形式對數據進行整合,找尋數據之間存在的關係。2、模型選定分析通過探索性數據分析,歸納出一類甚至是多類數據模型,通過對模型再次整合,進一步分析出一定的模型。
  • 固定幾何結構的FFT算法及其FPGA實現
    FFT算法多種多樣,按數據組合方式不同一般分時域和頻域,按數據抽取方式的不同又可分為基2,基4等。各算法的優缺點視不同的制約因素而不同。FFT的實現方法也多種多樣,可以用軟體實現,也可以用硬體實現,用軟體在PC機或工作站上實現則計算速度很慢。一般多結合具體系統用硬體實現。例如用單片機或DSP實現。但是速度仍然很慢,難以與快速的A/D器件匹配。