OS樹和區間樹
阿新 • • 發佈:2019-01-27
動態資料統計:順序統計樹(Order-statistic tree)
資料結構:
紅黑樹+每個結點儲存子樹的大小
基本操作:
OS_SELECT(x,i) r = size[left[x]]+1; //先計算x的處於的位置 if i = r //x正好是第i小的關鍵字 then return x; else if i < r //x比第i關鍵字大,則在其左子樹查詢 then return OS_SELECT(left[x],i) else return OS_SELECT(right[x],i-r) //x比第i關鍵字小,則在其右子樹查詢
OS_RANK(T,x)
r = size[left[x]]+1; //獲取以x為根子樹中x的位置(中序遍歷)
y = x;
while y != root[T] //從下向上直到根節點
do if y = right[p[y]] //如果是右子樹
then r = r + size[left[p[y]]]+1;
y = p[y]; //向上移動
return r;
OS樹的維護(插入、刪除):
①修改經過結點的size屬性
②維護紅黑樹過程中,旋轉時改變結點的size屬性
區間樹(Interval tree)
資料結構:
紅黑樹+每個結點儲存區間[low, high]+每個結點儲存子樹中區間端點的最大值
新增操作:找到一個與區間i重疊的區間
①如果向右遞迴,說明左邊沒有符合條件的
因為如果向右遞迴,說明left.max > i.low
②如果左邊沒有找到符合條件的,那麼右邊肯定也沒有
設擁有left.max的那個區間為j。這說明i.high < j.low,所以右邊也沒有
區間樹的維護(插入、刪除):
維護max值,維護紅黑樹旋轉操作維護max值