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

今天学习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) 概率是越来越小的,所以层数越大,概率越小

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容