紅黑樹的時間複雜度分析

一、紅黑樹的基本屬性。

  1. 紅黑樹的每個結點,要麼是黑色,要麼是紅色,不可能是黃色或其它顏色。
  2. 根結點(root)一定是黑色,簡稱爲黑頭。
  3. 所有紅色結點不可以直接相鄰。 也即是,如果一個結點爲紅色,那麼,它的爸爸或兒子,一定就是黑色,不可是紅色。符合,綠帽定律。
  4. 所有空結點,都是黑色。所謂的空結點,就是當紅黑樹的某一個葉子結點下,沒有其它結點,那麼這個結點,就是空結點,用NILNULL 表示。
  5. 從任意結點出發,到其某個子結點的空結點,所經過的黑結點數量,總是相同的。(維基上的原文:Every path from a given node to any of its descendant NIL nodes contains the same number of black nodes.)

二、基礎概念。

1、空結點,即值爲NILNULL的結點,
2、親子結點,跟某一根結點,直接相連接的兩個結點,稱作親子結點。
3、h(x),即樹的高度
4、bh(x) , 全稱是Black Height(x) ,是指結點x所在的位置的黑樹的高度。聽起來,有點抽象,讓我們來看一張圖片。以結點10爲例, x = 10時, BH(x) = BH(10) = 2。這個2是怎麼來的呢?從結點10開始數起(不包含起始結點),到空結點爲止。5是黑色結點,NIL也是黑色結點。所以,BH(10) = 2。同理,我們再舉一個例子,結點9,當 x = 9時,BH(x) = BH(9) = 1(不包含起始結點),NIL是黑色結點,所以,BH(9) = 1。現在,你應該清楚的瞭解了什麼是BH(即黑樹的高度)。

在這裏插入圖片描述

三、通過歸納法論證紅黑樹的時間複雜度爲Olog(n)。

通過對紅黑樹的大量研究,人們發現這麼一個規律,以結點x爲根結點的子樹,至少包含,2bh(x)-1個內結點。這個規律是通過,大量的研究,總結出來的。但規律,畢竟只是規律,必須通過證明,才能確定是正確的。Loosely Speaking,我們把這種歸納出來的,需要被證明的規律,稱爲引理。把經過證明的引理,稱爲定理。接下來,讓我們來證明這個引理。在證明的過程,我們依據由簡入繁的思路,步步爲營。

引理:結點x的子樹至少包含2bh(x)-1個內結點。

證明過程:

  1. 首先,我們來證明一種比較簡單的情況,即h(x) = 0 。當結點x包含的子結點爲0時,這個結點一定是空結點NIL。而且,空結點的黑樹高度,也必然爲0(結點本身不計數),即當h(x) =0時,bh(x) = 0也必然成立。因爲上述的描述是必然正確的(不信者,可自代實數以驗之),所以,如果引理是正確的,引理一定會滿足以上的條件,讓我們將這種情況,代入到引理中:

    當h(x) = bh(x) = 0 時,2bh(x) - 1 = 2h(x) - 1 = 20 - 1 = 1 - 1 = 0。綜上所述,當h(x) = bh(x) = 0 時,引理是正確的。

  2. 接下來,我們證明h(x) > 0的情況。當h(x) > 0時,意味着結點x一定是個葉子結點,每一個葉子結點,都擁有左右兩棵子樹(或空結點)。 那麼,結點x的左右子樹兩邊的黑高,要麼是bh(x),要麼是bh(x)-1。這取決於,結點x的親子結點的顏色。如果親子結點是紅色,就是bh(x)-1。如果是黑色,即是bh(x)。因爲如果是親子結點是紅色的,不計入黑高。根據歸納法,每一個子樹至少包含(2bh(x)-1 - 1) 個結點。所以,結點x至少包含,左樹結點 + 右樹結點 + x結點本身,個結點

    綜上所述,我們可以得到如下公式:(2bh(x)-1 - 1) + (2bh(x)-1 - 1) + 1 = 2bh(x) - 1。其中,第一個括號代表左子樹,第二個代表右子樹,最後的+1代表結點x本身。

  3. 根據1和2的論證,我們可以知道,某個結點x,至少會包含 2bh(x) -1 個結點。我們設總結點數爲N,則 N ≥ 2bh(x)-1。 接下來就是變形的過程:

    已知,N ≥ 2bh(x)-1
    所以, N + 1 ≥ 2bh(x)
    所以,log2(N +1) ≥ bh(x)

  4. 根據紅黑樹的第三個屬性,紅色結點不可以直接相鄰。所以,從某一個根結點到其任意一個空結點NIL的任意路徑上(這句話的意思是指h(x),即樹的高度),黑色結點的數量(這句指的是bh(x)),至少包含一半及以上。即,bh(x) ≥ h(x)/2。 讓我們把這句,代入論述3裏面的公式,可得:

    log2(N +1) ≥ bh(x) ≥ h(x)/2,
    兩邊同時,乘以2,得 2log2(N+1) ≥ h(x)。
    所以,h(x) ≤ 2log2(N+1)。
    因爲,當N+1趨於無限大時,2log2(N+1)與lg(N),只相差一個常數。
    所以,h(x) ≤ 2log2(N+1),等價於h(x) ≤ lg(N),也等價於log(N)。
    也即是,Olog(N)或Olog(n)。

【看不懂爲什麼,log2(N)==lg(N)==log(N)的,可以查看,博文最底部的注1】

四、總結。

學習紅黑樹的複雜度,需要了解算法、紅黑樹、對數函數、指數函數和數學歸納法的一些基本概念。其中任何知識點的不熟悉,都會對整個論證過程,造成障礙。最後,感謝各位的閱讀,要是還有什麼疑問,可以留言提出。


【注1】:

這裏爲什麼要,強調或是O(lgn)呢?因爲在算法領域,當log的底數一定時,當n趨於無限大時,兩者的結果都是一個常數,只是兩者存在一個倍數差而已。所以,在研究算法時,這底數是可以忽略掉。打比方說:O(n+100000),我們會簡單的看成O(n),一樣的道理。這表達的是一種極限思維。不理解這點的,可以再私聊我詳聊,這裏不再贅述。


【參考資料】

1、維基百科-紅黑樹。
2、Red-Black Trees。

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