关于有序对上的随机样本的算法设计手册(Steven Skiena)

时间:2015-09-15 07:06:53

标签: algorithm data-structures random-sample

给出以下解释

  

问题:我们需要一种有效且无偏见的方式来生成随机数   成对的顶点以执行随机顶点交换。提出一个有效的   算法从{1,(n 2)无序对生成元素   。 。 。 ,n}统一随机。

     

解决方案:令人惊讶的是,均匀地生成随机结构   微妙的问题。请考虑以下过程来生成随机   无序对:i = random int(1,n-1); j = random int(i + 1,n);

     很明显,这确实产生了无序对,因为i<学家   此外,很明显所有(n 2)个无序对确实可以   生成,假设random int统一生成整数   两个论点之间。

     

但他们是否统一?答案是不。什么是概率   生成对(1,2)?获得1的概率为1 /(n-1),   然后得到2的1 /(n-1)几率,得到p(1,2)= 1 /(n    - 1)2。但是得到的概率是多少(n-1,n)?再一次,那里   获得第一个数字的可能性是1 / n,但现在只有一个   第二位候选人的可能选择!这对将出现n次   比第一次更频繁!问题是较少的对开始   大数字而不是小数字。我们可以解决这个问题   准确计算无序对如何从i开始(确切地说(n - i))   并适当地偏向概率。那么第二个值就可以了   从i + 1到n随机均匀地选择。   但是,不要通过数学计算,让我们利用这个事实   随机生成n2个有序对很容易。选择   两个整数相互独立。忽略订购(即   ,将有序对置换为无序对(x,y),使x <0。 Y)   给出了每个无序对的2 / n ^ 2概率   不同的元素。如果我们碰巧生成一对(x,x),我们就会丢弃   它再试一次。我们将随机均匀地得到无序对   使用以下算法的恒定预期时间:

  1. 在上一段中“问题是较少的配对开始 大数字而不是小数字。“这不应该是更多的对而不是更少的对

  2. 在上面的段落中“我们可以通过精确计算无序对以i开头的方式来解决这个问题(确切地说(n - i))”这不应该是多少无序对而不是无序对

  3. 修改

    1. 在上一段“忽略排序(即 ,将有序对置换为无序对(x,y),使x <0。 Y) 给出了每个无序对的2 / n ^ 2概率 不同的元素。“概率2 / n ^ 2如何得出?
    2. 谢谢

2 个答案:

答案 0 :(得分:2)

  

在上面的段落&#34;问题是较少的对数从大数字开始而不是小数字。&#34;不应该是更多的配对而不是更少的配对

不,它少了。:

n - 1 pairs start with 1 (1 2; 1 3; ...; 1 n)
n - 2 pairs start with 2 (2 3; 2 4; ...; 2 n)
n - 3 pairs start with 3
...
  

在上面的段落&#34;我们可以通过精确计算无序对如何从i开始(完全(n-i))&#34;来解决这个问题。不应该有多少无序对而不是无序对

是的,有很多&#34;很多&#34;那里。

  

在上面的段落&#34;忽略排序(即,将有序对置换为无序对(x,y),使得x

n*n种生成对的可能性,其中顺序很重要(1 22 1是不同的对)。由于您继续忽略排序,1 22 1都是相同的,因此您有两个有利的案例。

这并不能解释您丢弃x x对的事实。然后它会是2 / (n*(n - 1)),因为如果你选择x一次,那么第二个选择只有n - 1种可能性。

答案 1 :(得分:0)

假设你的n项的索引是0 ..(n-1),random(n)给出随机数≥0且&lt; 0。 n:

i = random(n)
j = random(n-1)
j = (i+j+1) % n

现在,i≠j的每一对(i,j)具有恰好1 /(n(n-1))的概率。显然,交换(i,j)与交换(j,i)具有相同的结果。

你也可以这样做:

i = random(n)
j = random(n)

忽略这可能导致(i,i)对的事实(交换它们将没有效果)。