Unverified Commit d758fbf2 authored by Zhikai Zeng's avatar Zhikai Zeng Committed by GitHub
Browse files

Update skiplist.md

添加了跳表的随机访问相关内容
parent 06ebfc76
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)