【數據結構與算法之美】紅黑樹(上):爲什麼工程中都用紅黑樹這種二叉樹?

目錄

一、什麼是“平衡二叉查找樹”?

二、如何定義一棵“紅黑樹”?

三、課後思考


一、什麼是“平衡二叉查找樹”?

1. 二叉樹中任意一個節點的左右子樹的高度相差不能大於 1。

2. 完全二叉樹、滿二叉樹其實都是平衡二叉樹,但是非完全二叉樹也有可能是平衡二叉樹。

3. AVL 樹嚴格符合平衡二叉查找樹的定義,即任何節點的左右子樹高度相差不超過 1,是一種高度平衡的二叉查找樹。

4.紅黑樹非嚴格定義的平衡二叉查找樹,它從根節點到各個葉子節點的最長路徑,有可能會比最短路徑大一倍。

5.發明平衡二叉查找樹這類數據結構的初衷是,解決普通二叉查找樹在頻繁的插入、刪除等動態更新的情況下,出現時間複雜度退化的問題。

6.平衡二叉查找樹中“平衡”的意思,其實就是讓整棵樹左右看起來比較“對稱”、比較“平衡”,不要出現左子樹很高、右子樹很矮的情況。這樣就能讓整棵樹的高度相對來說低一些,相應的插入、刪除、查找等操作的效率高一些。

7.只要樹的高度不比 log2n 大很多(比如樹的高度仍然是對數量級的),儘管它不符合我們前面講的嚴格的平衡二叉查找樹的定義,但我們仍然可以說,這是一個合格的平衡二叉查找樹;

8.平衡二叉查找樹其實有很多,比如,Splay Tree(伸展樹)、Treap(樹堆)。

二、如何定義一棵“紅黑樹”?

1.紅黑樹的英文是“Red-Black Tree”,簡稱 R-B Tree。它是一種不嚴格的平衡二叉查找樹

2.定義:紅黑樹中的節點,一類被標記爲黑色,一類被標記爲紅色,幾個要求:

1)根節點是黑色的;

2)每個葉子節點都是黑色的空節點(NIL),也就是說,葉子節點不存儲數據;

3)任何相鄰的節點都不能同時爲紅色,也就是說,紅色節點是被黑色節點隔開的;

4)每個節點,從該節點到達其可達葉子節點的所有路徑,都包含相同數目的黑色節點;

5)第二點要求“葉子節點都是黑色的空節點”,它主要是爲了簡化紅黑樹的代碼實現而設置的;

3.爲什麼說紅黑樹是“近似平衡”的?

1)平衡”的意思可以等價爲性能不退化,“近似平衡”就等價爲性能不會退化的太嚴重。

2)首先,我們來看,如果我們將紅色節點從紅黑樹中去掉,那單純包含黑色節點的紅黑樹的高度是多少呢?

3)我們現在知道只包含黑色節點的“黑樹”的高度,那我們現在把紅色節點加回去,高度會變成多少呢?

4)在紅黑樹中,紅色節點不能相鄰,也就是說,有一個紅色節點就要至少有一個黑色節點,將它跟其他紅色節點隔開。紅黑樹中包含最多黑色節點的路徑不會超過 log2n,所以加入紅色節點之後,最長路徑不會超過 2log2n,也就是說,紅黑樹的高度近似 2log2n。

5)紅黑樹的高度只比高度平衡的 AVL 樹的高度(log2n)僅僅大了一倍,在性能上,下降得並不多。這樣推導出來的結果不夠精確,實際上紅黑樹的性能更好。

三、課後思考

1.爲什麼工程中都喜歡用紅黑樹,而不是其他平衡二叉查找樹呢?

1)AVL 樹是一種高度平衡的二叉樹,所以查找的效率非常高,但是,有利就有弊,AVL 樹爲了維持這種高度的平衡,就要付出更多的代價。每次插入、刪除都要做調整,就比較複雜、耗時。所以,對於有頻繁的插入、刪除操作的數據集合,使用 AVL 樹的代價就有點高了。

2)紅黑樹只是做到了近似平衡,並不是嚴格的平衡,所以在維護平衡的成本上,要比 AVL 樹要低。

3)所以,紅黑樹的插入、刪除、查找各種操作性能都比較穩定。對於工程應用來說,要面對各種異常情況,爲了支撐這種工業級的應用,我們更傾向於這種性能穩定的平衡二叉查找樹。

4)紅黑樹是一種平衡二叉查找樹。它是爲了解決普通二叉查找樹在數據更新的過程中,複雜度退化的問題而產生的。紅黑樹的高度近似 log2n,所以它是近似平衡,插入、刪除、查找操作的時間複雜度都是 O(logn)。

5)因爲紅黑樹是一種性能非常穩定的二叉查找樹,所以,在工程中,但凡是用到動態插入、刪除、查找數據的場景,都可以用到它。不過,它實現起來比較複雜,如果自己寫代碼實現,難度會有些高,這個時候,我們其實更傾向用跳錶來替代它。

2.動態數據結構支持動態地數據插入、刪除、查找操作,除了紅黑樹,我們前面還學習過哪些呢?能對比一下各自的優勢、劣勢,以及應用場景嗎?

動態數據結構是支持動態的更新操作,裏面存儲的數據是時刻在變化的,通俗一點講,它不僅僅支持查詢,還支持刪除、插入數據。而且,這些操作都非常高效。如果不高效,也就算不上是有效的動態數據結構了。所以,這裏的紅黑樹算一個,支持動態的插入、刪除、查找,而且效率都很高。鏈表、隊列、棧實際上算不上,因爲操作非常有限,查詢效率不高。那現在你再想一下還有哪些支持動態插入、刪除、查找數據並且效率都很高的的數據結構呢?

1)哈希鏈表
優勢:高效地數據插入、刪除、隨機查找元素。
缺點:需要設計一個好的散列函數,把元素均勻分散到散列表中。
適用場景:適用於在海量數據中隨機訪問數據的場合。

2)跳錶
優勢:高效地查找、插入、刪除數據。
缺點:需要額外的空間來構建索引鏈表
適用場景:適用於需要高效查找數據的場合。

3)二叉查找樹
優勢:高效地查找、插入、刪除數據,實現簡單。
缺點:需要動態地維護左右子樹的高度平衡,否則數據查找會退化成鏈表的順序查找。
適用場景:適用於需要高效查找數據的場合。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章