有序集合在生活中教常见,如根据成绩对学生进行排名,对于有序集合的实现,我们可以使用数组、链表、平衡树等结构,数组不便于元素的插入和删除,链表的查询效率低,需要遍历所有的元素;平衡树或者红黑数等结构虽然效率高但实现复杂。redis采用了一种新型的数据结构 --- 跳跃表,跳跃表的效率堪比红黑数,然而其实现远比红黑数简单。
有序链表只能逐一查询,导致操作起来非常慢,跳跃表在此基础上,增加了多级索引,通过索引位置的几个跳转,实现数据的快速定位。
如果我们要在链表中查找 33 这个元素,只能从头开始遍历链表,查找 6 次,直到找到 33 为止。此时,复杂度是 O(N),查找效率很低。
为了提高查找速度,我们来增加一级索引:从第一个元素开始,每两个元素选一个出来作为索引。这些索引再通过指针指向原始的链表。例如,从前两个元素中抽取元素 1 作为一级索引,从第三、四个元素中抽取元素 11 作为一级索引。此时,我们只需要 4 次查找就能定位到元素 33 了。
如果我们还想再快,可以再增加二级索引:从一级索引中,再抽取部分元素作为二级索引。例如,从一级索引中抽取 1、27、100 作为二级索引,二级索引指向一级索引。这样,我们只需要 3 次查找,就能定位到元素 33 了。可以看到,这个查找过程就是在多级索引上跳来跳去,最后定位到元素。
这也正好符合“跳”表的叫法。当数据量很大时,跳表的查找复杂度就是 O(logN)。