算法 - redis的zslRandomLevel函数的实现原理是什么?
伊谢尔伦
伊谢尔伦 2017-04-21 11:16:19
[Redis讨论组]

hi,all

最近在看redis的代码(huangz注释过的),是2.6版本的。在看到t_zset.c这个文件的时候,了解到跳跃表的概念,大概原理是懂的,但是不太了解这个生成随机层数的算法原理。不知道有没童鞋能介绍下这段代码其实是怎么做到模拟幂次定律的?


/* Returns a random level for the new skiplist node we are going to create. * The return value of this function is between 1 and ZSKIPLIST_MAXLEVEL * (both inclusive), with a powerlaw-alike distribution where higher * levels are less likely to be returned. * * 返回一个介于 1 和 ZSKIPLIST_MAXLEVEL 之间的随机值,作为节点的层数。 * * 根据幂次定律(power law),数值越大,函数生成它的几率就越小 * * T = O(N) */ int zslRandomLevel(void) { int level = 1; // TODO 了解这个公式背后的数学原理 while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF)) level += 1; return (level<ZSKIPLIST_MAXLEVEL) ? level : ZSKIPLIST_MAXLEVEL; }
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(1)
天蓬老师

http://blog.csdn.net/kisimple/article/details/38706729
这个解释的比较清晰,也可以去参考skiplist论文。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号