跳表skiplist

增加了向前指针的链表叫作跳表。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。(来自百度百科)

原理

链表本身是无法使用二分查找的,只能顺序查找,为了提高查找效率,可以在链表上一半的节点数据建立索引,这是一种以空间换时间的典型算法。

skipList.png

查找

查找数据时,先从最高层索引开始查找,相等则存在;否则找到索引比val大的前一个索引,然后进入下一层继续查找,直到层数为0。

比如要查找6,先从二级索引开始,找到5,然后向下进入一级索引,然后再进入原始链表,找到6。

skipList - 副本.png

插入

插入操作和查找的过程一致,先查找需要插入的位置,最终插入到原始链表中。当链表的节点相对于上级索引超过某个数量时,需要向上建立索引,跳表是使用抛硬币的方式决定节点是否提拔,每个节点有50%的概率,保证索引大致均匀。

删除

删除操作和查找的过程一致,先查找需要删除的位置,然后向下逐层删除。如果该层只有这一个索引,则删除该层。

写在最后

在Redis中Sort Set就是用跳表实现的,但从效率的角度来讲,当数据量比较大时,RBT的效率要高于跳表,Redis为什么用跳表而不是RBT,查了一些资料,最大的可能就是跳表实现更简单。

你可能感兴趣的:(跳表skiplist)