#c #time-complexity
Вопрос:
В соответствии с ключом ответа, ответ будет O(N). У меня не было достаточно времени, чтобы рассмотреть его внимательно. Я думал, что это i , а не i/=2 в первом цикле, поэтому я написал O(N^2). Но сейчас я не уверен, что это правильно. Я думаю, что это должно быть O(log n * log n).
Код:
int count = 0;
for (int i = N; i > 0; i /=2)
for (int j = 0; j < i; j )
count ;
Изображение:
Комментарии:
1. Да, мне очень жаль. Я загрузил не ту картинку раньше. Сейчас он обновлен, @Yunnosch
2. Внешний цикл-o(logn), внутренний-o(n) , следовательно, у нас есть o(nlogn), если я не ошибаюсь
3. @vpa1977, логика сложности не так проста. Это
O(N)
по причинамr3mainder
вашего ответа.4. Следовательно, я ошибаюсь -)
5. Это зависит от того, что
N
есть. Если это константа, вы можете выбросить «большое О» в окно, потому что циклы будут оптимизированы, и изучение того, какое «большое О» у них было бы, если бы их не было, не очень полезное знание. Лучше понять, как на самом деле работают программы, компиляторы и компьютеры.
Ответ №1:
- На первой итерации внешнего цикла внутренний цикл выполняется N раз
- На второй итерации внутренний цикл выполняется N/2 раза
- На каждой последующей итерации внутренний цикл выполняется вдвое меньше раз, чем на предыдущей итерации
Общее количество итераций равно N N/2 N/4 … 1, что примерно равно 2N.
Следовательно, общее количество итераций равно O(N)
Комментарии:
1. На первой итерации внешнего цикла внутренний цикл выполняется N раз. На второй итерации внутренний цикл выполняется N/2 раза. Итак, код выполняется более N раз, почему временная сложность O(N). Разве это не должно быть O(N*log N) ? @Эллиотт
2. Это геометрическая последовательность с q = 1/2
3. @UnknownHuman, вы поймете, почему
r3mainder
это правильно, если узнаете о том, как суммировать геометрическую последовательность.4. О, хорошо. Теперь я это понял. Его временная сложность равна O(n log n), которая записывается как O(n). Спасибо. Это был непростой вопрос, по крайней мере, для начинающих..
5. @UnknownHuman, извините, но это еще не все. На самом деле это примерно
O(2N)
так , но мы отбрасываем постоянные факторы, так что это становитсяO(N)