Random 什么是拉链树,它是如何工作的?

Random 什么是拉链树,它是如何工作的?,random,data-structures,binary-search-tree,skip-lists,Random,Data Structures,Binary Search Tree,Skip Lists,我听说过一种新的平衡BST数据结构,称为a。拉链树是什么?它是如何工作的?在较高的层次上,zip树是一个 随机平衡二叉搜索树 这是一种将skiplist编码为BST的方法 它使用一对称为压缩和解压缩的操作,而不是树旋转 第一个要点——zip树是随机的、平衡的BST——让人感觉到zip树在高水平上实现了什么。它是一种平衡的二叉搜索树,与treaps一样,与红/黑树不同,它使用随机化来平衡树。从这个意义上讲,zip树并不一定是平衡树,而是有很高的平衡概率 第二个要点——zip树是SkipList

我听说过一种新的平衡BST数据结构,称为a。拉链树是什么?它是如何工作的?

在较高的层次上,zip树是一个

  • 随机平衡二叉搜索树
  • 这是一种将skiplist编码为BST的方法
  • 它使用一对称为压缩和解压缩的操作,而不是树旋转
第一个要点——zip树是随机的、平衡的BST——让人感觉到zip树在高水平上实现了什么。它是一种平衡的二叉搜索树,与treaps一样,与红/黑树不同,它使用随机化来平衡树。从这个意义上讲,zip树并不一定是平衡树,而是有很高的平衡概率

第二个要点——zip树是SkipList的编码——直观地显示了zip树的来源以及为什么它们是平衡的。您可以将zip树视为采用随机化skiplist数据结构的一种方式,该数据结构支持预期时间O(logn)内的所有主要操作,并将其表示为二进制搜索树。这提供了zip树来自何处的直观信息,以及我们期望它们速度如此之快的原因

第三个要点-压缩树使用压缩和解压缩而不是树旋转-说明了压缩树的名称以及编写一个压缩树的感觉。Zip树不同于其他类型的平衡树(例如,红色/黑色树或AVL树),因为节点不是通过旋转在树周围移动,而是通过一对操作将较大的节点链转换为两个较小的链,反之亦然

本答案的其余部分将深入探讨zip树的来源、工作方式以及结构

回顾:跳过列表 为了了解zip树的来源,让我们先回顾一下另一种数据结构,即skiplist。skiplist是一种数据结构,与二进制搜索树一样,它按排序顺序存储元素集合。然而,Skiplits不是树结构。相反,skiplist的工作原理是通过链接列表的几层按排序顺序存储元素。此处显示了skiplist示例:

如您所见,元素是按排序顺序表示的。每个元素都有一个关联的高度,并且是多个等于其高度的链接列表的一部分。skiplist的所有元素都参与底层。理想情况下,大约一半的节点将位于该层之上,大约四分之一的节点将位于该层之上,大约八分之一的节点将位于该层之上,以此类推(稍后将详细介绍如何工作)

要在skiplist中进行查找,我们从最顶层开始。我们在skiplist中向前走,直到(1)找到我们正在寻找的元素,(2)找到比我们正在寻找的元素更大的元素,或者(3)到达列表的末尾。在第一种情况下,我们打开香槟并庆祝,因为我们发现了我们正在寻找的东西,没有更多的事情可做。在第二种或第三种情况下,我们已经“超过”了我们正在寻找的元素。但这没什么好担心的——事实上,这很有帮助,因为这意味着我们要寻找的必须是我们击中“超调”的节点和它前面的节点之间的节点。因此,我们将转到上一个节点,放下一层,然后从那里开始搜索

例如,我们将如何搜索47:

在这里,蓝色的边表示我们前进的方向,红色的边表示我们超越并决定下降一层的位置

关于skiplist如何工作的一个强大的直觉是,skiplist的最顶层将skiplist的其余元素划分为不同的范围,这一点我们稍后将在转换到zip树时需要用到。你可以在这里看到:

直观地说,如果我们能够跳过查看大多数元素,那么skiplist搜索将“快速”。例如,假设skiplist的倒数第二层只存储skiplist的所有其他元素。在这种情况下,遍历从第二层到最后一层的速度是遍历底层的两倍,因此我们预计从第二层到最后一层开始的查找所需时间是从底层开始的查找所需时间的一半。类似地,假设上面的层只存储下面层中的其他元素。然后在该层中搜索将花费大约一半的时间来搜索它下面的层。更一般地说,如果每个层只存储它下面层的大约一半元素,那么我们可以在搜索过程中跳过skiplist中的大量元素,从而获得良好的性能

skiplist通过使用以下规则来实现这一点:每当我们在skiplist中插入一个元素时,我们都会抛硬币直到得到头部。然后,我们将新插入节点的高度设置为最终投掷的硬币数。这意味着它有50%的机会停留在当前层中,有50%的机会移动到它上面的层中,这意味着,总的来说,大约一半的节点将只在底层中,剩下的大约一半将是该层之上的一层,剩下的大约一半将是该层之上的一层,等等

(对于那些有数学背景的人,也可以说skiplist中每个节点的高度是一个Geom(1/2)随机变量。)

下面是使用高度1将42插入上图所示skiplist的示例:

从skiplist中删除也是一个相当简单的操作:我们只需将它从碰巧存在的任何链接列表中拼接出来。这意味着,如果我们从上面的列表中删除刚才插入的42个,我们将得到与开始时相同的skiplist

可以看出,在skiplist中插入、删除或查找的预期成本是O(log)