在java中跳过列表

时间:2014-05-14 15:10:31

标签: java skip-lists

我正在使用主题Skip list下的java中的数据结构,我发现了以下内容:

n nodes的跳过列表中,对于每个ki1 ≤ k ≤lg n1 ≤ i ≤ n/2k–1⎦ – 1,位置2k–1中的节点·i指向位置2k–1·(i + 1)中的节点。 这意味着每个第二个节点都指向节点前面的两个位置 第四个节点指向节点前面的四个位置,依此类推,如图所示 3.17a。这是通过在节点中具有不同数量的参考字段来实现的 在列表中:一半节点只有一个参考字段,四分之一的节点 有两个参考字段,八分之一的节点有三个参考字段,等等 上。参考字段的数量表示每个节点的级别和数量 等级为maxLevel = ⎣lg n⎦ + 1

这个数字是: 跳过列表,其中(a)均匀地和(b)不同级别的不均匀节点; (c)清楚显示参考节点的跳过列表。

enter image description here

我不理解数学部分以及sktip列表究竟是什么,甚至是节点?

1 个答案:

答案 0 :(得分:6)

好的,让我试着让你明白这一点。

跳过列表是一种数据结构,它肯定会使您在给定元素列表中的搜索速度更快。

更好的比喻是任何一个大城市的地铁网络。想象一下,有90个站点可以覆盖,并且有不同的线路(绿色,黄色和蓝色)。

绿线仅连接编号为0,30,60和90的站点 黄线连接0,10,20,30,40,50,60,70,80和90 蓝线连接所有电台,从0到90。

如果你想在0号站登上火车,想要在75号站下车。最好的策略是什么?

常识建议从0号站乘坐绿线火车,然后在60号站下车。 从60号车站乘坐黄线上的另一列火车,在70号站下车。 在70号站的蓝线上登上另一列火车,然后在75号下车。

任何其他方式都会耗费更多时间。

现在用带有三个单独列表的节点和行替换站点(这些列表的集合称为跳过列表)。

只是想要在包含值75的节点上搜索元素。

我希望这能解释Skip Lists的内容以及它们的效率。

在传统的搜索方法中,您可以访问每个节点并在75跳中达到75。 在二进制搜索的情况下,您可以在logN中完成它 在跳过列表中,您可以在我的特定情况下以1 + 1 + 15执行相同操作。你可以做数学,但似乎很简单:)

编辑:均匀间隔的节点&间隔不均匀的节点 正如您可以看到我的类比,它在每条线上的每个节点之间具有相同数量的站。 这是均匀间隔的节点。这是一个理想的情况。

为了更好地理解它,我们需要了解Skip Lists的创建。

在构建的早期阶段,只有一个列表(蓝线),并且每个新节点首先在适当的位置添加到列表中。当蓝线中的节点数量增加时,需要创建另一个列表(黄线)并将其中一个节点提升为列表2.(PS:列表1的第一个和最后一个元素始终提升为跳过列表集中新添加的列表)。因此,添加新列表的那一刻将有三个节点。

促销策略:如何找出从最底部列表(蓝线)到上部列表(黄线和绿线)的推广节点。

最好的决定方法是随机的:)所以我们假设添加一个新节点后,我们翻转硬币以查看是否可以将其提升到第二个列表。如果是,那么我们将它添加到第二个列表然后再次翻转硬币以检查是否必须将其添加到第三个列表中。

所以你看,如果使用这种随机机制,可能会出现节点间距不均匀的情况。 :)

希望这有帮助。