我想在1和N之间生成n个不同的数字(当然,n < = N)。 N可能非常大。 如果n非常小,一种有效的方法是生成一个数字,并将其与我们得到的集合进行比较,以确保它是一个新数字。它需要O(n^2)时间和O(n)内存。 如果n很大,我们可以使用Fisher-Yates shuffle算法生成一个随机排列(n步后停止)。它需要O(n)时间,但我们也必须使用O(N)内存。在一个范围内生成不同的随机数
这是问题。如果我们不知道n有多大,我们该怎么办? 我希望算法只使用O(n)内存,并在O(n)时间后停止。那可能吗?
这是一个非常糟糕的重复 - N有1000,这里可能是“非常大”。 – jrok
@j_random_hacker使用O(N)内存(不是O(n))。 – Dukeling
@jrok:足够公平,近距离投票撤回。但是我注意到该页面上的O(1) - 空间解决方案:http://stackoverflow.com/a/202225/47984。 –