支持快速地:
- 插入
- 删除
- 查找
某些情况下,跳表甚至可以替代红黑树(Red-Black tree)。Redis 当中的有序集合(Sorted Set)是用跳表实现的。
跳表是对链表的改进。对于单链表来说,即使内容是有序的,查找具体某个元素的时间复杂度也要达到 first
和 last
确定 cut
时,必须沿着链表依次迭代 std::distance(first, last) / 2
步;特别地,计算 std::(first, last)
本身,就必须沿着链表迭代才行。此时,二分查找的效率甚至退化到了
跳表的核心思想是用空间换时间,构建足够多级数的索引,来缩短查找具体值的时间开销。
例如对于一个具有 64 个有序元素的五级跳表,查找起来的过程大约如下图所示。
对于一个每一级索引的跨度是下一级索引 down
操作,相当于将搜索范围缩小到「剩余的可能性的
前面说了,跳表是一种用空间换时间的数据结构。因此它的空间复杂度一定不小。我们考虑原链表有
对于链表来说,插入或删除一个给定结点的时间复杂度是
为了维护跳表的结构,在不断插入数据的过程中,有必要动态维护跳表的索引结构。一般来说,可以采用随机层级法。具体来说是引入一个输出整数的随机函数。当随机函数输出