Loading docs/ds/skiplist.md +11 −0 Original line number Diff line number Diff line Loading @@ -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) Loading
docs/ds/skiplist.md +11 −0 Original line number Diff line number Diff line Loading @@ -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)