對紅黑樹、跳表、B+樹的一些理解

文章目錄

      • 紅黑樹
        • 應用場景
      • 跳表
        • 使用場景
      • B+樹
        • 使用場景

毫無疑問數據結構是復雜的,讓人頭大的,大學時唯一掛科的就是數據結構,上學時不用心,不曉得自己的職業生涯要一直被數據結構支配。

或多或少,面試抱佛腳時,數據結構都會背一背刷一刷,HashMap的紅黑樹,Redis的跳表一個個都跑不了。

當回歸日常時,學習及理解數據結構真的有什么收益嗎

舉個例子,最近看到IO多路復用的時候,說到select,poll與epoll對比

有兩個點
1.epoll通過維護一個鏈表來記錄就緒事件,無需遍歷所有文件描述符來獲取所有就緒事件,而是通過事件通知機制,將就緒事件添加到鏈表中,epoll_wait()函數獲取所有就緒事件。

int s = socket(AF_INET, SOCK_STREAM, 0);
bind(s, ...);
listen(s, ...)int epfd = epoll_create(...);
epoll_ctl(epfd, ...); //將所有需要監聽的socket添加到epfd中while(1) {int n = epoll_wait(...);for(接收到數據的socket){//處理}
}

2.epoll通過紅黑樹來維護所有文件描述符。
在這里插入圖片描述

當我看到第2點時,反應是居然是你,真的有你,可算再次遇到你了,除了HashMap中,終于又和你體會到了鋪面而來的重逢喜悅感,另外帶著一種原來你真的挺有用的欣慰感。

紅黑樹、B+樹以及跳表這三個數據結構,之前在我心目中,地位是一樣的,需要面試的時候,對于他們我口若懸河,頭頭是道,而日常開發就是,對不起,我們好像不太認識。

紅黑樹HashMap,B+樹MySQL索引,跳表Redis跳表,我幾乎快要把他們畫等號了,背后的原理,為什么是這樣的,卻從來都想不起再去深究。

隨著開發的生涯越走越遠,我很欣慰自己沒有原地踏步,那么為什么呢?

紅黑樹

紅黑樹不算是嚴格的二叉平衡查找樹,標準的二叉平衡查找樹父子上下節點的高度最大不會超過1,為了維護這個平衡,當新增或者刪除數據時,標準的平衡二叉查找樹需要耗費更多的資源,不可避免需要進行多次旋轉。
紅黑樹使得二叉查找樹能保持大體的平衡,不至于退化成鏈表,又不至于頻繁的轉換操作,在與平衡二叉樹的時間復雜度相差不大的情況下,保證每次插入最多只需要三次旋轉就能達到平衡,實現起來也更為簡單。

紅黑樹在二叉查找樹的基礎上增加了著色和相關的性質使得紅黑樹相對平衡,從而保證了紅黑樹的查找、插入、刪除的時間復雜度最壞為O(log n)。所以紅黑樹適用于搜索,插入,刪除操作較多的情況。

應用場景

紅黑樹常用于存儲內存中的有序數據,增刪很快,內存存儲不涉及 I/O 操作。

  • HashMap
  • IO多路復用-epoll
  • Linux公平調度器

跳表

1.對有序列表查詢性能的優化。

2.跳表的基本思想是將有序鏈表分層,每個節點在不同層中擁有不同數量的前向指針。上層鏈表是下層鏈表的子集,且上層鏈表中的元素順序與下層鏈表一致。

3.通過增加指針和添加層級的方式,跳表可以實現對數級別的查找效率。

4.實現簡單

原以為除了Redis ZSet中,也不會再見到跳表了,直到看到LevelDB時,了解到其Memtable中使用的也是跳表實現。

使用場景
  • Redis zset
  • LevelDB底層數據結構

B+樹

號稱為文件系統而生的數據結構。

多路平衡二叉樹,選用B+樹最大的理由,我理解是樹的高度,高度,還是tm的高度。
B+樹只需要3層就能存儲大約2kw的數據,定位一個數據,也就是頁大的讀取IO次數,最多3,4次,換成紅黑樹或者跳表,大概需要10倍左右;
對于文件系統、數據庫的場景,需要從磁盤讀取數據,IO的耗費相對于內存來說是不可接受的。

使用場景

B+ 樹在處理磁盤I/O、范圍查詢和大數據量管理方面優勢明顯

  • 數據庫:MySQL innodb索引,PostgreSQL索引,Oracle索引等基本主流的數據庫
  • 文件系統:NTFS、ReiserFS、大名鼎鼎的HDFS等文件系統

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

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

相關文章

項目日記(1): boost搜索引擎

目錄 1. 項目相關背景 2. 搜索引擎的相關宏原理 3. 搜索引擎的技術棧和項目環境 4. 正排索引, 倒排索引, 搜索引擎具體原理 5. 編寫數據去標簽化和數據清洗的模塊parser(解析器). 1.項目相關背景 百度, 搜狗, 360等都有搜索引擎, 但是都是全網的搜索; boost是進行站內搜索…

【Java SE】 String、StringBuff和StringBuilder

🥰🥰🥰來都來了,不妨點個關注叭! 👉博客主頁:歡迎各位大佬!👈 文章目錄 1. 字符串不可變性1.1 設計不可變1.2 修改字符串創建新對象1.3 為什么字符串不可變1.4 String類設計不可變的…

在Docker中使用GPU

一、安裝nvidia-container-toolkit 總之一句話:nvidia-docker和nvidia-docker2,nvidia-container-runtime 已經被英偉達迭代了,可以認為nvidia-container-toolkit是nvidia-docker和nvidia-docker2, nvidia-container-runtime 的替…

Vue3項目練習詳細步驟(第三部分:文章分類頁面模塊)

文章分類列表 主體結構 接口文檔 文章分類列表查詢接口數據綁定 Pinia狀態管理庫 axios請求攔截器 Pinia持久化插件-persist 未登錄統一處理 添加文章分類 主體結構 接口文檔 綁定請求數據 編輯文章分類 彈框結構 數據回顯 接口文檔 綁定請求數據 刪除分類 …

前端中var、let 或 const區別

前端中var、let 或 const區別 一、前言1.var2.let3.const4.總結 一、前言 當涉及 JavaScript 中的變量聲明時,開發人員通常會面臨選擇使用 var、let 或 const。雖然它們都可以用來聲明變量,但在實際應用中,它們之間有一些重要的區別。接下來…

在window中使用HTTP服務器獲取kali的文件

文章目錄 一、在window中使用HTTP服務器獲取kali的文件1、疑問2、執行條件3、成功讀取 一、在window中使用HTTP服務器獲取kali的文件 1、疑問 有時候kali上面有的文件想傳入window但是發現不允許這樣操作那怎么辦呢?特別是在一些限制工具的比賽中想把kali的文件傳…

數字化學校渠道的建造內容

數字化學校渠道的建造內容可以用階段來區分: 1.網絡硬件為主的建造 這一階段首要重視的是學校網絡的硬件基礎建造,一起供給部分網絡根本服務,與此一起,也進行部分信息使用內容的建造,如電子閱覽室、歸納管理信息體系等…

Android 圖片加載glide庫 一次通關

前言 Glide是一個由Bumptech開發的開源圖片加載庫,專門用于Android平臺。它被廣泛應用于Android應用中,以簡化圖片加載過程,并提高性能和效率。 Glide能夠快速加載圖片,同時減少頁面加載時間和內存消耗。Glide具有強大的緩存機制…

國產操作系統上apt命令詳解 _ 統信 _ 麒麟 _ 中科方德

原文鏈接:國產操作系統上apt命令詳解 | 統信 | 麒麟 | 中科方德 Hello,大家好啊!今天給大家帶來一篇在國產操作系統上使用apt命令的詳解文章。apt(Advanced Package Tool)是Debian及其衍生發行版(如統信UOS…

網絡流量監控:解讀網絡性能的關鍵

目錄 什么是網絡流量監控? 網絡流量監控的原理 網絡流量監控的應用 AnaTraf網絡流量分析儀簡介 結語 在當今數字化時代,網絡已成為人們日常生活和商業運營的核心。隨著企業和個人對網絡的依賴程度不斷增加,確保網絡穩定性和性能已成為至…

如何在JavaScript中檢查字符串是否包含子字符串?

在JavaScript中檢查一個字符串是否包含某個子字符串是一個常見任務。本文將介紹幾種實現該功能的方法,包括傳統方法和高級算法。 使用 indexOf() 方法 最基礎和常見的方法是使用 indexOf() 方法。該方法返回字符串在另一個字符串中的起始位置,如果未找…

TPshop商城的保姆教程(windows)

提前準備 phpStudy下載:https://www.xp.cn/download.html 選擇適合自己的版本下載 TPshop商城源文件下載鏈接: https://pan.baidu.com/s/143fLrxbwe9CTMCbyx7mXJQ?pwd6666 開始安裝 安裝完phpstudy后 以管理員的身份啟動phpstudy.exe 選擇合適自己…

2024年03月 Python(六級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Python等級考試(1~6級)全部真題?點這里 一、單選題(共25題,共50分) 第1題 以下選項中,創建類正確的是?() A: class test1: def prt(self): …… B: class Mg(): def__init__(na,ag): self.na=na C: class A(): def print(self): print(“Yes”) a=A() a.print() D…

【好書推薦,持續更新~~】

書籍推薦,持續更新~~ 1.《只是為了好玩: Linux之父林納斯自傳》-- Linus Torvalds, David Diamond Linux之父Linus Torvalds的自傳,也是Linus唯一一本書。Linus以調侃的語氣講述了自己的成長經歷,在他看來,一切都是為了好玩兒&am…

【Vue】v-bind屬性綁定指令

作用:動態設置html的標簽屬性 比如:src、url、title 默認情況下是單向的 語法: v-bind:屬性名"表達式"v-bind:可以簡寫成 > : 比如,有一個圖片,它的 src 屬性值,是一個圖片地址。這個地址…

Android SDK下載安裝(_指定版本)

安裝完sdk,就可以直接使用adb命令了,如果想做app相關自動化測試,也是需要sdk環境依賴的 一、SDK下載 A:官網下載: 管內鏡像網站(推薦):https://www.androiddevtools.cn/index.html 官網:htt…

2024-5-9——給植物澆水 II

2024-5-9 題目來源我的題解方法一 雙指針 題目來源 力扣每日一題;題序:2105 我的題解 方法一 雙指針 使用兩個指針t1和t2記錄Alice和Bob當前還未澆水的植物,使用變個變量cap1和cap2表示Alice和Bob當前剩余的水量。 兩端同時澆水&#xff0…

滲透測試一些知識點

1、如果提示缺少參數,如{msg:params error},可嘗使用字典模糊測試構造參數,進一步攻擊。 2、程序溢出,int最大值為2147483647,可嘗試使用該值進行整數溢出,觀察現象。 3、403,404響…

如何使用MATLAB寫測試(2)Negative Test

如何使用MATLAB寫測試(2)Negative Test 原文:如何使用MATLAB寫測試(2)Negative Test - 知乎 (zhihu.com) 上一篇請參見 如何使用MATLAB寫測試(1) - 知乎專欄 上一篇中,我們的實習…

【YashanDB知識庫】ODBC驅動類問題定位方法

【標題】ODBC驅動類問題定位方法 【需求分類】故障分析 【關鍵字】ODBC 【需求描述】由于我們的ODBC接口目前尚不完善,經常會遇見ODBC接口能力不足導致應用功能無法運行的問題,需要定位手段確定底層是哪個接口報錯 【需求原因分析】方便一線數據庫管…