问题描述
我正在学习 skip lists,但有一些我无法理解。
当我们插入一个新节点时,我们抛出一个硬币,如果我们得到 1,我们将在上层再次插入该节点,依此类推,直到我们得到 0,我们停止。
但是我们为什么需要这个?
解决方法
如果你只向跳过列表添加一层,你会得到一个有序链表,其中每个节点都连接到下一个节点。
跳过列表中的额外层用于高效搜索其中的值,将查找时间从 O(n)
减少到 O(logn)
。
- 只有一个“常规”有序链接列表(没有额外的层),您平均需要大约 n/2 次迭代才能找到值是否存在。
- 如果添加单个层,则需要一半,这意味着 ~n/4 次迭代。
- 如果添加两层,您将需要前一层的一半,或平均约 n/8 次迭代。
(以上是简化,因为您还需要遍历下一层,但它们的复杂度与顶层相似)
通过一直这样做到顶部,您将需要平均 O(1)
次迭代每层,从而为您提供 O(logn)
的总查找时间。