跳跃表的节点插入层数的计算

今天学习Redis中,关于有序集合,底层讲到是由跳跃表实现,由于和红黑树有几乎相同效果,并且实现更为简单而备受青睐。
关于跳跃表的查找很简单,从顶层到下层,一步步往下层推移,有点类似二分查找。此处不多赘述,举个简单例子:

转自[https://www.cnblogs.com/buptleida/p/12838880.html]

本次重点笔记是插入节点后,对应索引的层数,是如何决定的。
首先明确redis5之前到某一版本时最大层数是32层,往上加一层概率是1/2;在redis5之后最大层数为64,向上层数扩展概率变为1/4.(以下介绍用redis5举例)
具体算法为:


参考《Redis5设计与源码分析》

简单概括就是,首先初始值为最小层数1,然后用一个随机数的低16位作比较,如果小于0xFFFF(换成二进制就是16个1)的1/4(实际就是往1/4概率靠拢)就层数+1并继续循环,直到中标到0xFFFF的另3/4即可返回,当然要和最大值做min操作。

假设1/4概率为p,可见如果要增加到n层数就需要 p(n-1)(1-p) 概率是越来越小的,所以层数越大,概率越小

你可能感兴趣的:(跳跃表的节点插入层数的计算)