我想在 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) 时间后停止。那可能吗?