Proto Van Emde Boas Tree  Set 2  Construction
Van Emde Boas Tree supports search, minimum, maximum, successor, predecessor, insert and delete operations in O(lglgN) time which is faster than any of related data structures like priority queue, binary search tree, etc. Proto Van Emde Boas tree is similar prototype type data structure but it fails to achieve the complexity of O(lglgN), We will learn Proto Van Emde Boas tree first to get a basic understanding of working of Van Emde Boas tree. Here N is the size of the universe over which tree is defined.
Note: Proto Van Emde Boas Data Structure’s keys must be defined over a range of 0 to n(n is positive integer of the form 2^{2k}) and it works when duplicate keys are not allowed.
Abbreviations:
 ProtoVEB is an abbreviation of ProtoVan Emde Boas tree.
 ProtoVEB() is an abbreviation for ProtoVEB containing u number of keys.
Basic Understanding of the structure of ProtoVEB Tree:
Proto Van Emde boas tree are recursively defined data structure and it shrinks to sqrt size as we go up in the tree. Please refer this article to understand the basics of it.
In ProtoVEB we use a bit array to represents whether a key is present or not, we put 1 if it is present and 0 else.
Here, the summary of a particular cluster contains whether there is any key present in a cluster if at least one key present then the summary is 1 or 0 elsewhere. Clusters are segments of a bit array. A summary is also a bit array. See the image below:
Construction of Proto VEB Tree:
Below image represents the basic ProtoVEB structure:
The recursively defined structure has two main part:
 summary: it is a pointer to ProtoVEB structure which has size.
 cluster: it is an array of pointers to ProtoVEB structures with size.
First of all, we have to understand some function and keywords:
 universe size (u) : Number of keys in ProtoVEB structure.

High(x): From the first image, we can see that if we want to reach at the cluster of the key then we can divide it with .
For example, We want to know the cluster of the key 12 then can divide it with which is 3, so key 12 is in 3^{rd} cluster.High(x) = floor( x / )

low(x): From the first image, we can see that if we want the position of the key in the cluster we can apply modulus operation x % .
For example, If you want to find a position of 7 in the cluster you can apply 7 % = 3 which is a position of 7 in 2^{nd} cluster.low(x) = x % )
Recursive Procedure of construction:
 Base case : If universe size is 2 then it is a base size so there will be nomore summary array, means it is null and we will store only bit array for 2 keys.
 We will recursively assign summary as sized ProtoVEB tree and sized ProtoVEB to all clusters.
See u=4 ProtoVEB structure in the image below:
Here is the code representing the Algorithm:
#include <bits/stdc++.h> 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 ProtoVEB pointers vector<Proto_Van_Emde_Boas*> 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<Proto_Van_Emde_Boas*>(size, nullptr); } else { // Assiging ProtoVEB(sqrt(u)) to summary summary = new Proto_Van_Emde_Boas(root(size)); // Creating array of ProtoVEB Tree pointers of size sqrt(u) // first all nullptrs are going to assign clusters = vector<Proto_Van_Emde_Boas*>(root(size), nullptr); // Assigning ProtoVEB(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); } 
Recommended Posts:
 Proto Van Emde Boas Tree  Set 3  Insertion and isMember Query
 Proto Van Emde Boas Tree  Set 6  Query : Successor and Predecessor
 Proto Van Emde Boas Tree  Set 5  Queries: Minimum, Maximum
 Van Emde Boas Tree  Set 1  Basics and Construction
 Proto Van Emde Boas Trees  Set 4  Deletion
 proto van Emde Boas Trees  Set 1 (Background and Introduction)
 Van Emde Boas Tree  Set 4  Deletion
 Van Emde Boas Tree  Set 3  Successor and Predecessor
 Van Emde Boas Tree  Set 2  Insertion, Find, Minimum and Maximum Queries
 Ukkonen's Suffix Tree Construction  Part 1
 Ukkonen's Suffix Tree Construction  Part 4
 Ukkonen's Suffix Tree Construction  Part 6
 Ukkonen's Suffix Tree Construction  Part 3
 Ukkonen's Suffix Tree Construction  Part 2
 Ukkonen's Suffix Tree Construction  Part 5
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.