数据结构的扩张(动态有序统计和区间树)笔记

对一个数据结构的扩张可以分为四个步骤:

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: 如果在左子树中查找不到,则在右子树中也不可能存在.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值