6.6 van Emde Boas树
我将按四个步骤来逐一引入到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树相关推荐
- BZOJ 3685: 普通van Emde Boas树( 线段树 )
建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...
- 算法导论读书笔记(20)van Emde Boas树
第五部分 高级数据结构 第20章 van Emde Boas树 van Emde Boas树支持优先队列操作以及一些其他操作,每个操作最坏情况运行时间为O(lglgn).而这种数据结构限制关键字必须为 ...
- van Emde Boas 树 数据结构说解
van Emde Boas 树的定义 直观上看,vEB 树保存了一个有序的集合,并支持以 O(lglgn) 的时间复杂度在 vEB 树上进行最小最大值查询.单值存在性查询.单值前驱后继查询.单值插入维 ...
- 算法导论-van Emde Boas树
van Emde Boas树 van Emde Boas树中文名不知道,所以暂且叫它v树吧.v树是一种数据结构,和二叉树.红黑树类似.一种数据结构被创建出来,肯定有其特别的优点,v树的优点就是实现数据 ...
- 《算法导论3rd第二十章》van Emde Boas树
前言 前面介绍的二叉堆,红黑树以及斐波那契堆,其重要的操作都要O(lgn).当特定条件下,能否够规避Ω(lglgn)下界的限制?在本章中,我们将看到:van Emde Boas树支持优先队列操作及一些 ...
- 【算法学习笔记】van Emde Boas树
参考算法导论第20章 van Emde Boas树 文章目录 1. 基本方法 1.1 直接寻址 1.2 叠加的二叉树结构 `Superimposing a binary tree structure` ...
- 原型 van Emde Boas 树
(对于一些简单的数据结构,我就不写在博客上了,然而这个van Emde Boas 树是真的有问题..) 首先,先介绍在本章中n与u的用法: n:集合中当前元素的个数: u:元素可能的取值范围: 同时, ...
- van Emde Boas树
van Emde Boas树支持优先队列操作以及一些其他操作,每个操作最坏运行时间为O(lg lgn),这种数据结构限制关键字必须为0~n-1的整数且无重复. 目前参数n有两个不同的用法:一个 ...
- bzoj 3685 普通van Emde Boas树(坑)
3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MB Submit: 1758 Solved: 563 [Submit][Stat ...
最新文章
- laya 自定义组件加载错误:显示空白
- struts2 跳转类型 result type=chain、dispatcher、redirect
- ae中心点重置工具_(精品)AE从小白到大神之路(七)-AE动画—动效常见的设计方法...
- AngularJs 冷兵器杂谈
- 大数据分析机器学习(二)之直方图和多元线性回归
- [IE兼容性] Table 之边框
- 轻松实现SQL异地备份
- PHP使用empty检查函数返回结果时报Fatal error: Can't use function return value in write context的问题...
- 分支限界法时间复杂度_数据结构时间复杂度的摊还分析(均摊法)之一:基础...
- 多线程junit单元测试
- java mojo是什么_java – 为什么Maven不能找到我的定制Mojo?
- 云物大智题库--人工智能
- java中类的main方法总结
- 2020 数据中心机房建设方案
- vite报错 process is not defined
- 哈希表存储数据结构原理
- MONGODB的压力测试
- 忽略wx公众号网页授权域名验证
- 深信服X计划-云计算基础1
- winscp 进入mysql命令_WinSCP命令行操作