跳过列表中的随机级别功能

时间:2012-08-22 05:54:16

标签: java

我正在查看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);

任何人都可以解释一下吗?感谢。

2 个答案:

答案 0 :(得分:4)

Random.nextInt应该提供一个随机变量,其概率分布在(em)[0,6] 的区间内(大约)为discrete uniform distribution。 您可以详细了解此herehttp://puu.sh/XMwn

请注意,内部Random使用linear congruential generator m = 2^48, a = 25214903917, and c = 11


randomLevel代替(大约)使用geometric distribution,其中 p = 0.5 。您可以详细了解分发here

http://puu.sh/XMwT

基本上,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。您可以将每个级别视为单独的列表。

为什么要使用这样的发行版?均匀分布将需要太多的内存以获得它所带来的好处。通过使用几何分布减少机会,获得“甜蜜”点。现在实现了以更小的存储器占用空间快速获得值的优点。