Почему большая сложность этого алгоритма O(n^2)?
Я знаю, что большая сложность этого алгоритма O(n^2), но я не могу понять, почему.
int sum = 0;
int i = 1; j = n * n;
while (i++ < j--)
sum++;
даже если мы ставим j = n * n в начале мы увеличиваем i и уменьшаем j во время каждой итерации, поэтому результирующее число итераций не должно быть намного меньше n*n?
7 ответов:
во время каждой итерации вы увеличиваете
iи декрементаjчто эквивалентно просто инкрементируяiна 2. Поэтому общее число итераций равно n^2 / 2, и это все еще O(n^2).
сложность big-O игнорирует коэффициенты. Например:
O(n),O(2n)иO(1000n)все жеO(n)бег времени. Аналогично,O(n^2)иO(0.5n^2)какO(n^2)бег времени.в вашей ситуации вы по существу увеличиваете свой счетчик циклов на 2 каждый раз через свой цикл (так как
j--аналогичноi++). Так что ваше время выполненияO(0.5n^2), но это то же самое, чтоO(n^2)при удалении коэффициент.
у вас будет точно
n*n/2итераций цикла (или(n*n-1)/2еслиnстранно). В биг-О'нотации у нас естьO((n*n-1)/2) = O(n*n/2) = O(n*n)потому что постоянные факторы "не учитываются".
Ваш алгоритм эквивалентен
while (i += 2 < n*n) ...что это
O(n^2/2)что жеO(n^2)потому что большая сложность O не заботится о константах.
пусть m-количество итераций. Тогда,
i+m = n^2-m
Что дает,
m = (n^2-i)/2
в нотации Big-O это подразумевает сложность O(n^2).
Да, этот алгоритм O (n^2).
чтобы вычислить сложность, у нас есть таблица сложности:
O(1) O (log n) O(n) O (n log n)
O(n2) O (n^a) O (a^n) О (н!)каждая строка представляет собой набор алгоритмов. Набор алгоритмов, который находится в O(1), тоже находится в O(n) и O (N^2) и т. д. Но не наоборот. Итак, ваш алгоритм реализует n * n/2 предложений.
O(n)
Итак, набор алгоритмов, которые включите сложность вашего алгоритма, это O(n2), потому что O(n) и O (nlogn) меньше.
например: До n = 100, сумма = 5000. => 100 o С(Н)
извините за мой английский.
несмотря на то, что мы устанавливаем j = n * n в начале, мы увеличиваем i и уменьшаем j во время каждой итерации, поэтому не должно ли полученное число итераций быть намного меньше n*n?
да! Вот почему это O (n^2). По той же логике, это много меньше
n * n * n, Что делает его O (n^3). Это даже O (6^n), по аналогичной логике.big-O дает вам информацию о верхних границах.
Я считаю, что вы пытаетесь спросить, почему сложность - это тета (n) или омега(n), но если вы просто пытаетесь понять, что такое big-O, вы действительно нужно понимать, что она дает верхние границы на функции в первую очередь.