区间树
概念:
区间树是在红黑树基础上进行扩展得到的支持以区间为元素的动态集合的操作,
每个节点的关键值是区间的左端点。通过建立这种特定的结构,可是使区间的元素的查找和插入都可以在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