【问题标题】:Generate different random numbers within a range [duplicate]在一个范围内生成不同的随机数[重复]
【发布时间】:2013-10-31 14:59:58
【问题描述】:

我想在 1 和 N 之间生成 n 个不同的数字(当然是 n

问题来了。如果我们不知道 n 有多大,我们该怎么办? 我希望算法只使用 O(n) 内存并在 O(n) 时间后停止。这可能吗?

【问题讨论】:

  • 这是一个非常糟糕的副本 - N 有 1000 个,这里可能是“非常大”。
  • @j_random_hacker 使用 O(N) 内存(不是 O(n))。
  • @jrok:很公平,接近投票被撤回。但是我确实注意到该页面上的 O(1) 空间解决方案:stackoverflow.com/a/202225/47984
  • @Floris:我的解释是他们想要一个online算法——也就是说,以后总是可以廉价地添加一个新的、不同的样本。
  • @j_random_hacker:如果将集合实现为哈希表,则可以得到 O(1)(至少在预期时间内)。

标签: c++ c algorithm random


【解决方案1】:

您基本上可以对非常小的 n 做同样的事情,但只是让检查更有效率。例如,检查是否已经生成数字的简单方法是线性搜索先前生成的值的列表。对于未知的 n,您可以将先前生成的值集保持排序,以便您可以使用更有效的搜索来识别重复项。使用朴素的方法,该算法需要 O(n2) 时间,但通过以前的结果进行更智能的搜索可以将其减少到 O(n*log2 n)。

【讨论】:

  • 将一个值插入一个已排序的数组需要 O(n) 时间。如果 n 是 N 的足够大的一部分,以至于重复经常出现,那么时间复杂度中会出现一个指数项,以说明重新运行它所花费的时间,并将占主导地位。
  • @j_random_hacker:数组不需要排序。它可以很容易地成为一个哈希表。
  • @j_random_hacker 所以不要使用数组。一棵树可以进行 O(log n) 的搜索和插入,并且易于保持排序。
  • @bames53:我建议改变你的回答,但我不认为它解决了我发现的主要问题——当已经选择的数字变得足够密集时会产生指数时间复杂度.
  • @j_random_hacker:您可以以指数方式重新散列哈希表,从而产生摊销的线性插入成本,就像向量一样。随机数也是理想的哈希表键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多