van Emde Boas树

    van Emde Boas树支持优先队列操作以及一些其他操作,每个操作最坏运行时间为O(lg lgn),这种数据结构限制关键字必须为0~n-1的整数且无重复。
    目前参数n有两个不同的用法:一个为动态集合中元素的个数,另一个为元素的可能取值范围。为避免混淆,以下用n表示集合中当前元素的个数,用u表示元素的可能取值范围,这样每个van Emde Boas树操作在O(lg lgu)时间内运行完。要存储的关键字值的全域的集合为{0,1,2,•••,u-1},u为全域的大小。

基础方法

    用一个u位的数组A[0..u-1],存储一个值来自全域{0,1,2,•••,u-1}的动态集合。若值x属于动态集合,则元素A[x]为1;否则,A[x]为0。

叠加的二叉树结构

    使用位向量上方叠加的一棵位二叉树的方法,来缩短对位向量的长扫描。位向量的全部元素组成了二叉树的叶子,并且每个内部结点为1当且仅当其子树中任一个叶结点包含1。换句话说,内部结点中存储的位就是其两个孩子的逻辑或。
    使用这种树结构的操作如下:

  • 查找集合中的最小值,从树根开始,依次指向叶结点,总是走到最左边包含1的结点。
  • 查找集合中的最大值,从树根开始,依次指向叶结点,总是走到最右边包含1的结点。
  • 查找x的后继,从x所在的叶结点开始,向上指向树根,直到从左侧进入一个结点,其右孩子结点z为1,。然后从结点z出发依次指向叶结点,始终走最左边包含1的结点。
  • 查找x的后驱,从x所在的叶结点开始,向上指向树根,直到从右侧进入一个结点,其左孩子结点z为1,。然后从结点z出发,依次指向叶结点,始终走最右边包含1的结点。
  • 插入一个值,从该叶结点到根的简单路径上每个结点都置为1。
  • 删除一个值,从该叶结点出发到根,重新计算这个简单路径上每个内部结点的位值,该值为其两个孩子的逻辑或。

叠加的一棵高度恒定的树

    叠加一棵度为√u的树,来替代位向量上方叠加的二叉树。每个内部几点存储的是其子树的逻辑或,深度为1的√u个内部结点是每组√u个值的合计。定义这些结点定义一个数组summary[0…√u-1],其中summary[i]包含1当且仅当其子数组A[i√u..((i+1)√u-1))]包含1。我们称A的这个√u位子数组为第i个簇。这种结构的操作如下:

  • 查找最大(最小)值,在summary数组中查找最左(最右)包含1的项。
  • 查找x的后驱(前驱),先在x的簇中向右(左)查找。如果发现1,则返回这个位置作为结构;否则,令i=x/√u,然后从下标i开始在summary数组中向右(左)查找。
  • 删除值x,设i=x/√u。将A[x]置为0,然后置summary[i]为第i个簇中所有位的逻辑或。

递归结构

    现在使用结构递归,每次递归都以平方根大小缩减全域。考虑一个简单的递归式:
    T(u) = T(√u) +O(1)
    要设计一个递归的数据结构,该数据结构每层递归以√u为因子缩减规模。当一个操作遍历这个数据结构时,在递归到下一层次前,其在每一层耗费常数时间。
    一个给定的值x在簇编号x/√u中,如果把x看做lgu位的二进制整数,那么簇编号x/√u由x中最高lgu/2位决定。在x簇中,x出现在位置xmod√u中,是由x中最低lgu/2位决定。定义以下一些函数:

high(x) =x / √u
low(x) =x modu
index(x,y) =xuy

    函数high(x)给出了x的簇号。函数low(x)给出了x在它自己簇的位置,y为编号中最低的lgu/2位。恒等式x=index(high(x),low(x))。这些函数中使用的u值始终为调用这些函数的数据结构的全域大小,u的值随递归结构改变。

原型van Emde Boas结构

    对于全域{0,1,2,•••,u-1},定义原型van Emde Boas结构或proto-vEB结构,记作proto-vEB(u),可以如下递归定义。每个proto-vEB(u)结构都包含一个给定全域大小的属性u。另外,它包含以下特征:

  • 如果u=2,那么它是基础大小,只包含一个两个位的数组A[0..1]。
  • 否则,对某个整数u≥4,除了全域大小u外,proto-vEB(u)还具有以下属性:
    • 一个名为summary的指针,指向一个proto-vEB(√u)结构。
    • 一个数组cluster[1..√u-1],存储√u个指针,每个指针都指向一个proto-vEB(√u)结构。

    元素x递归的存储在编号为high(x)的簇中,作为该簇中编号为low(x)的元素,这里࿱

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值