【高级数据结构】 ---- 跳跃表、布隆过滤器、一致性哈希、雪花算法

本文详细介绍了四种高级数据结构:跳跃表、布隆过滤器、一致性哈希和雪花算法。跳跃表是一种随机化的有序链表,适用于快速查找、插入和删除操作,具有近似的O(logn)时间复杂度。布隆过滤器是一种概率型数据结构,用于判断元素是否存在,具有空间效率高但存在误判率的特点。一致性哈希解决了分布式存储中动态增删节点的问题,通过哈希环实现负载均衡。雪花算法是Twitter提出的分布式ID生成算法,通过时间戳、工作机器ID和序列号组合生成唯一ID。
摘要由CSDN通过智能技术生成

1、跳跃表(skiplist)

1.1 什么是跳表?

跳表是一个随机化的数据结构,实际就是一种可以进行二分查找的有序链表。

跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。

(不仅提高了搜索性能,也提高了插入和删除操作的性能)

image-20210519201059268

image-20210519213651390

1.2 跳跃表的性质

1.2.1 基本性质

  • 跳跃表的每一层都是一条有序的链表
  • 跳跃表的查询次数近似于层数,时间复杂度为O(logn)、插入、删除也为O(logn)
  • 最底层的链表包含所有元素
  • 跳跃表是一种随机化的数据结构(通过抛硬币来决定层数),这样做的目的是为了保证平衡,不会出现两个索引之间存在大量数据
  • 跳跃表的空间复杂度为O(n)

1.2.1 索引层的随机提拔

跳表的设计者采用了一种有趣的办法:抛硬币。也就是随机决定新节点是否提拔,每向上提拔一层的几率是50%。因为跳跃表的删除和添加节点是不可预测的,很难用一种有效的算法来保证跳表的索引分布始终均匀。这种方法虽然不能保证索引绝对均匀分布。但是可以让大体趋于平均。

1.3 跳跃表与其它结构相比

  • 跳跃表 VS 二叉搜索树

    二叉搜索树插入、删除、查找平均时间复杂度也为O(logn),但是在最坏情况下,二叉搜索树退化成链表,时间复杂度变为O(n);

    另外,跳跃表更适合作为范围查找,只需要找到最小值即可,然后顺序遍历若干步就可以了;而平衡树的查找需要通过中序遍历顺序查找并不容易实现。

  • 跳跃表 VS 红黑树

    红黑树插入、删除、查找平均时间复杂度也为O(logn),但是红黑树的插入、删除结点时,是通过调整结构来保持红黑树的平衡,比起跳跃表直接通过一个随机数来决定跨越几层,在时间复杂度的花销上是要高于跳跃表的

  • 跳跃表 VS B+树

    B+树实现上更复杂,维持结构平衡的成本高,更适合磁盘的索引。

    跳跃表比较适合内存查找。

  1. 内存占用上

    跳跃表比平衡树更灵活一些。平衡树的每个节点包含2个指针,而Redis中跳跃表的每个节点包含的指针数目平均要比平衡树要小

  2. 对范围查找的支持

  3. 实现难易程度

1.4 使用场景

  • Redis使用跳跃表作为有序集合键的底层实现之一

    条件: 如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表来作为有序集合的底层实现。(由ziplist压缩列表编码转化为skiplist跳跃表编码)
    
    使用skiplist编码的有序集合对象使用zset结构作为底层实现,一个zset结构同时包含一个字典和一个跳跃表
    

1.5 Redis中的跳跃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值