- Есть n номеров.Он был разделен на две части.Каждому принадлежит одна из частей.Выбрать m чисел для сопряжения с данным номером B. С p выбрать номера из первой части, 1-p из следующей части.Реализовано это как loop flow .
first pick a number in n. marked as B.
while (pick m numbers)
r <- random()
if p <= r then
while (1)
randomly pick a number from the first n/2 numbers
if (never picked before and not equal to B) then
picked successful
break
end if
end while
else if p > r
while (1)
randomly pick a number from the other n/2 numbers
if (never picked before and not equal to B) then
picked successful
break
end if
end while
end if
end while
Сложность времени.
m * (mp, n/2) + m * (m(1-p), n/2) = m * (n/2)! * (1/((mp)!(n/2-mp)!) * (1/((m(1-p))!(n/2-m(1-p))!)
?
Что такое сложность комбинации?O((n/2)!/((mp)!(n/2-mp)!)
.Может быть, эта программа не сложная комбинация.Я понятия не имею об этом.
Если числа не разбиты на две части, это означает, что выбирают m чисел из n чисел.То же самое со сложностью во времени выше?
first pick a number in n. marked as B.
while (pick m numbers)
while (1)
randomly pick a number from the n numbers
if (never picked before and not equal to B) then
pick successful
break
end if
end while
end while
Сложность времени.
Это m * (m, n)= m * n!/m!(n-m)!
?Что такое O(n!/m!(n-m)!)
?
Если m=1
, O(n!/m!(n-m)!)=O(n)
или O(n!/m!(n-m)!)=O(n)=O(1)
?
Если m=2
, O(n!/2!(n-2)!)=O(1/2 n(n-1))=O(n^2)
?Но он может работать только дважды и получить два правильных числа, так почему бы не O(2)
?И если есть номер, который был выбран ранее.Вы должны положить его обратно, а затем выбрать снова.Так, чтобы это могло бежать три раза?Так O(n^2)
средняя сложность времени?Что является худшим?
Если m<<n
, O(n!/m!(n-m)!)
близко к O(n)
или O(n!/m!(n-m)!) ~ O(n) ~ O(1)
?
Я путаюсь со сложностью времени.Можете ли вы помочь мне проанализировать это?Есть повторных .Но я не очень хорошо понял в моем loop
случае.
[ doc 1 ] [ doc 2 ] получить все комбинации. Мне нужно получить только одну из комбинаций, а не все .
Спасибо.