我将按四个步骤来逐一引入到van Emde Boas树。从位图到索引位图,再到van Emde Boas原型,最后到van Emde Boas树。

位图与索引位图

  在java中有这个一个类,叫EnumSet。这个类只能存储枚举类型。枚举有个明显的特征,就是取值范围限定在有限个元素内,比如星期一到星期天可以用枚举来表示。EnumSet这个类的实现原理是位图,用每个位来表示元素是否存在,这样不仅节省了存储空间,也使得插入、删除操作性能非常高,时间复杂度为O(1)O(1)O(1)。
  但是位图存在一个缺点,就是最小值minimum、最大值maximum、前任predecessor、后任successor这四种操作操作时间复杂度比较大。
  为了提高这四种操作的性能,可以在位图上建立二叉树索引。二叉树每个节点取值只有两种,0或1。取值的依据是底层两个子节点的或运算结果,这样就可以知道子节点到底有没有某个元素。这样能更加快速地寻找最小值、最大值、前任、后任等。如下图所示,是找前任的搜索路径:

  可以看到性能比较慢啊,虽然某些情况下比在位图上按顺序检索快一点,比如上图中找O的前任。但这不是我们想要的东西。

van Emde Boas原型

  van Emde Boas原型proto van Emde Boas,是一种二进制结构。它是一种二进制结构,是在位图索引的基础上发展而来的。
  先试想一下,降低层数,会是什么样的效果。
  这种数据结构还不是是van Emde Boas原型结构。但是还不是我们最终需要的东西。但是很接近了。首先我们需要一个数组存储状态。这个新的数据结构节点有三个属性:元素最大数量,子节点统计和子节点数组。如下图所示是只存储偶数节点索引的van Emde Boas原型结构,u代表元素个数(图中是16个),s代表统计数据summary,c代表子节点数组cluster

  特别注意的是,当u=2时,由于不能继续细分,所以没有了summary和cluster属性。这已经非常接近van Emde Boas树了。
  不同的在于,proto van Emde Boas只支持元素数量为2、4、16、256。也就是按22k2^{2^k}22k进行膨胀,比如:
220=21=2221=22=4222=24=16223=28=256224=216=65536225=232=42949672962^{2^0} = 2^1=2\\ 2^{2^1} = 2^2= 4\\ 2^{2^2} = 2^{4}= 16\\ 2^{2^3} = 2^{8}= 256\\ 2^{2^4} = 2^{16}= 65536\\ 2^{2^5} = 2^{32}=4294967296 220=21=2221=22=4222=24=16223=28=256224=216=65536225=232=4294967296
  所以van Emde Boas原型结构对元素数量的要求太严苛了。如果元素数量不是这个数,就容易造成内存空间的极大浪费。那怎么办?

van Emde Boas树

  这个时候就需要对van Emde Boas继续改造,变成van Emde Boas树。van Emde Boas树的节点与van Emde Boas原型稍微有点不同。首先是节点多了两个属性min和max。min和max的处理还是有点不同。除min以外的才存储,也就是说min不会存储到任何cluster中。这样设计的目的是为了节省一点存储空间。但要注意,max还是要存的。
  此外,对于最小的尺寸为2的叶子,也是有改变的,因为有min和max两个属性,所以就不需要底层数组了。
  以u=16为例子,存储{2,3,4,5,7,14,15}这几个数据是这样的效果:

  这种结构就节省了一些存储空间。这就是我们最终要的van Emde Boas树。

java代码实现

  git 地址 https://e.coding.net/buildt/data-structure/trees.git

6.6 van Emde Boas树相关推荐

  1. BZOJ 3685: 普通van Emde Boas树( 线段树 )

    建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...

  2. 算法导论读书笔记(20)van Emde Boas树

    第五部分 高级数据结构 第20章 van Emde Boas树 van Emde Boas树支持优先队列操作以及一些其他操作,每个操作最坏情况运行时间为O(lglgn).而这种数据结构限制关键字必须为 ...

  3. van Emde Boas 树 数据结构说解

    van Emde Boas 树的定义 直观上看,vEB 树保存了一个有序的集合,并支持以 O(lglgn) 的时间复杂度在 vEB 树上进行最小最大值查询.单值存在性查询.单值前驱后继查询.单值插入维 ...

  4. 算法导论-van Emde Boas树

    van Emde Boas树 van Emde Boas树中文名不知道,所以暂且叫它v树吧.v树是一种数据结构,和二叉树.红黑树类似.一种数据结构被创建出来,肯定有其特别的优点,v树的优点就是实现数据 ...

  5. 《算法导论3rd第二十章》van Emde Boas树

    前言 前面介绍的二叉堆,红黑树以及斐波那契堆,其重要的操作都要O(lgn).当特定条件下,能否够规避Ω(lglgn)下界的限制?在本章中,我们将看到:van Emde Boas树支持优先队列操作及一些 ...

  6. 【算法学习笔记】van Emde Boas树

    参考算法导论第20章 van Emde Boas树 文章目录 1. 基本方法 1.1 直接寻址 1.2 叠加的二叉树结构 `Superimposing a binary tree structure` ...

  7. 原型 van Emde Boas 树

    (对于一些简单的数据结构,我就不写在博客上了,然而这个van Emde Boas 树是真的有问题..) 首先,先介绍在本章中n与u的用法: n:集合中当前元素的个数: u:元素可能的取值范围: 同时, ...

  8. van Emde Boas树

    van Emde Boas树支持优先队列操作以及一些其他操作,每个操作最坏运行时间为O(lg lgn),这种数据结构限制关键字必须为0~n-1的整数且无重复.     目前参数n有两个不同的用法:一个 ...

  9. bzoj 3685 普通van Emde Boas树(坑)

    3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MB Submit: 1758 Solved: 563 [Submit][Stat ...

最新文章

  1. laya 自定义组件加载错误:显示空白
  2. struts2 跳转类型 result type=chain、dispatcher、redirect
  3. ae中心点重置工具_(精品)AE从小白到大神之路(七)-AE动画—动效常见的设计方法...
  4. AngularJs 冷兵器杂谈
  5. 大数据分析机器学习(二)之直方图和多元线性回归
  6. [IE兼容性] Table 之边框
  7. 轻松实现SQL异地备份
  8. PHP使用empty检查函数返回结果时报Fatal error: Can't use function return value in write context的问题...
  9. 分支限界法时间复杂度_数据结构时间复杂度的摊还分析(均摊法)之一:基础...
  10. 多线程junit单元测试
  11. java mojo是什么_java – 为什么Maven不能找到我的定制Mojo?
  12. 云物大智题库--人工智能
  13. java中类的main方法总结
  14. 2020 数据中心机房建设方案
  15. vite报错 process is not defined
  16. 哈希表存储数据结构原理
  17. MONGODB的压力测试
  18. 忽略wx公众号网页授权域名验证
  19. 深信服X计划-云计算基础1
  20. winscp 进入mysql命令_WinSCP命令行操作

热门文章

  1. 京颐医疗云首单诞生于阿里云市场 医疗机构可自助租用HIS系统
  2. xdoj-消除类游戏
  3. SPSS的数据的测量尺度类型
  4. 短信发送需要审核模板吗?
  5. java zip 高效 解压,java实现zip的压缩和解压
  6. 英文版mysql导入导出_mysql命令行导出,导入数据库
  7. 腾讯IEG开源GAME AI SDK:自动化测试吃鸡、MOBA类游戏
  8. 每日一题之对象哈希表
  9. ST的芯片是怎么变成“渣男”的?
  10. 计算机技术在多晶体衍射中的应用,材料分析关键技术期末试题.doc