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)