首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

跳跃表原理和实现

跳跃表原理和实现 前提 有时候会被问到链表如果做到二分搜索,可能会有部分的人会去把链表中的值保存到数组来进行二分,但是如果知道跳跃表的话,那么这个数据结构就可以解决这个困惑,它允许快速查询一个有序连续元素的数据链表...跳跃列表是在很多应用中有可能替代平衡树而作为实现方法的一种数据结构。跳跃列表的算法有同平衡树一样的渐进的预期时间边界,并且更简单、更快速和使用更少的空间。...----by 发明者像是redis中有序集合就使用到了跳跃表。...跳跃表的层数跟结构中最高节点的高度相同。...理想情况下,跳跃表结构中第一层中存在所有的节点,第二层只有一半的节点,而且是均匀间隔,第三层则存在1/4的节点,并且是均匀间隔的,以此类推,这样理想的层数就是logN。

84630

基于跳跃表的 ConcurrentSkipListMap 内部实现(Java 8)

由于它内部根据键的 hash 值取模表容量来得到元素的存储位置,所以整体上说 HashMap 是无序的一种容器。...但实现却远远比红黑树要简单,本篇我们主要从以下几个方面来对这种并发版本的数据结构进行学习: 跳跃表的数据结构介绍 ConcurrentSkipListMap 的前导知识预备 基本的成员属性介绍 put...方法并发添加 remove 方法的并发删除 get 方法获取指定结点的 value 其它的一些方法的简单描述 一、跳跃表的数据结构介绍 跳跃表具有以下几个必备的性质: 最底层包含所有节点的一个有序的链表...通过概率算法得到新插入节点的一个 level 值,如果小于当前表的最大 level,从最底层到 level 层都添加一个该节点。...参考的几篇优秀博文 Java并发容器之SkipList(需要访问外国网站) 深入Java集合学习系列:ConcurrentSkipListMap实现原理 Java多线程(四)之ConcurrentSkipListMap

3.3K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    跳跃表

    跳跃表是基于链表的概率数据结构,完善了链表不易查询的缺点....跳跃表的基本结构如下: 每一横向的链表子序列称为层; 每一纵向的相同值的节点序列称为塔; 链表的头部和尾部通常使用-INF(负无穷)和+INF(正无穷)表示; 通常,上一层的元素数量是下一层数量的一半....查找节点 跳跃表是如何提高查找效率的呢? 将上图旋转45°,就会发现与二叉查找树是类似,遍历时可以快速跳过很多节点. 对于二叉查找树不熟悉的可以参考二叉树....对应这里就是元素随机建塔升层,或不建塔升层.实现方式也很简单,1以内取随机数,规定大于等于0.5建塔升层,小于0.5不进行建塔升层. 例如,我们计算的随机数值为0.6,那就需要建塔升层....明显,跳跃表在搜索时是从上层至下层的顺序,而添加时正好相反,是从下层至上层的顺序.

    36610

    Redis的设计与实现(4)-跳跃表

    在大部分情况下, 跳跃表的效率可以和平衡树相媲美, 并且因为跳跃表的实现比平衡树要来得更为简单, 所以有不少程序都使用跳跃表来代替平衡树....Redis 使用跳跃表作为有序集合键的底层实现之一: 如果一个有序集合包含的元素数量比较多, 又或者有序集合中元素的成员 (member) 是比较长的字符串时, Redis 就会使用跳跃表来作为有序集合键的底层实现...和链表, 字典等数据结构被广泛地应用在 Redis 内部不同, Redis 只在两个地方用到了跳跃表, 一个是实现有序集合键, 另一个是在集群节点中用作内部数据结构, 除此之外, 跳跃表在 Redis...跳跃表 使用一个 zskiplist 结构来持有节点, 可以更方便地访问跳跃表的表头节点和表尾节点, 又或者快速地获取跳跃表节点 的数量 (也即是跳跃表的长度) 等信息. zskiplist 结构的定义如下...总结 跳跃表是有序集合的底层实现之一, 除此之外它在 Redis 中没有其他应用; Redis 的跳跃表实现由 zskiplist 和 zskiplistNode 两个结构组成, 其中 zskiplist

    38710

    浅析SkipList跳跃表原理及代码实现

    由于它的代码以及原理实现的简单性,更为人们所接受。我们首先看看SkipList的定义,为什么叫跳跃表?...图1:跳跃表简单示例 如上图所示,是一个即为简单的跳跃表。传统意义的单链表是一个线性结构,向有序的链表中插入一个节点需要O(n)的时间,查找操作需要O(n)的时间。...图3:随机生成的跳跃表 跳跃表的大体原理,我们就讲述到这里。...通过这些结点,我们就可以创建跳跃表List,它是由两个元素构成,首结点以及level(当前跳跃表内最大的层数或者高度)。这样子,基本的数据结构定义完毕了。...NIL_节点会在后续全部代码实现中可以看到。 (三)查找 查找就是给定一个key,查找这个key是否出现在跳跃表中,如果出现,则返回其值,如果不存在,则返回不存在。

    66330

    Redis(2)——跳跃表

    它的内部实现就依赖了一种叫做 「跳跃列表」 的数据结构。...性能考虑: 在高并发的情况下,树形结构需要执行一些类似于 rebalance 这样的可能涉及整棵树的操作,相对来说跳跃表的变化只涉及局部 (下面详细说); 实现考虑: 在复杂度与红黑树相同的情况下,跳跃表实现起来更简单...二、跳跃表的实现 Redis 中的跳跃表由 server.h/zskiplistNode 和 server.h/zskiplist 两个结构定义,前者为跳跃表节点,后者则保存了跳跃节点的相关信息,同之前的...Skip List 的原理和实现(Java) - https://blog.csdn.net/DERRANTCM/article/details/79063312 【算法导论33】跳跃表(Skip list...)原理与java实现 - https://blog.csdn.net/brillianteagle/article/details/52206261 参考资料 《Redis 设计与实现》 - http:

    92230

    Redis中的跳跃表,实现有序集合

    层级跳跃指针(forward pointers):一个指针数组,用于指向当前节点在不同层级上的下一个节点,即跳跃表的索引结构。...Redis的跳跃表中每个节点的前进指针(pointer)Redis跳跃表的每个节点都有一个前进指针,用于在跳跃表中快速定位下一个节点。前进指针有两种类型,分别是level和span。...通过使用这两个指针,Redis可以通过特定层数上的步数确定向前移动的位置,并通过跨度计算出下一个节点的位置,实现快速地访问、插入和删除节点的功能。...这种设计可以大大提高查找效率,使得Redis跳跃表成为一种高效的数据结构。确定节点在每个层级上的跳跃层数(level)需要根据以下算法:初始化最大层数为1,并将每个层级的跳跃概率设为0.5。...节点的分配内存操作如下:Redis会根据节点的类型(比如跳跃表节点、哈希表节点等)和节点的大小,选择合适的内存分配策略。

    23661

    《闲扯Redis十》Redis 跳跃表的结构实现

    备注: 按照分析顺序,本节应该说道有序集合对象了,但是考虑到有序集合对象的底层实现中使用到了跳跃表结构,避免在分析有序集合时造成突兀,所以本节先来看看 redis 中跳跃表结构的具体实现。...1.跳跃表节点结构 跳跃表节点实现由 redis.h/zskiplistNode 结构定义: typedef struct zskiplistNode { // 后退指针 struct...2.跳跃表结构 虽然仅靠多个跳跃表节点就可以组成一个跳跃表, 如图 5-8 所示。...四、要点总结 (1)跳跃表是有序集合的底层实现之一,除此之外它在 Redis 中没有其他应用。...(2)Redis 的跳跃表实现由 zskiplist 和 zskiplistNode 两个结构组成,其中 zskiplist 用于保存跳跃表信息(比如表头节点、表尾节点、长度),而 zskiplistNode

    84421

    跳跃表(skiplist )详解及其C++编程实现

    x 2、首先明确,向跳跃表中插入一个元素,相当于在表中插入一列从S0中某一位置出发向上的连续一段元素。...3、 关于插入的位置,我们先利用跳跃表的查找功能,找到比x小的最大的数y。根据跳跃表中所有链均是递增序列的原则,x必然就插在y的后面。...直到第i次,模块要求执行的是B操作,我们结束决策,并向跳跃表中插入一个高度为i的列。...删除操作分为以下三个步骤: 在跳跃表中查找到这个元素的位置,如果未找到,则退出 将该元素所在整列从表中删除 将多余的“空链”删除 删除节点操作和插入差不多,找到每层需要删除的位置,删除时和操作普通链表完全一样...// 释放跳跃表 void sl_free(skip_list *sl) { if(!

    1.4K20

    跳跃表深入理解

    1、认识跳跃表 redis 中 zset 是一个有序非线性的数据结构,它底层核心的数据结构是跳表。...红黑树在空间和时间效率上略胜跳跃表一筹,但跳跃表实现上相对简单,颇得程序猿们的青睐。redis和leveldb中都有采用跳表。...2、跳跃表的提出 跳表首先由William Pugh在其1990年的论文《Skip lists: A probabilistic alternative to balanced trees》中提出。...那么有没有实现起来简单、和自平衡BST效率想近的实现方法呢?答案就是跳表,并且简单很多。...3、设计思想 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的。跳跃表在 Redis 里没有其它用途。

    47220

    跳跃表---用简单的方式实现有序集合

    这个新的结构就是跳跃表了,跳跃表中的操作始终从head节点的最高指针开始 例如查找7: 跳跃表节结构代码为: /** * 跳跃表 * 查找,插入,删除 都为 O(logn) * 空间复杂度为o(...同时,还可以结合查找的相关代码,轻松找出比某个值大的所有节点 三、双向跳跃表 还记得始终指向null的next[0]指针吗?...如果上述实现的跳跃表的基础上,将每一个next[0]指针指向前驱节点,并添加一个尾节点,就是双向跳表了,方便做反向遍历,例如找出比某个值小的所有节点 注意尾节点始终只有第0层 双向跳跃表实现与跳跃表基本类似...,只是增加了反向指针,具体实现见双向跳跃表(https://github.com/wdw87/repoZ/blob/master/src/wdw/classic/structures/SkipList/...DoubleSkipList.java) 作者:好吃懒做贪玩东 编辑:西瓜媛

    42110
    领券