Unverified Commit 46667254 authored by Nano's avatar Nano Committed by GitHub
Browse files

Merge pull request #2616 from Backl1ght/patch-2

Update skiplist.md
parents c16e6e75 d6c6fcf6
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -356,8 +356,19 @@ bool erase(const K &key) {
    }
    ```

## 跳表的随机访问优化

访问跳表中第 $k$ 个节点,相当于访问初始有序链表中的第 $k$ 个节点,很明显这个操作的时间复杂度是 $O(n)$ 的,并不足够优秀。

跳表的随机访问优化就是对每一个前向指针,再多维护这个前向指针的长度。假设 $A$ 和 $B$ 都是跳表中的节点,其中 $A$ 为跳表的第 $a$ 个节点, $B$ 为跳表的第 $b$ 个节点 $(a < b)$ ,且在跳表的某一层中 $A$ 的前向指针指向 $B$ ,那么这个前向指针的长度为 $b - a$ 。

现在访问跳表中的第 $k$ 个节点,就可以从顶层开始,水平地遍历该层的链表,直到当前节点的位置加上当前节点在该层的前向指针长度大于等于 $k$ ,然后移动至下一层。重复这个过程直至到达第一层且无法继续行操作。此时,当前节点就是跳表中第 $k$ 个节点。

这样,就可以快速地访问到跳表的第 $k$ 个元素。可以证明,这个操作的时间复杂度为 $O(\log n)$ 。

## 参考资料

1.   [Skip Lists: A Probabilistic Alternative to
    Balanced Trees](https://15721.courses.cs.cmu.edu/spring2018/papers/08-oltpindexes1/pugh-skiplists-cacm1990.pdf) 
2.  [Skip List](https://en.wikipedia.org/wiki/Skip_list) 
3.  [A Skip List Cookbook](http://cglab.ca/~morin/teaching/5408/refs/p90b.pdf)