对于以下问题,我提供了一种算法;但是,我不确定计算出的复杂度是否正确。由于我不知道它将执行多少次,因此我对计算while循环的复杂性感到非常困惑。
问题:
从n个不同整数的列表中随机而不重复地选择k个项 (即,一个项目不能选择多次)。假设您有一个功能 random(m)随机选择一个介于1到m之间的整数。
我的算法+复杂性:
int count = k; O(1)
int list[] = new list[k]; O(1)
for(int i=0; i<list.length(); i++) O(k)
{
list[i] = -1;
}
while(count > 0) O(k+a); where a is an int number
{
int guess = random(n); O((k-1)+a)
boolean found = false; O((k-1)+a)
int init = 0; O((k-1)+a)
while(list[init] != -1) O(k+a)*O(k-1); Here I thing that
{ the worse case happens when the
if(list[init] == guess) array is nearly full, there
found = true; is only one cell left and we
init++; keep search for a unique number.
}
if(!found) O(1)
{
list[init] = guess;
count--;
}
}
return list;
因此,我认为总体复杂度为O(k + a)* O(k-1),其中K是我们要从列表中提取的唯一项的数量,而a是整数。
如果您能帮助我解决此问题,我非常感谢。