【问题标题】:Algorithm design manual (Steven Skiena) regarding random samples on Ordered pairs Page 250关于有序对上的随机样本的算法设计手册 (Steven Skiena) 第 250 页
【发布时间】:2015-09-15 07:06:53
【问题描述】:

给出以下解释

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

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

很明显,这确实会生成无序对,因为 i

但是它们是统一的吗?答案是不。发生的概率是多少 生成对(1,2)?有 1/(n−1) 的机会得到 1, 然后有 1/(n−1) 的机会得到 2,得到 p(1,2) = 1/(n - 1)2。但是得到 (n − 1,n) 的概率是多少?再次,那里 有 1/n 的机会获得第一个数字,但现在只有一个 第二个候选人的可能选择!这对将出现 n 次 比第一次更频繁!问题是较少的对开始 大数字比小数字。我们可以通过以下方式解决这个问题 准确计算无序对如何以 i 开头(确切地说 (n - i)) 并适当地偏置概率。第二个值可以是 从 i + 1 到 n 均匀随机选择。 但是,让我们利用以下事实,而不是通过数学计算 均匀地随机生成 n2 个有序对很容易。随便挑 两个相互独立的整数。忽略排序(即 , 将有序对置换为无序对 (x,y) 使得 x

  1. 在上面的段落中“问题是较少的对以开头 大数字比小数字。”这不应该是更多对而不是更少对

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

编辑

  1. 在上一段“忽略排序(即 , 将有序对置换为无序对 (x,y) 使得 x

谢谢

【问题讨论】:

  • 你检查过the errata吗?
  • 我做了,但显然我有它的旧版本。所以感谢您提供的链接。您提供的勘误表仍然无法解释问题 1。

标签: algorithm data-structures random-sample


【解决方案1】:

在上面的段落中“问题在于以大数字开头的配对比小数字少。”这不应该是更多对而不是更少对

不,它更少。:

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
...

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

是的,那里缺少“许多”。

在上面的段落中“忽略排序(即,将有序对置换为无序对 (x,y) 以使 x

n*n 有可能在顺序确实重要的情况下生成对(1 22 1 是不同的对)。由于您随后继续忽略排序,1 22 1 将相同,因此您有两个有利的情况。

这并不能说明您丢弃 x x 对的事实。那么它将是2 / (n*(n - 1)),因为如果您选择一次x,那么您第二次选择的可能性只有n - 1

【讨论】:

  • 感谢您的解释。您介意解释一下这对 i j 对不一致的结果有什么影响吗?这是否意味着如果以大数字开头的对有更高的重复机会
  • @user119020 是的,这偏向于“更大”的对。
  • 再次感谢。但我仍然无法绕过它。我可以理解,如果这对以大数字开头,那么同一对很有可能被重复。但是第一个数字是一个大数字并没有偏见。所以让我们说如果这运行了 10 次,那么是不是第一个数字是小数和大数的概率不相等吗?因此你不会得到均匀分布的结果吗?
  • @user119020 假设我们要为n = 4 生成随机无序的n 数字对。这些将是1 2; 1 3; 1 4; 2 3; 2 4; 3 4。请注意,其中三个以1 开头,其中两个以2 开头,一个以3 开头。你是对的,第一个数字没有偏差,这正是问题所在。应该有偏差:3 出现的次数应该少于1。但它不会,所以3 4 会出现比它应该出现的次数更多。您应该将第一个随机数生成器偏向于更频繁地选择较小的数字。
【解决方案2】:

假设您的 n 个项目的索引是 0..(n-1),random(n) 给出一个随机数 ≥ 0 并且

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) 对的事实(交换它们将无效)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2010-10-18
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多