跳过列表,为什么我们需要多次插入?

问题描述

我正在学习 skip lists,但有一些我无法理解。

当我们插入一个新节点时,我们抛出一个硬币,如果我们得到 1,我们将在上层再次插入该节点,依此类推,直到我们得到 0,我们停止。

但是我们为什么需要这个?

解决方法

如果你只向跳过列表添加一层,你会得到一个有序链表,其中每个节点都连接到下一个节点。

跳过列表中的额外层用于高效搜索其中的值,将查找时间从 O(n) 减少到 O(logn)

  • 只有一个“常规”有序链接列表(没有额外的层),您平均需要大约 n/2 次迭代才能找到值是否存在。
  • 如果添加单个层,则需要一半,这意味着 ~n/4 次迭代。
  • 如果添加两层,您将需要前一层的一半,或平均约 n/8 次迭代。

(以上是简化,因为您还需要遍历下一层,但它们的复杂度与顶层相似)

通过一直这样做到顶部,您将需要平均 O(1) 次迭代每层,从而为您提供 O(logn) 的总查找时间。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...