紅黑樹和B+樹

(一)紅黑樹

紅黑樹是一種自平衡二叉查找樹,也被稱為"對稱二叉B樹",它可以在O(logn)時間內利用 O(logn)的空間來完成查找、插入、刪除操作。紅黑樹的讀操作與普通二叉查找樹相同,而插入和刪除操作可能會破壞紅黑樹的規則,需要進行恢復操作。恢復紅黑樹的性質需要少量的顏色變更(實際是非常快速的)和不超過三次樹旋轉(對于插入操作是兩次),雖然插入和刪除很復雜,但操作時間仍可以保持為O(logn)。

紅黑樹的規則:

1.節點是紅色或和黑色
2.根節點是黑色
3.所有的葉子節點都是黑色(葉子節點是NIL節點,實際應用時可以有數據)
4.每個紅色節點必須有兩個黑色的子節點,從葉子節點到根節點不能有兩個連續的紅色節點。
5.從任意節點到每個葉子節點的簡單路徑都包含相同數量的黑色節點。
在這里插入圖片描述

(二)B+樹

(1)B+樹常用于數據庫和文件系統中,B+樹能夠保持數據穩定有序,其插入與修改擁有較穩定的對數時間復雜度。B+ 樹自底向上插入,這與二叉樹恰好相反。
(2)B+樹與B樹的主要區別:1.B+樹中只有葉子節點會帶有指向記錄的指針,而B樹所有節點都有指針,在內部節點出現的索引項不會再出現在葉子節點中。(B+樹的所有全量數據都在葉子節點,而B樹每個節點都是全量數據)2.B+樹中所有葉子節點都是通過指針連接在一起,而B樹不會。
在這里插入圖片描述

(二)兩種樹的區別

紅黑樹結構的數據常常存在于主存中,主要用于快速查找。樹的每個節點存儲的數據量比較小,cpu通過與主存少量的交互就能獲取樹的全部數據,并快速的查找到所需數據。而B+樹形式的數據常常存在于SSD或磁盤中,由于樹的深度比較小(一般3~4),能夠減少cpu于磁盤間的交互時間。

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

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

相關文章

策略模式、觀察者模式、代理模式、裝飾模式 應用場景和實現

有個大神寫的很好: 參考:設計模式學習筆記(四:策略模式) 參考:設計模式學習筆記(二:觀察者模式) 參考:設計模式學習筆記-代理模式 參考:設計模式-…

DQL、DML、DDL、DCL的概念與區別

http://blog.csdn.net/tomatofly/article/details/5949070 SQL語言的分類 SQL語言共分為四大類:數據查詢語言DQL(Data Query Language),數據操縱語言DML,數據定義語言DDL(Data Definition Language),數據…

python學習總結

1.python環境搭建方便,只需要安裝python解釋器 2.python把任意數據類型賦值給變量,不用定義類型 3.Python的整數浮點數沒有大小限制,不用擔心超過數值范圍。比如java的 int,long 4.python自帶最常用的list列表和dicitonary字典&am…

李國杰院士:國內開源社區的崛起需要一個過程

[CSDN.NET 付江/文]日前,在第二屆“龍芯杯”中國開源軟件設計大賽啟動儀式上,CSDN記者專訪了中國工程院院士、第三世界科學院院士李國杰。李國杰院士就國產基礎軟件現狀、面臨的機遇和挑戰、開源環境以及生態系統建設等話題分享了自己的看法。 打造自主…

SuperMap iObject入門開發系列之五管線屬性查詢

本文是一位好友“托馬斯”授權給我來發表的,介紹都是他的研究成果,在此,非常感謝。 管線屬性查詢功能針對單一管線圖層進行特定的條件查詢,然后將查詢結果輸出為列表,并添加點位閃爍功能,例如查詢污水管線中…

三類基于貪心思想的區間覆蓋問題

一、區間完全覆蓋問題 問題描述:給定一個長度為m的區間,再給出n條線段的起點和終點(注意這里是閉區間),求最少使用多少條線段可以將整個區間完全覆蓋。 樣例:一個長度為8的區間,可選的線段有[2,…

ubuntu 常用軟件和命令

永久修改屏幕的分辨率   sudo gedit .profile 將下面的四句話加入。.profile文件的最后   cvt 1280 768   xrandr --newmode "1280x768_60.00" 79.50 1280 1344 1472 1664 768 771 781 798 -hsync vsync   xrandr --addmode Virtual1 "1280x768_60.00&q…

Eclipse搭建Android開發環境(安裝ADT,Android4.4.2)

見:http://blog.csdn.net/zht666/article/details/29837777 使用Eclipse做Android開發,需要先在Eclipse上安裝ADT(Android Development Tools)插件。 1.安裝JDK 1.7 JDK官網http://www.oracle.com/technetwork/java/javase/downlo…

C語言 位操作簡析

位運算 前面介紹的各種運算都是以字節作為最基本位進行的。 但在很多系統程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能, 這使得C語言也能像匯編語言一樣用來編寫系統程序。 一、位運算符C語言提供了六種位運…

算法:輸入一個鏈表,輸出該鏈表中倒數第k個結點。

算法:輸入一個鏈表,輸出該鏈表中倒數第k個結點。《劍指offer》 思路加到注釋里面了; 1:兩個if判斷是否返回值為空,首個為空,沒有第k個值; 2:for循環找到倒數第k個值,返回…

Spring事務那些事兒

(一)事務的隔離級別 大家都知道事務有四個屬性,即ACID(原子性、一致性、隔離性、持久性)。這四個里面稍微難理解點的是一致性和持久性。所謂的一致性是指:事務執行前后數據的一致性狀態,例如事…

Silverlight Blend動畫設計系列八:拖放(Drag-Drop)操作與拖放行為(DragBehavior)

Silverlight & Blend動畫設計系列八:拖放(Drag-Drop)操作與拖放行為(DragBehavior) 原文:Silverlight & Blend動畫設計系列八:拖放(Drag-Drop)操作與拖放行為(DragBehavior)在Silverlight中自身并沒有提供拖放功能的相關實現,要實現拖…

mysql查詢顯示行號

見:http://blog.csdn.net/muzizhuben/article/details/49449853 使用mysql查詢顯示行號,沒有像oracle這么方便。 不過也可以通過設定變量顯示行號,例如: -- 生成 行號 select r:r1 as rowno , a.* from my_tb a ,(select r:0) b …

scanf 用法大全

關于標準庫函數scanf論壇上很多人對scanf的不太了解,導致程序出錯,我想把scanf的具體用法貼出來,希望大家可以共同進步,有什么不對的地方可以提出來。int scanf(char *format,...);這應該是scanf的標準形式。先說說關于…

深入了解Spring IoC

IoC全稱Inversion of Control即控制反轉,它還有一個別名依賴注入。spring利用Ioc容器幫我們自動構建對象及注入依賴對象,減少了對象構建與業務代碼的耦合,使得我們能夠更加高效愉快的寫bug🐞了( ̄▽ ̄)"…

軟文營銷實戰記錄

最近拜讀了徐茂權老師的《 網絡營銷決勝武器(第2版)》,下面會梳理書中的內容,記錄下以后可能會用到的軟文營銷的技巧。 一、軟文載體 1、平面媒體軟文:報紙、期刊。 2、非正式出版的基于印刷、打印形式載體的軟文:企業印刷的宣傳冊…

oracle中rownum和row_number()的區別

見:http://www.jb51.net/article/65960.htm row_number()over(partition by col1 order by col2)表示根據col1分組,在分組內部根據col2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)。 與ro…

java類加載順序

在java中類的加載、初始化都是在程序運行期完成的,雖然會稍微增加開銷,但是卻很大的增加了靈活性,我們可用在運行期間動態的去網絡或其他地方加載一個二進制流來作為程序代碼的一部分。接下來我們簡單介紹下java類加載過程。 從上圖中我們可…

dealloc不調用的情況

2019獨角獸企業重金招聘Python工程師標準>>> 1、沒有停止定時器 - (void)dealloc { [_timer invalidate]; _timer nil; } 2、VC中有代理Delegate&#xff0c;需要設置delegate的時候&#xff0c;設置為weak property (nonatomic,weak) id<ZoeEatDe…

day10-列表生成式

列表生成式即List Comprehensions&#xff0c;是Python內置的非常簡單卻強大的可以用來創建list的生成式。 1、生成一個列表 a [i for i in range(1,100) if i%21]print(list(a))或print(a)[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, …