1. 程式人生 > >OS樹和區間樹

OS樹和區間樹

動態資料統計:順序統計樹(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值