📌  相关文章
📜  Proto Van Emde蟒蛇树|套装2 |建造

📅  最后修改于: 2021-04-17 09:43:41             🧑  作者: Mango

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形式的正整数),并且在不允许重复的键时可以使用。

缩略语:

  1. Proto-VEB是Proto-Van Emde Boas树的缩写。
  2. 原始VEB( \sqrt{u} )是Proto-VEB的缩写,包含u个密钥。

对Proto-VEB树的结构有基本了解:
Proto Van Emde蟒蛇树是递归定义的数据结构,随着我们进入树中,它缩小到sqrt大小。请参阅本文以了解其基本知识。

在Proto-VEB中,我们使用位数组表示密钥是否存在,如果存在,则放置1,否则放置0。

在此,特定群集的摘要包含群集中是否存在任何密钥,如果存在至少一个密钥,则该摘要在其他位置为1或0。簇是位阵列的片段。摘要也是位数组。见下图:

van emde boas树的基本结构

原始VEB树的构建:

下图表示Proto-VEB的基本结构:

范·恩德·博阿斯树

递归定义的结构有两个主要部分:

  1. 摘要:它是指向Proto-VEB结构的指针,该结构具有\sqrt{u}尺寸。
  2. 集群:它是指向Proto-VEB结构的指针的数组\sqrt{u}尺寸。

首先,我们必须了解一些函数和关键字:

  1. Universe size(u) :Proto-VEB结构中的键数。
  2. 高(x):从第一张图片中,我们可以看到,如果我们想到达键的簇,则可以将其除以\sqrt{u}例如,我们想知道键12的簇,然后可以将其除以\sqrt{16}是3,所以键12在第三个簇中。

    高(x)=地板(x / \sqrt{u} )

  3. low(x):从第一个图像中,我们可以看到,如果我们想要键在集群中的位置,我们可以应用模运算x% \sqrt{u}例如,如果要在集群中找到7的位置,则可以应用7% \sqrt{16} = 3,即第二个簇中7的位置。

    低(x)= x% \sqrt{u} )

递归构造程序:

  1. 基本情况:如果Universe大小为2,则它是一个基本大小,因此将不再有摘要数组,这意味着它为null,并且我们将仅存储2个键的位数组。
  2. 我们将递归地将摘要指定为\sqrt{u}大小的Proto-VEB树和\sqrt{u}大小的Proto-VEB \sqrt{u}集群。

请参见下图中的u = 4 Proto-VEB结构:
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);
}