【问题标题】:A probability theory problem in skiplist's C implementskiplist 的 C 实现中的概率论问题
【发布时间】:2021-12-15 04:28:50
【问题描述】:

这些天我正在查看Algorithms in C, Parts 1-4 中的skiplist 代码,当将新值插入skiplist 时比我想象的要复杂。在插入过程中,代码应确保新值以1/2^i的概率插入到级别i,并通过以下代码实现:

static int Rand()
{
    int i, j = 0;
    uint32_t t = rand();
    for (i = 1, j = 2; i < lg_n_max; i ++, j += j)
        if (t > RANDMAX / j)
            break;
    if (i > lg_n)
        lg_n = i;
    return i;
}

我不知道Rand函数是如何保证这一点的,你能帮我解释一下吗,谢谢。

【问题讨论】:

    标签: c algorithm probability skip-lists


    【解决方案1】:

    大概RANDMAXRAND_MAX

    忽略舍入问题,rand 的返回值有一半高于RAND_MAX / 2,因此有一半时间循环以i = 1 退出。

    如果循环继续,它会将i 更新为 2,将j 更新为 4。然后剩下的一半返回值(总数的 3/4)高于RAND_MAX / 4,因此,四分之一的时间,循环以i = 2 退出。

    进一步的迭代以相同的方式继续,每次迭代退出时返回值的一部分是前一次的一半,直到达到 lg_n_max 限制。

    因此,忽略舍入问题和最终限制,例程返回 1 的一半时间、2 的四分之一时间、3 的八分之一时间,等等。

    lg_n 未在例程中定义。它似乎是迄今为止例程返回的最大值的记录。

    【讨论】:

    • 非常感谢,我已经完全明白了。
    【解决方案2】:

    非常感谢Eric Postpischil的回答,我已经明白如何保证概率了。我有一个更容易理解的答案: t0RANDMAX 之间的随机值,我们假设循环将运行2 次。在第一个循环中,t 的值小于RANDMAX/2^1,表示t 的值落在0RANDMAX/2 的范围内,这种概率为1/2。在第二个循环中,记住t的值在(0, RANDMAX/2^i)的范围内,t的值小于RANDMAX/2^2,意味着t的值在0的范围内到RANDMAX/2^2,这个概率也是1/2,因为(0, RANDMAX/2^2)的范围只是第一个循环范围的1/2,而第一个循环显示t的值在@的范围内987654342@。注意第二次循环的概率是条件概率,它是基于第一次循环的概率,所以第二次循环的概率是1/2*1/2=1/4
    简而言之,每个循环都会为最后一个循环的概率带来* 1/2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 2020-06-10
      • 2020-02-12
      • 1970-01-01
      相关资源
      最近更新 更多