java中的跳过列表

java中的跳过列表,java,skip-lists,Java,Skip Lists,我在主题Skip list下浏览了java中的数据结构,发现了以下内容: 在n个节点的跳过列表中,对于每个k和i,使1≤ K≤lg n和1≤ 我≤ n/2k–1⎦ – 1,位于位置2k-1·的节点i指向位于位置2k-1·的节点(i+1)。 这意味着每秒钟一个节点指向节点前面的两个位置,每个位置 第四个节点指向前面四个位置的节点,以此类推,如图所示 3.17a。这是通过在节点中具有不同数量的参考字段来实现的 列表上:一半的节点只有一个参考字段,四分之一的节点 有两个参考字段,八分之一的节点有三个参

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

n个节点的跳过列表中,对于每个
k
i
,使
1≤ K≤lg n和
1≤ 我≤
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的节点上搜索一个元素

我希望这能解释什么是跳过列表以及它们是如何有效的

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

编辑:等间距节点和等间距节点 正如你可以看到我的类比,在每条线路上的每个节点之间有相等数量的站点。 这是均匀分布的节点。这是一个理想的情况

为了更好地理解它,我们需要了解跳过列表的创建

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

促销策略:如何确定从最底层列表(蓝线)到上层列表(黄线和绿线)的促销节点

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

因此,如果使用这种随机机制,可能会出现节点间距不均的情况。:)

希望这有帮助


它就像一张分类地图。您可以在O(log(n))时间内找到其中的值。通常它的内存占用与树映射相似或更小,但我猜它的内存局部性更差,因为它的数组长度不同。@GáborBakos在这里不同意你的观点。O(log(n))只有在您执行O(n)操作来平衡它的情况下才能实现,否则O(log(n))只是预期的查找,而不是最差的查找-case@xyz顺便说一句,你有没有试过关于跳过列表的维基文章?它似乎比你读的东西写得更好。@Ordous谢谢你的更正,你是对的,O(log(n))只是预期的,而不是最坏的情况。@Ordous还没有。.我正在阅读Adam DrozdekAs的《Java数据结构和算法》一书,因为在你的示例中,行中没有权重,不能认为按照你建议的方式走是最快的。也许你可以在做一些假设的地方添加更多的信息。很好的解释方式,though@xyz请参见编辑以获得答案:)好吧。。。如果你想学习它,可以使用麻省理工学院的数据结构和算法视频讲座。你说“在我们的特殊情况下是1+1+15”。不是五,不是十五,1+1+5吗?绿色到60,黄色到70,然后蓝色到71,72,73,74,最后是75。