【问题标题】:Skip list in javajava中的跳过列表
【发布时间】:2014-07-02 17:47:33
【问题描述】:

我在主题 Skip list 下浏览 java 中的数据结构,我遇到了以下问题:

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

图是: 具有 (a) 均匀和 (b) 不同级别的不均匀间隔节点的跳过列表; (c) 清晰显示参考节点的跳过列表。

我不明白数学部分以及 sktip 列表到底是什么,甚至是节点?

【问题讨论】:

  • 它就像一个SortedMap。您可以在 O(log(n)) 时间内找到其中的值。通常它的内存占用与 TreeMap 相似或更小,但我猜它的内存局部性更差,因为它的数组长度不同。
  • @GáborBakos 不能同意你的看法。 O(log(n)) 只有在你进行 O(n) 操作来平衡它的情况下才能实现,否则 O(log(n)) 只是预期的查找,而不是最坏的情况
  • @xyz 顺便说一句,您是否尝试过跳过列表上的 Wiki 文章?它似乎比你正在阅读的东西写得更好。
  • @Ordous 感谢您的更正,您是对的,O(log(n)) 只是预期的,而不是最坏的情况。
  • @Ordous 还没有……我正在阅读 Adam Drozdek 的 Java 中的数据结构和算法一书

标签: java skip-lists


【解决方案1】:

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

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

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

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

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

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

希望这会有所帮助。

【讨论】:

  • 由于您的示例中的行中没有重量,因此不能假设按照您建议的方式最快。也许您可以在做出一些假设时添加更多信息。
  • 很好的解释方式,不过
  • @xyz 答案见编辑 :)
  • 嗯...如果您想学习它,请使用 MIT Video Lectures for Datastructures and Algorithms
  • 您说“在我们的特殊情况下为 1 + 1 + 15”。不是五,不是十五,1 + 1 + 5吗?绿色到 60,黄色到 70,然后蓝色到 71、72、73、74,最后是 75。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2017-02-14
  • 2011-08-21
  • 2014-12-03
相关资源
最近更新 更多