1. 程式人生 > >【面經筆記】紅黑樹的特性與其在C++ STL中的應用

【面經筆記】紅黑樹的特性與其在C++ STL中的應用

AVL樹和紅黑樹適合內部儲存應用,B樹適合外部儲存應用

AVL樹和紅黑樹都是用旋轉保持平衡,AVL樹對每個插入操作最多需要兩次次旋轉(單/雙旋),對每個刪除操作最多需要O(logn)次旋轉;而紅黑樹對每個插入和刪除操作,任何不平衡都會在三次旋轉之內解決。

查詢、插入、刪除的時間均為log(n),紅黑樹的演算法時間複雜度和AVL相同,但紅黑樹的統計效能要好於平衡二叉樹,但極端效能略差。

平衡二叉樹/AVL樹:

定義:

左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值不超過1
樹的深度即log(n)。查詢、插入、刪除的時間均為log(n)

將二叉樹節點的平衡因子BF定義為該節點的左子樹的深度減去它的右子樹的深度

距離插入結點最近的,且平衡因子的絕對值大於1的結點為根的子樹,稱為最小不平衡子樹。

插入新節點,平衡操作:

最小不平衡子樹的BF與它的子樹的BF符號相同時:

  • 最小不平衡子樹根結點的平衡因子大於1時,右旋
  • 最小不平衡子樹根結點的平衡因子小於-1時,左旋

最小不平衡子樹的BF與它的子樹的BF符號相反時:

  • 先對子樹結點進行一次旋轉是的符號相同,再反向旋轉一次才能完成平衡操作。

刪除結點:

刪除一個結點q後,從根結點到q的路徑上的一些結點或者全部結點的平衡因子都改變了,刪除操作最多需要O(logn)次旋轉

紅黑樹:

滿足下列條件的二叉搜尋樹是紅黑樹

性質1. 節點是紅色或黑色
性質2. 根是黑色
性質3. 所有葉子都是黑色(葉子是Null節點)
性質4. 如果一個節點是紅的,則它的兩個兒子都是黑的
性質5. 從任一節點到其葉子的所有簡單路徑都包含相同數目的黑色節點。

這五個性質強制了紅黑樹的關鍵性質: 從根到葉子的最長的可能路徑不多於最短的可能路徑的兩倍長。為什麼呢?性質4暗示著任何一個簡單路徑上不能有兩個毗連的紅色節點,這樣,最短的可能路徑全是黑色節點,最長的可能路徑有交替的紅色和黑色節點。同時根據性質5知道:所有最長的路徑都有相同數目的黑色節點,這就表明了沒有路徑能多於任何其他路徑的兩倍長。

規則5要求新增結點為紅結點,規則4要求新節點的父節點為黑色,當新節點到達插入點,卻未能符合上述5個條件,需要調整顏色並旋轉樹形。

紅黑樹並不是平衡二叉樹,恰恰相反,紅黑樹放鬆了平衡二叉樹的某些要求,由於一定限度的“不平衡”,紅黑樹的效能得到了提升。

查詢、插入、刪除的時間均為log(n),統計效能要好於平衡二叉樹,但極端效能略差。

STL中set、multiset、map、multimap底層是紅黑樹實現的,而unordered_map、unordered_set 底層是雜湊表實現的。

multiset、multimap: 插入相同的key的時候,我們將後插入的key放在相等的key的右邊,之後不管怎麼進行插入或刪除操作,後加入的key始終被認為比之前的大

相關推薦

筆記特性與其C++ STL應用

AVL樹和紅黑樹適合內部儲存應用,B樹適合外部儲存應用 AVL樹和紅黑樹都是用旋轉保持平衡,AVL樹對每個插入操作最多需要兩次次旋轉(單/雙旋),對每個刪除操作最多需要O(logn)次旋轉;而紅黑樹對每個插入和刪除操作,任何不平衡都會在三次旋轉之內解決。 查

筆記B、B+

原文: B樹、B+樹、儲存模型 參考: B樹/多叉平衡查詢樹: 背景: B樹是為磁碟設計的多路平衡搜尋樹。一個B樹節點通常和一個完整的磁碟頁一樣大,每次查詢的結點深度(根節點其實永久儲存在主存中)即為I/O操作的次數。由於其分支

筆記深信服電話面試

接到電話我是懵逼的,因為早上睡了懶覺,剛到實驗室就來個電話。 首先問是否方便,然後說你簡歷寫了CUDA程式設計,其主要應用在了哪裡?工程中的CUDA是不是你寫的? 我說應用在三維影象處理,CUDA是我引入工程並實現的。 我發現每個公司都對CUDA很感興趣,

筆記好未來

1、 手寫二叉搜尋樹的插入、刪除 沒寫過,刪除操作完全寫錯了。 2、輸入流的頻率TOPk問題,引出堆的實現 我先實現了演算法導論中自頂向下的維護堆的函式MAX_HEAPIFY()。 面試官說不好,應該寫個自底向上的、、、、、、、、、、、、、、、、

筆記深信服電話二

三層的紅黑樹的根節點刪除後,怎麼調整 CreateThread 和_beginthreadex的區別? 什麼時候應該使用CreateThread 什麼時候應該使用_beginthreadex? CreateThread函式是windows函式,_

筆記STL

空間配置器: 為什麼不說allocator是記憶體配置器:空間不一定是記憶體,空間也可以是磁碟或其他儲存介質,你可以寫一個allocator直接向硬碟取空間。 SGI STL的配置器名為alloc,是預設的空間配置器。 雖然也定義了一個符合部分標準的all

數據結構

png 兩種 叔叔 路徑 之前 ase 技術分享 操作性 splay 一、紅黑樹的定義:   (1)根節點是黑色的,   (2)所有葉子節點上不存儲數據,並且顏色都為黑色。   (3)紅色節點相鄰的節點不能為紅色。(紅色節點鄰居節點只能是黑色節點)   (4)

資料結構05-基礎----二叉搜尋(Binary Search Tree)

目錄 1、二分法引言 2、二叉搜尋樹定義 3、二叉搜尋樹的CRUD 4、二叉搜尋樹的兩種極端情況 5、二叉搜尋樹總結 前言 在【演算法04】樹與二叉樹中,已經介紹

bzoj3227

發現 blog ret amp 這樣的 spa 兩個 include log 神TM的紅黑樹,其實本質上應該還是一種樹dp的問題…… 一開始想了一個比較裸的樹dp,後來發現還有更強的做法。 每個前端黑節點是看作一個物品,然後這就是很典型的樹形dp的問題。 不過可以這麽考慮,

算法-二叉-算法

平衡查找樹 .cn art baidu 博客 win 清晰 .com utf-8 紅黑樹-二叉樹-算法 紅黑樹查找_百度搜索(5 條消息)AVL樹,紅黑樹,B樹,B+樹,Trie樹都分別應用在哪些現實場景中? - 知乎查找(二):徹底理解紅黑樹和平衡查找樹 - @瞪著太陽

深入理解Java集合框架講解(上)

時間復雜度 row lee tel framework 關系 eight logs return 來源:史上最清晰的紅黑樹講解(上) - CarpenterLee 作者:CarpenterLee(轉載已獲得作者許可,如需轉載請與原作者聯系) 文中所有圖片點擊之後均可查看大

大部分部落格內容轉載自: https://zhuanlan.zhihu.com/p/24367771 紅黑樹的特性 紅黑樹是一種自平衡的二叉查詢樹,具有二叉查詢樹的特性外,還具有下面特性 每個節點不是紅色就是黑色的; 根節點總是黑色的; 所有的葉節點都是是黑色

資料結構

一、概念 Red-Black Tree 簡稱 R-B Tree,是一種自平衡二叉查詢樹,是在電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。 二、特性 (1)每個節點或者是黑色,或者是紅色。 (2)根節點是黑色。 (3)每個葉子節點(NIL)是黑

BZOJ3227,打表找規律/DP

傳送門 思路: 很有意思的一道題 DP思路十分顯然,我們以最小值為例 f[x][h][0/1]表示節點數為x的子樹,該樹的黑高度為h,根節點顏色為紅/黑時 f[x][h][0]=min{f[y][h][1]+f[x−y−1][h][1]}+1 f[x][

資料結構的插入(Insert)

前言:    紅黑樹是一棵二叉搜尋樹,它在每個節點上增加了一個儲存位來表示節點的顏色,可以是Red或Black。通過對任何一條從根到葉子簡單路徑上的顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡。 紅黑樹的基本概念:   紅黑樹是滿足下面紅黑性質的二叉

演算法插入資料的情況與實現(三)

大家如果有玩魔方,我相信是可以理解我說的東西的,轉魔方就是先把第一面轉出來,然後把第一面作為底面,然後根據遇見的情況來轉魔方(是有公式的) 該系列到現在暫只有3篇文章:   【演算法】紅黑樹(二叉樹)概念與查詢(一):https://blog.csdn.net/lsr40/ar

演算法插入資料(變色,左旋、右旋)(二)

本人菜雞一隻,正在更新紅黑樹系列的文章。 該系列到現在暫只有3篇文章:   【演算法】紅黑樹(二叉樹)概念與查詢(一):https://blog.csdn.net/lsr40/article/details/85230703 【演算法】紅黑樹插入資料(變色,左旋、右旋)(二

演算法(二叉)概念與查詢(一)

誒,演算法這個東西,其實沒那麼簡單,但是也沒那麼難。 紅黑樹,其實已經有很多大佬都整理過了,而且文章部落格都寫得超好,我寫這篇文章的目的是:自己整理一次,這些知識才是自己的,否則永遠是別人的~   該系列到現在暫只有3篇文章: 【演算法】紅黑樹(二叉樹)概念與查詢(一):h

資料結構(如何實現及怎樣判斷)

      紅黑樹是一顆二叉搜尋樹,它在每個節點上增加了一個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根節點到葉子節點的簡單路徑上的顏色來約束,紅黑樹保證了最長路徑不超過最短路經的兩倍,因此近似於平衡。 紅黑樹的規則: 1、每個節點不是紅色就是

演算法的講解及插入刪除演算法實現原理

【轉】【經典】 導讀:    linux核心中的使用者態地址空間管理使用了紅黑樹(red-black tree)這種資料結構,我想一定有許多人在這種資料結構上感到困惑,我也曾經為此查閱了許多資料以便了解紅黑樹的原理。最近我在一個外國網站上看到一篇 講解紅黑樹的文章,覺得相當不錯,不敢獨享,於是翻譯成中文供