我试图理解这个伪代码的计算复杂性:
values is a set of n unique elements
subset is an empty set
for 0 ... k
X: randomly select a value from values
if value is in subset
goto X
else
insert value into subset
这当然是一种(差)算法,用于从n中选择k个元素的唯一随机子集,并且我意识到更好的选择,但我想了解这个的计算复杂性。
我很容易看到,当允许重复时,这是O(n),因为条件测试从伪代码中消除,每次都有k个选择。
当您必须考虑重复时,有可能需要重新测试,每次迭代都会增加。根据n和k的值,这是一个不可忽视的事实,但我不确定它如何以一般化的方式影响大O复杂度。有人可以向我解释一下吗?
答案 0 :(得分:0)
为k的每个值将值插入子集的概率是(n-k)/ n
每个k循环的迭代次数与该概率成反比
因此,k的每个值的大O表示法将是O((n /(n-K))+ 1)其中1将“插入”子集'。
你必须为k的每个值计算((n /(n-K))+ 1)的总和----最终答案将是 O(((n /(n-K))+ 1)k从1到k)
免责声明 - 这是假设Big(o)适用于使用随机数生成算法的函数(因为X是随机的)