繁体   English   中英

在java中跳过列表

[英]Skip list in java

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

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

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

在此输入图像描述

我不明白数学部分和sktip列表究竟是什么甚至是节点?

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

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

更好的比喻是任何一个大城市的地铁网络。 想象一下,有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的第一个和最后一个元素始终提升为跳过列表集中新添加的列表)。 因此,添加新列表的那一刻将有三个节点。

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

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

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

希望这可以帮助。

蓝色,黄色,绿色火车图和蓝色火车从0到60,黄色火车从60到70,最后蓝色火车从70到71,72,73,74和75的路线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM