跳跃表(SkipList)

跳跃表在查询、添加、删除的时间复杂度上做到O(logN)

跳跃表(SkipList)是一种基于有序链表的扩展,简称跳表

 

思考:如何才能更快找到一个有序链表的某一节点

以上做法虽然增加了50%的额外空间,但是性能提高了一倍,此外还可以继续提取

当大量的新节点通过逐层比较,最终插入到原链表之后,上层的索引节点会渐渐变得不够用,所以需要考虑如何从新节点当中选取一部分提取到上一层(采用抛硬币的方式,随机决定新节点是否提拔,每向上提拔一层的几率是50%)

之所以使用抛硬币的方式,是因为跳跃表删除和添加的节点是不可预测的,很难用一种有效的算法来保证跳表的索引分布始终均匀

综上:跳跃表插入节点的流程有以下几步

1、新节点和各层索引节点逐一比较,确定原链表的插入位置。O(logN)

2、把索引插入到原链表。O(1)

3、利用抛硬币的随机方式,决定新节点是否提升为上一级索引。结果为“正”则提升并继续抛硬币,结果为“负”则停止。O(logN)

4、总体上,跳跃表插入操作的时间复杂度是O(logN),而这种数据结构所占空间是2N,既空间复杂度是 O(N)。

 

删除流程:

1、自上而下,查找第一次出现节点的索引,并逐层找到每一层对应的节点。O(logN)

2、删除每一层查找到的节点,如果该层只剩下1个节点,删除整个一层(原链表除外)。O(logN)

3、总体上,跳跃表删除操作的时间复杂度是O(logN)。

 

 

跳跃表和二叉查找树的区别:

跳跃表维持结构平衡的成本比较低,完全依靠随机。而二叉查找树在多次插入删除后,徐亚Rebalance来重新调整结构平衡

 

应用:Redis中的Sorted-set

参考链接:

需要了解本文更详细内容的,请参考以下链接

http://blog.jobbole.com/111731/

猜你喜欢

转载自blog.csdn.net/qq_35642036/article/details/82867540