Skip List(跳跃链表,简称跳表),最早是由William Pugh在1989年提出。
Skip List算法
LeetCode上有一道设计跳表的题目——1206.设计跳表,下面结合论文给出的算法,分别实现跳表的查找、插入以及删除操作。
首先,跳表的数据结构定义如下:
1 | class Skiplist { |
查找节点
1 | public boolean search(int target) { |
插入和更新节点
1 | public void add(int num) { |
计算随机层数
1 | private int randomLevel() { |
删除节点
1 | public boolean erase(int num) { |
Redis跳表实现
Redis的跳表定义在t_zset.c中,数据结构如下:
1 | typedef struct zskiplistNode { |
查找元素
1 | /* Find the rank for an element by both score and key. |
添加元素
1 | /* Insert a new node in the skiplist. Assumes the element does not already |
计算随机层数
函数zslRandomLevel()
的实现如下:
1 | /* Returns a random level for the new skiplist node we are going to create. |
其中,random()定义在标准库stdlib.h中,返回类型为long;ZSKIPLIST_P
和ZSKIPLIST_MAXLEVEL
定义在server.h中:
1 |
删除元素
1 | /* Delete an element with matching score/element from the skiplist. |
其中,函数zslDeleteNode
的实现如下:
1 | /* Internal function used by zslDelete, zslDeleteRangeByScore and |
参考资料
- 论文地址:https://dl.acm.org/doi/pdf/10.1145/78973.78977
- LeetCode 1206.设计跳表,https://leetcode-cn.com/problems/design-skiplist/
- Redis,https://github.com/redis/redis/