跳台的全名称为跳台,称为跳台,简称为跳台。跳线是随机数据结构。从本质上讲,这是一个有序链接列表,可以在dual -point search.multi-级索引中添加到原始订购链接列表中,可以通过索引快速找到。还可以提高插入和删除操作的性能。
跳过列表(跳跃列表)此随机数据结构可以视为二进制树的变体。就性能而言,它类似于红树和黑树和AVL树。但是,要简单得多。目前,REDIS的ZSET使用跳过列表(跳跃列表)(其他LevelDB等。它也使用跳跃列表)。
RBT红色黑树和跳过列表(跳跃列表)简单比较:RBT红色黑树
跳过列表跳跃列表
2.1 Skip List Paper在此处在跳过列表上发布了一篇论文。有关详细研究,请阅读论文。下面的一些公式,代码和图片来自纸张。Skip列表:平衡树的概率替代品
https://www.cl.cam.ac.uk/teaching/2005/algorithms/skiplists.pdf
2.2跳过列表动态地图首先了解通过运动图片插入跳过列表的节点元素的过程。这张照片来自维基百科。
2.3跳过列表算法性能分析2.3.1计算随机数算法首先分析执行插入操作时计算随机数的过程。这个过程将涉及层数的计算,因此非常重要。他具有以下节点的特征:
计算随机层的伪代码:论文中的示例
Java版本
该代码包含两个变量P和Maxlevel。redis中这两个参数的值是:
2.3.2节点跳过列表中包含的平均指针数是空间更换的数据结构。这里的空间是指每个节点中包含的指针数。该部分是一个额外的内部内存开销,可用于测量空间复杂性。random()是一个随机数,因此节点层的数量越高,概率越低(REDIS标准源代码中的促销数据为1/4,这是相对平坦的。定量分析如下:
节点的平均层数(节点中包含的平均指针数):
因此,在redis p = 1/4中计算的平均指针数为1.33
2.3.3时间复杂度计算以下是根据纸张内容假设p = 1/2的内容计算得出的。在由p = 1/2生成的第16个元素中,我们碰巧有9个元素,级别1 3元素1元素1元素1元素1元素1元素1元素1元素1元素1元素1元素1元素1,级别1 3元素。3元素3元素和1个元素14(这不太可能发生,但可能会发生)。我们应该处理这种情况?如果我们使用标准算法并在14级开始搜索,我们将做很多无用的工作。开始搜索?此时,我们假设Skiplist中有N元素,而L级元素数量为1/P;每个元素出现在L层上的概率为p^(l-1),那么L级元素的数量是L级级别元素的元素数量。期望为n(p^l-1));获得1 / p = n(p^l-1)
因此,我们应该选择maxlevel = log(1/p)^n定义:maxlevel = l(n)= log(1/p)^n
要计算跳过列表的时间复杂性,您可以使用反向思维。从带有I层数的节点X中,返回了起点的背面 - 和 - forth时间复杂性。节点X点有两种情况:
令C(k)= k(k)到无限列表的搜索路径的预期成本(即长度),然后扣除如下:
上面推断出的结果表明,攀爬K水平的预期长度为k/p,A级的长度为1/p。
由于maxlevel = l(n),c(k)= k / p,因此期望值为:(l(n)-1) / p;可以获得L(n)= log(1 / p)^n :( log(1 / p)^n -1) / p;合并p = 1/2生成:2 * log2^n -2,即o(logn)的时间复杂性。
2.1跳过列表功能跳过列表跳跃列表通常具有以下功能
2.2跳过列表查询假设这些元素已经存在于初始跳过列表跳跃列表中。它们分发的结构如下所示:
目前,查询节点88,其查询路由如下:
2.3跳过列表的初始结构插入跳过列表与2.3中的初始结构一致。此时
2.4 SKIP列表删除删除过程是查询节点,然后删除其,然后以链接列表的形式重新删除节点的左侧和右侧节点。这里不再绘画。
实现跳过列表很容易,主要分为两个步骤:
3.1定义节点节点节点节点类主要包括以下重要属性:
3.2 Skiplist节点元素的Skiplist主要包括以下重要属性: