对一个数据结构的扩张可以分为四个步骤:
1. 选择基础的数据结构
2. 确定要在基础数据结构中添加那些信息
3. 严重可用基础数据结构的基本修改操作来维护这些新添加的信息的复杂度
4. 设计新的操作
动态顺序统计
OS-SELECT(x, i)
r=size[left[x]+1]
if i==r
return x
else if i<r
return OS-SELECT(left[x], i)
else return OS-SELECT(right[x], i-r)
关键点:
扩充的数据结构,对于结点 x 添加的辅助信息是以x为根的子树结点的个数。
case 1: 向左递归查找,是查找第i小的元素
case 2: 向右递归查找,是查找第i-r小的元素。因为,左子树和根结点都比右子树的key小,左子树和根结点已经有r个值,所有只需要在右子树中找到第i-r小的元素,即全局第i小的元素。
区间树
INTERVAL_SEARCH(T, i)
x=root[T]
while x!=nil[T] and i does not overlap x
if left[x] != nil[T] and max[left[x]]>=low[i]
x = left[x]
else
x = right[x]
return x
关键点:
区间树每次只能找到其中的一条满足条件的区间,对于找出所有满足条件的区间,需要找一个删一个再重新搜索,时间复杂度是O(k*log(n)) k:有k个满足条件的区间。n:有n区间结点。
case 1: 如果向右子树中查找,则在左子树中必然不存在满足条件的x(即 left[x] == nil[T] or max[left[x]]<low[i])
case 2: 如果在左子树中查找不到,则在右子树中也不可能存在.