Skip List(跳表)
- Skip List(跳表)是一种随机化的数据结构,其效率可比拟于二叉查找树,查找的时间复杂度O(logn),空间复杂度O(n)。简单的来说就是在有序链表的基础上加了索引,实现对链表的操作可以不用从头开始一个个的遍历,而是可以快速的跳过部分列表,跳表因此而得名。
概念
- 假设有这样一个有序单链表,它的跳表样子可能如下:
- 一个跳表,应该具有以下特征:
- 一个跳表应该有几个层(level)组成;
- 跳表的第一层包含所有的元素;
- 每一层都是一个有序的链表;
- 如果元素x出现在第i层,则所有比i小的层都包含x;
- 第i层的元素通过一个down指针指向下一层拥有相同值的元素;
- 在每一层中,-1和1两个元素都出现(分别表示INT_MIN和INT_MAX);
- Top指针指向最高层的第一个元素。
- 这样,假如说我想查找10,那么先从Level3的1节点开始,到7节点,通过7节点的Down指针到达Level2的7节点,然后到9节点,通过9节点的Down指针最后到level1的9节点,再查到10节点,这样访问顺序就是1->7->9->10,只访问了4个节点,而挨个遍历需要访问8个节点。
- 通常,每一层索引的个数是有限制的,一般如果原始链表有n个节点,那么上一层就有n/2个节点,再上一层就是n/4个节点,以此类推,最上层节点数一般就是2个,从而使得有序链表能够实现近乎二分查找。