Big-O计算的复杂性:使用哑算法从n total中绘制k个元素的非碰撞子集

时间:2016-01-07 22:37:22

标签: complexity-theory probability

我试图理解这个伪代码的计算复杂性:

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复杂度。有人可以向我解释一下吗?

1 个答案:

答案 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是随机的)