redis 跳表
跳表于avl比较
跳表:空间换时间
- 跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。
- 跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。
- 跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。
相比于红黑树、平衡二叉树,跳表不仅查找、插入、删除时间复杂度都是O(logN),并且实现简单很多。
时间复杂度
单链表查询的时间复杂度为O(n),而插入、删除操作需要先找到对应的位置,所以插入、删除的时间复杂度也是O(n)。
如果按照标准的跳表来看的话,每一级索引减少k/2个元素(k为其下面一级索引的个数),那么整个跳表的高度就是(log n)。
所以,跳表的时间复杂度也是O(log n)。
空间复杂度
我们还是以标准的跳表来分析,每两个元素向上提取一个元素,那么,最后额外需要的空间就是:
n/2 + (n/2)^2 + (n/2)^3 + ... + 8 + 4 + 2 = n - 2
所以,跳表的空间复杂度是O(n)。
跳表与AVL
- 从算法实现难度上来比较,skiplist比平衡树要简单得多。
- 平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而skiplist的插入和删除只需要修改相邻节点的指针,操作简单又快速。
- 查找单个key,skiplist和平衡树的时间复杂度都为O(log n),大体相当。
- 在做范围查找的时候,平衡树比skiplist操作要复杂。
- skiplist和各种平衡树(如AVL、红黑树等)的元素是有序排列的。