我希望生成n个不同的数字,这些数字在1到N之间(当然n<=N)。N可能非常大。
如果n很小,一种有效的方法是生成一个数字并将其与我们已经得到的集合进行比较,以确保它是一个新数字。它需要O(n^2)时间和O(n)内存。
如果n相当大,我们可以使用Fisher-Yates随机置换算法生成随机排列(在n步后停止)。它需要O(n)时间,但我们也必须使用O(N)内存。
问题在于,如果我们不知道n有多大怎么办? 我希望该算法只使用O(n)内存,并在O(n)时间内停止。这是否可能?
问题在于,如果我们不知道n有多大怎么办? 我希望该算法只使用O(n)内存,并在O(n)时间内停止。这是否可能?