Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang实现跳表(SkipList)

golang实现跳表(SkipList)

作者头像
ppxai
发布于 2020-09-23 09:54:19
发布于 2020-09-23 09:54:19
1.4K0
举报
文章被收录于专栏:皮皮星球皮皮星球
跳表的理解

如果要维护一组有序的整数序列,支持高效的插入删除和搜索,并且能维护序列的有序性。可以选择的数据结构是有限的,哈希表虽然支持常数时间复杂度的增删查,但是hashmap不能维护有序性。红黑树可以维持有序性,并且增加删除修改的性能也很好,但是红黑树不能支持范围搜索。跳表这种数据结构利用空间换时间,性能和红黑树比肩,还能支持区间搜索,在redisleveldb等开源项目中都用被应用。

跳表的结构如图所示:

在最底层包含了所有的数据节点,每一层链表都有一个指向下一层和自己相同的节点,向后的指针指向随机的同一层比自己大的数据。

时间复杂度分析

不难理解,对于一个有n个节点的链表,如果每两个节点会提取出一个节点作为索引节点,那么第一层的节点个数为n/2,再往上一层,节点数变成n/4,以此类推,第k层的索引个数为n/(2^k),假设层数有x层,并且第x层的节点个数为2,也就是n/(2^x) = 2,所以x = (logn - 1),而第0层是链表本身,所以整个跳表的高度就是logn,如果每一层都需要遍历m个节点,那么在跳表中查询某个数的时间复杂度就是O(m * log(n))

简单的单向跳表实现: skiplist

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年05月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅析skiplist(跳表)
跳表由William Pugh 1989年发明。他在论文《Skip lists: a probabilistic alternative to balanced trees》中详细介绍了跳表的数据结构和插入删除等操作。论文是这么介绍跳表的:
山行AI
2019/06/28
2.6K0
面试官:为何Redis使用跳表而非红黑树实现SortedSet?
知道跳表(Skip List)是在看关于Redis的书的时候,Redis中的有序集合使用了跳表数据结构。接着就查了一些博客,来学习一下跳表。后面会使用Java代码来简单实现跳表。
JavaEdge
2021/12/07
5470
面试官:为何Redis使用跳表而非红黑树实现SortedSet?
LSM-Tree - LevelDb Skiplist跳表
跳表(SkipList)是由William Pugh提出的。他在论文《Skip lists: a probabilistic alternative to balanced trees》中详细地介绍了有关跳表结构、插入删除操作的细节。
阿东
2022/05/19
6230
LSM-Tree - LevelDb Skiplist跳表
数据结构与算法系列之跳表(GO)
前边的一篇文章中分享了二分查找算法,里边有说到二分查找算法依赖数组的随机访问特性,只能用数组来实现。如果数据存储在链表中就没法用二分查找算法了
书旅
2020/12/03
4930
数据结构-跳表
跳表这种数据结构对你来说,可能会比较陌生,因为一般的数据结构和算法书籍里都不怎么会讲。但是它确实是一种各方面性能都比较优秀的动态数据结构,可以支持快速地插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(Red-black tree)。
acc8226
2022/05/17
3350
数据结构-跳表
跳表
我们可以对链表加一层索引。具体来说,可以每两个结点提取一个结点到上一级,我们把抽出来的那一级叫作索引或索引层。索引节点中通过一个 down 指针,指向下一级结点。通过这样的改造,就可以支持类似二分查找的算法。我们把改造之后的数据结构叫作跳表(Skip list)。
硬件开源小站
2023/04/07
3530
Redis源码之跳表数据结构
跳跃表(skiplist)是一种随机化的数据, 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出, 跳跃表以有序的方式在层次化的链表中保存元素, 效率和平衡树媲美 —— 查找、删除、添加等操作都可以在对数期望时间下完成, 并且比起平衡树来说, 跳跃表的实现要简单直观得多。
杨永贞
2022/05/07
6380
Redis源码之跳表数据结构
深入理解什么是跳跃表
前面的文章我们学习了性能高效的基于二叉搜索树的动态数据结构红黑树,其平均时间复杂度为O(logN),今天我们再来学习另外一种优秀的数据结构跳跃表,其综合性能与红黑树一样,而且功能更强大,从某种意义上来说是可以替代红黑树的。
我是攻城师
2019/05/07
2.7K0
深入理解什么是跳跃表
跳表很难吗?手把手教你如何跳跃它!
​ skiplist是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为 O(logN)(大多数情况下,因为是实现上是概率问题),因为其性能匹敌红黑树且实现较为简单,因此在很多著名项目都用 skiplist 来代替红黑树,例如 LevelDB、RocksDB、Redis中的有序集合zset 的底层存储结构就是用的skiplist。
利刃大大
2023/10/17
7090
跳表很难吗?手把手教你如何跳跃它!
【数据结构】跳表
1. William Pugh在1990年发表了关于skiplist的论文,skiplist本质上也是一种查找结构,用于解决算法中的查找问题,这点几乎是所有数据结构的通性,无论哪个数据结构都离不开增删查改的操作,skiplist同样也是如此,skiplist与红黑树,AVL树的性能相差无几,对于查找的时间复杂度同样是O(logN),所以skiplist是一个很高效的数据结构,同时他的实现相比AVL和红黑树要简单许多,所以skiplist在很多场景下备受青睐,例如在redis这样出名的nosql中也使用了skiplist,同时在某些大厂的面试笔试中,手写一个跳表也变得频繁起来,所以该数据结构很重要。
举杯邀明月
2024/02/23
3170
【数据结构】跳表
golang刷leetcode 经典(4) 实现跳表
跳表是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。
golangLeetcode
2022/08/02
2370
golang刷leetcode 经典(4) 实现跳表
Redis 有序集合使用的跳表到底是什么
跳表是一个动态数据结构,可以支持快速地插入、删除、查找操作,写起来也不怎么复杂,甚至可以替代红黑树。跳表的空间复杂度是 O(n),时间复杂度是 O(logn)。
syy
2021/03/18
2.1K0
10倍通过率!跳表、红黑树、B+树、HashMap 高频面试题总结(附参考答案+避坑指南)
-----> 我就问:什么情况下 redis为什么要使用skiplist跳表,不用 红黑树,hash表
早起的鸟儿有虫吃
2025/04/16
1370
10倍通过率!跳表、红黑树、B+树、HashMap 高频面试题总结(附参考答案+避坑指南)
Redis03-Redis的数据结构之跳表
上一篇文章我们介绍了字典这个数据结构,这一篇文章我们接着来学习下另外一个数据结构,跳表。那么什么是跳表呢?
码农飞哥
2021/08/18
4570
跳表:为什么Redis一定要用跳表来实现有序集合?
时间复杂度O(logn)的二分查找很高效,但是依赖数组随机访问的特性,如果是链表,如何做到O(logn)?
Yuyy
2022/11/16
8200
跳表:为什么Redis一定要用跳表来实现有序集合?
数据结构学习——skiplist跳表
Skiplist是一个用于有序元素序列快速搜索的数据结构,由美国计算机科学家William Pugh发明于1989年。他在论文《Skip lists: a probabilistic alternative to balanced trees》中详细介绍了跳表的数据结构和插入删除等操作。论文是这么介绍跳表的:
全栈程序员站长
2022/11/01
1.1K0
数据结构学习——skiplist跳表
跳表的设计思路,值得你拥有
学习《数据结构与算法之美》中的第 17 节 [为什么redis一定要用跳表来实现有序集合]后,觉得很有价值,以自己的理解整理出下文,分享给爱学习的你,希望你可以看懂。
somenzz
2020/11/25
4190
跳表的设计思路,值得你拥有
跳表(SkipList) 和 ConcurrentSkipListMap
对于单链表,即使链表是有序的,如果想要在其中查找某个数据,也只能从头到尾遍历链表,这样效率自然就会很低,跳表就不一样了。跳表是一种可以用来快速查找的数据结构,有点类似于平衡树。它们都可以对元素进行快速的查找。但一个重要的区别是:对平衡树的插入和删除往往很可能导致平衡树进行一次全局的调整;而对跳表的插入和删除,只需要对整个数据结构的局部进行操作即可。这样带来的好处是:在高并发的情况下,需要一个全局锁,来保证整个平衡树的线程安全;而对于跳表,则只需要部分锁即可。这样,在高并发环境下,就可以拥有更好的性能。就查询的性能而言,跳表的时间复杂度是 O(logn)。
JMCui
2020/03/19
1.1K0
SkipList跳表:高效查找的利器
在计算机科学中,数据结构的选择对于程序的性能至关重要。对于需要高效查找、插入和删除操作的场景,跳跃表(SkipList)是一种非常实用的数据结构。本文将详细介绍跳跃表的原理、实现和应用场景。
笑傲码湖
2025/04/11
950
Redis源码剖析之跳表(skiplist)
计算机领域有很多种数据结构,数据结构的存在要么是为了节省时间、要么是为了节省空间,或者二者兼具,所以就有部分数据结构有时间换空间,空间换时间之说。其实还有某些以牺牲准确性来达到节省时间空间的数据结构,像我之间讲过的bloomfilter就是其中的典型。而今天要讲的skiplist也是一种概率性数据结构,它以一种随机概率降数据组织成多级结构,方便快速查找。
xindoo
2021/01/21
9690
相关推荐
浅析skiplist(跳表)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档