• 第20章-van Emde Boas树 20.1-基本方法


    注意:这些基本方法有利于后续理解van Emode Boas树

    一、直接寻址

    (1)操作特点:维护一个u位的数组A[0…u-1],用来存储一个值来自全域{0,1,2,3,…u-1}的动态集合。如果值属于动态集合,那么元素A[x] = 1,否则A[x] = 0。
    (2)优缺点:虽然利用位向量的方法可以让INSERT、DELETE、MEMBER的操作运行时间为O(1),但是其余操作(MINIMUM、MAXIMUM、SUCCESSOR和PREDECESSOR)在最坏情况下仍需θ(u)的运行时间,这是因为操作需要扫描θ(u)个元素。
    (3)例子:如果一个集合只包含值0和u-1,则要查找0的后继,就需要查询1到u-2的所有结点,直到发现A[u- 1]中的1为止。

    二、叠加的二叉树结构

    位向量的全部元素组成了二叉树的叶子。内部结点中存储的位就是其两个孩子的逻辑或。
    现在使用这种树结构和未经修饰的位向量,具有最坏情况运行时间为0(u)的操作如下:
    ● 查找集合中的最小值,从树根开始,箭头朝下指向叶结点,总是走最左边包含1的结点。
    ● 查找集合中的最大值,从树根开始,箭图头朝下指向叶结点,总是走最右边包含1的结点。
    ● 查找x的后继,从x所在的叶结点开始,箭头朝上指向树根,直到从左侧进入一个结点,其右孩子结点z为1。然后从z出发,箭头朝下,始终走最左边包含1的结点。(查找以z为根的子树的最小值)
    ● 查找x的前驱,从x所在的叶结点开始,箭头朝上指向树根,直到从右侧进入一个结点,其左孩子结点z为1。然后从结点z出发箭头向下,始终走最右边包含1的结点(即查找以z为根的子树的最大值)
    在这里插入图片描述

    三、叠加的一棵高度恒定的树

    1、假设全域大小为22k,这里k是某个整数(假设为16),那么u0.5(2k)为4,反正就是个整数。我们叠加一棵度为u0.5的树,来代替上面的二叉树。
    2、在这里插入图片描述
    如图,每个内部结点存储的都是子树的逻辑或。我们为这些结点定义一个数组summary[0…u0.5-1],其中summary[i]包括A[iu0.5…(i+1)u0.5-1]比如summary[0]包括A[0…3],四个四个来的;我们这个u0.5位子数组为第i个簇。对于一个给定的值x,A[x]会出现在簇号[ ⌊x/u0.5⌋ ]中,比如3就在簇号0中。要插入x,就先置A[x]和summary[ ⌊x/u0.5⌋ ]为1。
    3、其他操作
    ●查找最小(最大)值,在summary数组中查找最左(最右)包含1的项,如summary[i],然后在第i个簇内顺序查找最左(最右)的1。
    ●查找x的后继(前驱),先在x的簇中向右(左)查找。如果发现1,则返回这个位置作为结果;否则,令i=⌊x/u0.5⌋,然后从下标i开始在summary数组中向右(左)查找。找到第一个包含1的位置就得到这个簇的下标。再在该簇中查找最左(最右)的1,这个位置的元素就是后继(前驱)。
    ●删除值x,设i=⌊x/u0.5⌋。将A[x]置为0,然后置summary[i]为第i个簇中所有位的逻辑或。
    4、代价
    在这里插入图片描述

  • 相关阅读:
    杭州购买油车流程笔记
    《区块链公链数据分析简易速速上手小册》第4章:交易数据分析(2024 最新版)
    (JVM)运行时数据区的总结以及常见大厂面试题
    Matlab之数组字符串函数汇总
    Spring整合Mybatis和Junit小案例(9)
    linux 缺少动态链接库error while loading shared libraries
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    七 项目管理
    算法竞赛进阶指南 基本算法 0x07 贪心
    【文末送书】2023年以就业为目的学习Java还有必要吗?
  • 原文地址:https://blog.csdn.net/m0_61843614/article/details/126961283