這章的主要內容是通過紅黑樹的兩個擴充套件例子掌握如何對一種資料結構在原有基礎上進行擴充套件。
來為自己所用
擴充套件一種資料結構大致可以分為4個步驟:
1.選擇一種基礎資料結構.
2.確定基礎資料結構中要維護的附加資訊.
3.檢驗基礎資料結構中的基本操作能否維護附加資訊
4.設計一些新操作
它是紅黑樹的乙個修改,它可以在o(lgn)時間內確定任何的順序統計量。
相比於前面的運用快排思想的順序統計量演算法的o(n)快很多。
1.順序統計樹t只是簡單的在每個節點上儲存附加資訊一顆紅黑樹。
2.它的節點資訊為:
x.key 節點資料
x.color 節點顏色
x.p 父節點
x.left 左孩子
x.right 右孩子
x.size以x為根的子樹(包括x)的節點數附加資訊
如圖:
3.對子樹規模的維護(很重要)
我們知道在紅黑樹上的插入操作包括兩個階段:
第一階段從根開始沿樹下降,將新階段插入作為某個已有節點的孩子。
第二階段沿樹上公升,做一些變色和旋轉還原紅黑性質。
所以我們的維護也分兩個階段:
在第一階段為了維護子樹的規模,對由根到葉子的路徑上遍歷的每個一節點x,都增加x.size屬性,新增加節點的size為1,由於一條遍歷的路徑上共有o(lgn)個節點,所以維護size屬性的額外代價為o(lgn)
在第二階段,對紅黑樹結構上的改變僅僅是旋轉導致,旋轉次數至多為2,此外,旋轉是一種區域性操作,它僅僅會使兩個節點的size失效,而圍繞旋轉操作的鏈就是與這兩個節點關聯。
所以我們需在旋轉操作中增加兩行**:
y.size=x.size
x.size=x.left.size+x.right.size+1
如圖:
4.設計一些新操作:
a.找出順序統計樹t中第i小關鍵字:
x為根節點
os—select(x,i)
r=x.left.size+1
if i==r
return x
else
if i
return os-select(x.left,i)
else
return os-select(x.right,i-r)
到這裡我覺得沒必要再板磚了,下面的心領神會即可。
學完這章給我的感覺並不僅僅是對紅黑樹的擴充套件,我覺得通過這一章的學習讓我有了如何擴充套件一種資料結構的方向,它是一種思想。
第十四章 資料結構的擴張
前言 通常我們會遇到一些問題,採用一些標準的資料結構,如雙鏈表 雜湊表或二叉查詢數時,不能夠滿足操作要求,需要對這些資料結構進行擴張,新增一些額外的資訊使得能夠完成新的操作。附加的資訊需要對資料結構的某些操作進行調整,這個是非常關鍵的步驟,決定著資料結構擴張是否能夠實現。本章主要討論了紅黑樹結構的擴...
結構體(第十四章 )
目錄 一 結構體簡單執行例項 二 結構體具體使用 宣告定義 初始化訪問 三 結構陣列 四 指向結構的指標 宣告初始化 訪問一 結構體最簡單的執行例項 結構體是描述結構如何組合的主要方法。以下為建立圖書目錄的乙個簡單例項 include define maxtitle 41 define maxaut...
鬥地主AI演算法 第十四章 主動出牌 3
上一章已經排除了飛機 三帶等牌型,那麼除去炸彈王炸以外,我們只剩下單牌 對牌 三牌以及單順 雙順 三順了。首先說單牌 對牌 三牌。其邏輯基本一樣,只是出牌的個數有差別,即 如果該i牌數量滿足這種牌型要求,即先打出,計算其剩餘價值。出單牌 if clshandcarddata.value ahandc...