概念:
區間樹是在紅黑樹基礎上進行擴展得到的支持以區間為元素的動態集合的操作,
每個節點的關鍵值是區間的左端點。通過建立這種特定的結構,可是使區間的元素的查找和插入都可以在O(lgn)的時間內完成。
相比於基礎的數據結構,增加了一個max[x],即以x為根的子樹中所有區間的斷點的最大值
區間樹如下圖所示:
區間查找
實現INTERVAL-SEARCH(T, i),返回一個和區間i重疊的區間,若無,則返回nil[T]。基本思想是我們通過左子樹的max進行划分:如果左子樹的max值小於low[i],則左 子樹不存在這樣的區間和i重疊,轉到右子樹;否則,轉到右子樹,因為左子樹的端點小於右子樹,若左子樹無可能,右子樹也必然不可能。
INTERVAL-SEARCH(T, i)整個過程如下:
- INTERVAL-SEARCH(T, i)
- x ← root[T]
- while x≠nil[T] and i does not overlap x //當要查找的區域和當前節點沒有重疊
- do if left[x]≠nil[T] and max[left[x]]≥low[i] //如果當前節點左子樹的max大於查抄區域的下限
- then x ← left[x] //則從左子樹查找
- else x ← right[x] //否則從右子樹查找
- return x
每次調用,必定會下降一層,故INTERVAL-SEARCH的時間復雜度為O(lgn)。
參考文獻:
http://blog.csdn.net/zhanglei8893/article/details/6534848