我希望从可能的n个元素中均匀随机选择k个元素,而不重复选择相同的数字。有两种简单的方法来解决这个问题。
- 列出所有
n
种可能性。将它们洗牌(你不需要洗牌所有的n
个数字,只需执行 Fisher Yates 的前k
步)。选择前k
个。这种方法需要O(k)
时间(假设分配大小为n
的数组需要O(1)
时间),并且需要O(n)
空间。如果k
相对于n
很小,则会出现问题。 - 存储一组已见元素。从
[0, n-1]
中随机选择一个数字。当元素在集合中时,选择一个新数字。这种方法需要O(k)
空间。运行时间稍微复杂一些。如果k = theta(n)
,则运行时间为O(k*lg(k))=O(n*lg(n))
,因为这是收集优惠券问题。如果k
相对于n
很小,则需要略多于O(k)
的时间,因为有可能(虽然很低)两次选择相同的数字。与上述解决方案相比,这种方法在空间方面更好,但在运行时间方面更差。
我的问题:
是否存在一个对于所有的 k
和 n
都具有 O(k)
时间复杂度和 O(k)
空间复杂度的算法?
O(n)
的空间复杂度。你有n
个元素,存储它所需的空间将随着n
的增长而增加。 - Asad Saeeduddin