【问题标题】:Violation in deterministic skip-list topdown insertion违反确定性跳过列表自上而下插入
【发布时间】:2014-06-17 23:03:43
【问题描述】:

假设我有一个跳过列表,顺序为 3。

           HEAD
level 3     |--------------------------------------------> X
            |                      |---|
level 2     | -------------------> |   | ----------------> X
            |    |---|    |---|    |---|    |---|
level 1     | -> |   | -> |   | -> |   | -> |   | -------> X
            |    |---|    |---|    |---|    |---|
            |    | 20|    |100|    |150|    |200|
            |    |---|    |---|    |---|    |---|


minlimit = ceil(order/2) - 1 = 1

maxlimit = order - 1 = 2

所以本质上它是1-2 skip-list

如果我想通过自上而下的插入算法插入50,它会在落入Head150之间的间隙之前提高节点100的级别,并在@之前插入50 987654328@。现在将发生违规,因为在100150 之间没有节点,而在该间隙中应该至少有一个高度为h-1 的节点作为minlimit=1

我做错了什么?

【问题讨论】:

  • 我们可以看看你的代码吗?
  • 代码正在做我上面所说的。我认为代码无关紧要,因为问题是关于算法,而不是实现,我只想知道我在这个特定场景中执行的步骤是否正确。不过如果你觉得很重要,我可以发在这里。

标签: data-structures skip-lists


【解决方案1】:

如果我想通过自上而下的插入算法插入50,它会在落入Head和150之间的间隙之前提高节点100的级别,并在100之前插入50。

它不会提升节点 100 的级别,而是提升节点 20 的级别。根据算法,每当您在间隙中达到节点的maxlimit 时,您就会提升 @ 的级别987654323@ 那个间隙中的节点。

在这种情况下,当节点 20 的级别提升到级别 2 时,头和节点 20 之间没有级别 1 节点,但不会导致任何结构违规。 Munro 等人在论文中描述的确定性跳过列表的原始结构。这样读。

假设在n个元素的跳跃列表中存在第0个和第(n+1)个高度比跳跃列表的高度高1的节点,我们要求在任意两个高度为h的节点之间(h > 1) 或更高,存在 1 或 2 个高度为 h – 1 的节点。

【讨论】:

  • 无论选择第 ceil(maxlimit/2) 个元素还是第 (floor(maxlimit/2) + 1) 个元素都没有关系,因为在偶数个节点。你与你刚才引用的陈述相矛盾。声明规定:“存在 1 个或 2 个高度为 h-1 的节点” 但是您说高度为 h-1 的节点有 0 个,这很好,这很荒谬。如果你仍然有疑问,那么为这个skiplist制作对应的2-3树(插入50之后),你会发现树的所有叶子节点都不在同一级别。
  • 是的,这正是与您的陈述相矛盾的地方。节点 20 升起时的高度为 2,因此 h > 1 并且在 h-1 级别,即在我们的例子中为 1,头部和节点 20 之间应该有 1 或 2 个高度为 1 的节点,但没有明显违反结构约束。
  • 自顶向下算法适用于偶数度和奇数度的B树,如果你认为你是对的,请提供参考。在Munro's paper中还声明了“1-2个跳过列表和2-3个树之间存在一一对应关系”(本例中的顺序是3,这显然是奇怪但存在对应关系)还给出了相关示例。
  • 请尽量理解声明并保持礼貌。 SO 不鼓励敌对态度。该声明说在两个高度为 h 的节点之间;两个节点的高度 h 相同。如果两者不同,它的高度应该是 h 和 h'。
  • 我已经找到了答案,我也不确定它是否正确,但很有可能。 1-2 跳跃列表不同于 1-2-3 跳跃列表,就像 2-3 树不同于 B 树一样,相同的算法不适用于 1-2 跳跃列表,它必须单独处理。很抱歉,您仍然对该声明感到困惑,但感谢您提供帮助。
【解决方案2】:

如果我想通过自上而下的插入算法插入50,它会在落入Head和150之间的间隙之前提高节点100的级别,并在100之前插入50

你为什么要这样做?

根据您的链接,我找到的确定性 1-2 跳过列表 (this paper) 可用 (PDF) 的第一个参考说:

如 [...] 中所述,在 ... 中的插入可以 进行自上而下,...采用这个 方法,我们在 1-2-3 跳过列表中插入一个元素 将任何大小为 3 的间隙分成两个大小为 1 的间隙,当 搜索要插入的元素。我们确保在 这样,无论是否插入元素,结构都保持间隙不变。

更多 准确地说,我们从标题开始搜索,然后在级别 1 高于跳过列表的高度。当我们发现 我们要缩小的差距,我们看水平 下面,如果我们连续看到 3 个相同高度的节点, 我们举起中间的那个;之后我们下降一个级别。 当我们到达底层时,我们只需插入一个新的 高度为 1 的节点。

按照这个,你应该从第3级开始,看下面的第2级。这里连续没有 3 个相同高度的节点 - 只有单个节点 150 - 所以你不需要提出任何东西。现在,在间隙 [HEAD,150] 中下降到第 2 级。

这是否开始解决您的困惑?

【讨论】:

  • 感谢您的回复。我知道可以通过这种方式完成,但问题是我必须通过使用自上而下的插入来完成它,在自上而下的插入中,当你向下时,如果目标级别的节点数为,则中间节点的级别会增加等于this paper 中提到的“最大限制”。这样做的目的是为了让插入更有效率。
  • 我不明白为什么会发生这个异常,因为自上而下的插入算法众所周知并且经过测试,它应该可以正常工作。也许我做错了什么,但我无法弄清楚。
  • 您将 1-2-3 跳过列表与 1-2 跳过列表混淆了。引起麻烦的是 1-2 跳过列表,按照论文中的步骤,1-2-3 可以正常工作。正如您所提到的,当从 3 级下降到 2 级时,不需要做任何事情,因为 2 级只有一个节点(150),但是当我们从 2 级下降到 1 级的间隙 [Head, 150] ,必须提升中间节点,因为在 1-2 中,最大限制为 2(不是 3,如 1-2-3 跳过列表),并且间隙 [Head, 150] 中已经有 2 个节点,因此节点 100 的级别将被提升。
猜你喜欢
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多