简易实现:
Redis中跳跃表的实现
光看Redis设计与实现中,跳跃表这一个数据结构还是有许多不明白的概念的,比如:每一个zskiplistNode的层(level)为什么指向没有什么规律?
这个问题其实有一个前置概念,跳跃表是什么。知道了跳跃表是什么之后,才能明白Redis中是怎么实现跳跃表的。
代码级实现:
SkipList的原理与实现,如果看Redis设计与实现过后,有一些疑问的话,可以先看这一篇文档。其实Redis中的层概念,用多级索引来理解会清晰一些。
如果跳跃表中所有节点的层数都是一级的话,这个跳跃表就退化成了一个有序单链表。对于这个有序单链表来说,要找到一个固定的值,除了遍历别无他法。如果说是,这个数据结构不是链表而是数组,那我们可以使用二分法来进行对数级别的优化,使得时间复杂度降低到O(logN)级别的。在这个概念之上,那我们在每一个二分节点上,先建立一个层的概念,可以直接通过一次二分达到,不是就将算法复杂度减半了。
那这个层数到底是怎么决定?文档中提到是使用了幂次定律随机生成一个介于1和32之间的值作为层的数量。幂次定律规定,越大的数出现的概率越小。