Van Emde Boas树支持在O(lglgN)时间内进行搜索,最小,最大值,后继,前任,插入和删除操作,这比任何相关数据结构(例如优先级队列,二进制搜索树等)都要快。Proto Van Emde Boas树是类似的原型类型数据结构,但它无法实现O(lglgN)的复杂性,我们将首先学习Proto Van Emde Boas树,以基本了解Van Emde Boas树的工作原理。 N是定义树的宇宙的大小。
注意: Proto Van Emde Boas数据结构的键必须在0到n的范围内定义(n是2 2 k形式的正整数),并且在不允许重复的键时可以使用。
缩略语:
- Proto-VEB是Proto-Van Emde Boas树的缩写。
- 原始VEB( )是Proto-VEB的缩写,包含u个密钥。
对Proto-VEB树的结构有基本了解:
Proto Van Emde蟒蛇树是递归定义的数据结构,随着我们进入树中,它缩小到sqrt大小。请参阅本文以了解其基本知识。
在Proto-VEB中,我们使用位数组表示密钥是否存在,如果存在,则放置1,否则放置0。
在此,特定群集的摘要包含群集中是否存在任何密钥,如果存在至少一个密钥,则该摘要在其他位置为1或0。簇是位阵列的片段。摘要也是位数组。见下图:
原始VEB树的构建:
下图表示Proto-VEB的基本结构:
递归定义的结构有两个主要部分:
- 摘要:它是指向Proto-VEB结构的指针,该结构具有尺寸。
- 集群:它是指向Proto-VEB结构的指针的数组尺寸。
首先,我们必须了解一些函数和关键字:
- Universe size(u) :Proto-VEB结构中的键数。
- 高(x):从第一张图片中,我们可以看到,如果我们想到达键的簇,则可以将其除以 。例如,我们想知道键12的簇,然后可以将其除以是3,所以键12在第三个簇中。
高(x)=地板(x / )
- low(x):从第一个图像中,我们可以看到,如果我们想要键在集群中的位置,我们可以应用模运算x% 。例如,如果要在集群中找到7的位置,则可以应用7% = 3,即第二个簇中7的位置。
低(x)= x% )
递归构造程序:
- 基本情况:如果Universe大小为2,则它是一个基本大小,因此将不再有摘要数组,这意味着它为null,并且我们将仅存储2个键的位数组。
- 我们将递归地将摘要指定为大小的Proto-VEB树和大小的Proto-VEB 集群。
请参见下图中的u = 4 Proto-VEB结构:
这是代表算法的代码:
#include
using namespace std;
class Proto_Van_Emde_Boas {
public:
// Total number of keys
int universe_size;
// Summary
Proto_Van_Emde_Boas* summary;
// Clusters array of Proto-VEB pointers
vector clusters;
int root(int u)
{
return int(sqrt(u));
}
// Function to return cluster numbers
// in which key is present
int high(int x)
{
return x / root(universe_size);
}
// Function to return the position
// of x in cluster
int low(int x)
{
return x % root(universe_size);
}
// Function to return index form
// cluster number and position
int generate_index(int cluster, int position)
{
return cluster * root(universe_size) + position;
}
// Constructor
Proto_Van_Emde_Boas(int size)
{
universe_size = size;
// Base case
if (size <= 2) {
// Set summary to nullptr as there is no
// more summary for size 2
summary = nullptr;
// Vector of two pointers
// nullptr in starting
clusters = vector(size, nullptr);
}
else {
// Assiging Proto-VEB(sqrt(u)) to summary
summary = new Proto_Van_Emde_Boas(root(size));
// Creating array of Proto-VEB Tree pointers of size sqrt(u)
// first all nullptrs are going to assign
clusters = vector(root(size), nullptr);
// Assigning Proto-VEB(sqrt(u)) to all its clusters
for (int i = 0; i < root(size); i++) {
clusters[i] = new Proto_Van_Emde_Boas(root(size));
}
}
}
};
// Driver code
int main()
{
Proto_Van_Emde_Boas pveb(4);
}