#java #algorithm #time-complexity #big-o
#java #алгоритм #сложность по времени #big-o
Вопрос:
Привет, я новичок в нотации Big O, и у меня возникли проблемы с указанием big O для следующего, если кто-нибудь может любезно объяснить мне, как это решить, пожалуйста
int sum=1;
for(int count=n; count>0; count/=2) {
sum=sum*count;
}
Ответ №1:
Поскольку каждый раз count
делится на 2, это будет Theta(log n)
(от n
до 0
). Следовательно, он O(log(n))
также находится внутри.
Комментарии:
1. Почему theta является ответом для Big O?
2. @GiorgiTsiklauri Основываясь на
Theta
определении, еслиf(n)
оно inTheta(g(n))
, оноO(g(n))
также будет in .3. В данном случае это правда. Я хотел указать это и в вашем ответе, что вы и сделали.
4. @GiorgiTsiklauri все время, это правда. Как я уже сказал, это связано с определением
Theta
иO
, и это можно доказать математически.
Ответ №2:
В первой строке код будет выполняться один раз, поэтому для него сложность равна O (1). Во второй строке цикл for будет выполняться до count> 0, и мы видим, что он будет делиться на 2 при каждом запуске цикла, и поэтому он будет продолжаться непрерывно бесконечное время. Таким образом, в принципе, вы не можете применять нотацию Big O в бесконечном цикле. И поэтому вы также не можете применять big O к коду внутри цикла. Итак, если существует какое-либо O (бесконечное), то это может быть ответ, но он не будет существовать. Таким образом, вы не можете определить временную сложность до тех пор, пока n<=0. если n<=0, то код будет выполняться только один раз, а сложность будет O (1).
Ответ №3:
количество уменьшается вдвое за каждую итерацию. Если n = 64
:
step1 => count = 64
step2 => count = 32
step3 => count = 16
...
Следовательно, его наихудший сценарий имеет O(log n)
временную сложность.
Однако в этом случае тело вашего цикла имеет постоянное количество операций, поэтому сценарии наилучшего, наихудшего и среднего случая одинаковы, и:
Ω(log n) = Θ(log n) = O(log n)