我正在查看skip list implementation in Java,我想知道以下方法的目的:
public static int randomLevel() {
int lvl = (int)(Math.log(1.-Math.random())/Math.log(1.-P));
return Math.min(lvl, MAX_LEVEL);
}
以上方法和
之间有什么区别Random.nextInt(6);
任何人都可以解释一下吗?感谢。
答案 0 :(得分:4)
Random.nextInt
应该提供一个随机变量,其概率分布在(em)[0,6] 的区间内(大约)为discrete uniform distribution。
您可以详细了解此here。
http://puu.sh/XMwn
请注意,内部Random
使用linear congruential generator m = 2^48, a = 25214903917, and c = 11。
randomLevel
代替(大约)使用geometric distribution,其中 p = 0.5 。您可以详细了解分发here。
基本上,randomLevel
返回0
,概率 0.5 ,1
0.25 ,2
与 0.125 等,直到6
0.5 ^ 7 即* 0.0078125 ** - 远远超过 ~0.14 Random.nextInt
强>
现在重要的是a skip list is an inherently probabilistic data structure。通过利用多个稀疏级别的链表,它们可以实现 O(log n)搜索的平均运行时性能 - 类似于平衡二叉搜索树,但不太复杂并使用更少的空间。 Using a uniform distribution here would not be appropriate,看看与较低级别相比,较高级别的人口密度较低(注意:下方,级别向下增长) - 这对于快速搜索而言是必要的。
答案 1 :(得分:1)
就像链接说的那样......
“这给了我们50%的机会让random_level()函数返回0,有25%的几率返回1,12.5%的几率返回2等等......”因此分布不均匀。但是,Random.nextInt()是。可能会选择0到5之间的任何数字。
我没有看过完整的实现,但可能发生的是randomLevel()我们用来选择一个数字,比如n。然后,需要添加到skiplist的元素将具有指针0,1,...,n。您可以将每个级别视为单独的列表。
为什么要使用这样的发行版?均匀分布将需要太多的内存以获得它所带来的好处。通过使用几何分布减少机会,获得“甜蜜”点。现在实现了以更小的存储器占用空间快速获得值的优点。