让我们考虑下面的问题陈述,并为它考虑不同的解决方案。
给定一组元素S ,使得元素取自宇宙{0,1,…。 u-1},可以有效地执行以下操作。
- insert(x):将项x添加到set + S中。
- isEmpty():如果S为空,则返回true,否则返回false。
- find(x):如果x存在于S中,则返回true,否则返回false。
- insert(x):将项x插入S。
- delete(x):从S删除项目x。
- max():从S返回最大值。
- min():从S返回最小值。
- successor(x):返回S中大于x的最小值。
- predecessor(x):返回S中小于x的最大值。
不同的解决方案
下面是上述问题的不同解决方案。
- 解决上述问题的一种解决方案是使用自平衡二叉搜索树,例如红黑树,AVL树等。使用此解决方案,我们可以在O(Log n)时间执行所有上述操作。
- 另一种解决方案是使用Binary Array(或Bitvector) 。我们创建一个大小为u的数组,并将元素的存在和不存在分别标记为1或0。此解决方案在O(1)时间内支持insert(),delete()和find(),但在最坏的情况下其他操作可能要花费O(u)的时间。
- Van Emde Boas树(或vEB树)在O(Log Log u)时间内支持insert(),delete,find(),successor()和predecessor()操作,并在O(1)中支持max()和min()时间。注意:在BST解决方案中,我们用n表示时间复杂度,这里我们用u表示时间复杂度。因此,当u比n大得多时,Van Emde Boas树可能不适合。
背景(将二进制树结构叠加在二进制数组解决方案上)
在二进制数组解决方案的情况下,max(),min(),successor()和predecessor()的时间复杂度很高。这个想法是通过在其上叠加一个二叉树结构来减少这些操作的时间复杂性。
以上结构说明:
- 二叉树的叶子代表二叉数组的条目。
- 如果内部节点的任何子节点的值都为1,则内部节点的值为1,即,内部节点的值是其子节点的所有值的按位或。
通过上述结构,我们优化了max(),min(),successor()和predecessor()以使其时间复杂度为O(Log u)。
- min():从根开始,并使用以下规则遍历到叶子。遍历时,始终选择最左边的孩子,即查看左边的孩子是否为1,转到左边的孩子,否则转到右边的孩子。我们以这种方式到达的叶节点是最小的。
由于我们使用u个叶子穿越二叉树的高度,因此时间复杂度降低为O(Log u) - max():类似于min()。而不是留孩子,我们更喜欢紧身孩子。
- successor(x):从索引为x的叶节点开始,向根行进,直到到达节点z,其正确的子节点为1,并且直到现在为止都不在同一条路径上。在z处停止并向下移动到最左边的节点,其值为1。
- predecessor():此操作类似于后继。在这里,我们在后继者()中将left替换为right,将right替换为left。
- find()仍然是O(1),因为我们仍然拥有二进制数组。 insert()和delete()现在为O(Log u),因为我们需要更新内部节点。在插入的情况下,我们将相应的叶子标记为1,我们向上遍历,如果祖先为0,则将其祖先更新为1。
范·埃姆德·博阿斯树
我们已经看到,将二进制树叠加在二进制数组上可以降低max(),min(),successor()和predecessor()到O(Log u)的时间复杂度。我们可以将此时间复杂度进一步降低到O(Log Log u)吗?
这个想法是在不同的层次上有不同的程度。根节点(第一层)涵盖整个宇宙。第二层的每个节点(紧邻根节点)覆盖了u 1/2个Universe元素。第三层的每个节点都覆盖u 1/4个元素,依此类推。
通过上面的递归结构,我们可以使用下面的递归来获得操作的时间复杂性。
T(u) = T(√u) + O(1)
Solution of this recurrence is,
T(u) = O(Log Log u)
Refer this for detailed steps to
get the above result.
proto van Emde Boas Tree的递归定义:
令u = 2 2 k是某个k> = 0的宇宙的大小。
- 如果u = 2,则它是bais大小树,仅包含大小为2的二进制数组。
- 否则分裂成宇宙Θ(U 1/2)大小Θ的块(U 1/2)的每个,并添加一个摘要结构到顶部。
我们使用背景技术中描述的方法执行所有查询。
在这篇文章中,我们介绍了将树结构叠加在Binary Array上的想法,以使树的不同级别的节点具有不同的程度。我们很快将在接下来的讨论中讨论以下内容。
1)详细表示。
2)如何优化max()和min()在O(1)中工作?
3)执行以上操作。
资料来源:
http://www-di.inf.puc-rio.br/~laber/vanEmdeBoas.pdf
http://web.stanford.edu/class/cs166/lectures/14/Small14.pdf