漫谈数据结构——跳表

127 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

前言

我们前面介绍了二分查找的高效的查找效率,但是这个高效率下依赖着底层数组的随机访问的特性,以及有序的数据集合。在那一篇文章中,我们讨论了链表并不适合作为二分查找的基础结构,因为链表不支持随机访问。那么链表的查找效率真的就无法提升的吗?这里就引出了我们基于链表的一种数据结构——跳表

数据结构——跳表

跳表是一个动态的数据结构,具有有序的插入,删除和查找操作的。主流的分布式缓存Redis中的有序集合(Sorted Set)就是基于跳表来实现的。如果我们使用普通的链表结构,存储着有序的数据集,我们从中进行查找数据的操作的话,需要从头遍历整个链表的,时间复杂度就是线性的O(n),那么跳表是如何提升链表的查询效率呢。假如我们对链表建立一级索引的话,每两个结点抽取一个结点到上一级,然后增加一个down指针,指向下一层的结点的位置。比如我的链表有18个结点,建立一级索引后会有9个结点,那么假如查找最后一个元素,原先要遍历18次,现在只需要遍历9次即可了,遍历次数就减少了一半了。我们所建立的索引层不只是一级的,还可以在一级索引层继续提取结点建立二级索引层,知道一个适当的n级索引的,然后在大数据量下,进行遍历数据的话,搜索的过程就是不停的往下级索引跳跃的过程,直到原始链表部分的。这就是我们跳表的一个完整的原理描述的。

总结

今天我们简单理解了跳表的整个原理。关于它的时间复杂度我们下一篇继续介绍的。