【问题标题】:Generate N quasi random numbers in less than O(N)在小于 O(N) 的时间内生成 N 个准随机数
【发布时间】:2012-04-08 16:51:19
【问题描述】:

这是受求职面试中一个问题的启发:您如何有效地生成 N 个唯一随机数?他们的安全性和分布/偏见并不重要。

我提出了一种调用 rand() N 次并通过反复试验消除欺骗的幼稚方法,从而得到低效且有缺陷的解决方案。然后我读了this SO question,这些算法非常适合获得高质量的唯一数字,它们是 O(N)。

但我怀疑有一些方法可以在小于 O(N) 的时间复杂度内为虚拟任务获取低质量的唯一随机数。我有一些可能的想法:

  • 存储许多预先计算的列表,每个列表包含 N 个数字并随机检索一个列表。固定 N 的复杂度为 O(1)。使用的存储空间为 O(NR),其中 R 是列表的数量。
  • 生成 N/2 个唯一随机数,然后将它们除以 2 个不相等的部分(奇数的 floor/ceil,偶数的 n+1/n-1)。我知道这是有缺陷的(重复可能会弹出)并且 O(N/2) 仍然是 O(N)。这更值得深思。
  • 生成一个大随机数,然后通过一些固定操作(如按位运算、分解、递归、MapReduce 或其他方法)从中提取更多变体。
  • 以某种方式使用quasi-random sequence(不是数学专家,只是用谷歌搜索了这个词)。

你的想法?

【问题讨论】:

  • 他们是抱怨您的解决方案的大 O 复杂性太高,还是只是效率太低?因为有比试错法更有效的方法来生成给定范围内的唯一数字。此外,您的解决方案不是 O(n) 最坏的情况 - 要从 n 生成 n 的随机排列,由于所需的重试次数,它将在 O(n^2) 时间内运行。

标签: algorithm random


【解决方案1】:

大概这个例程有某种输出(即,结果被写入某种数组)。填充大小为 N 的数组(或其他一些数据结构)至少是 O(N) 操作,所以你不能做得比 O(N) 更好。

【讨论】:

  • 感谢您的解释,我相应地修改了一个问题。
  • @pati- 您最好接受 Oli 的回答,然后发布第二个问题。这样,任何搜索您的原始问题的人都可以直接得到答案。
【解决方案2】:

因此,您可以生成一个随机数,如果结果数组包含它,只需将已生成数字的最大数量添加到其中。

检测已经生成的数字是否为 O(1)(使用哈希集)。所以它是 O(n) 并且只有 N 个 random() 调用。

当然,这是假设我们没有超出上限(即 BigInteger)。

【讨论】:

  • 是的,我猜这是类似于 Floyd algorithm 的简单且简单的 O(N) 解决方案,但“经过数学验证的分发质量”较差。
  • 分布不是您的问题所关心的问题:“它们的安全性和分布/偏见无关紧要。”
猜你喜欢
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2019-11-19
  • 2015-04-08
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多