Вы говорите, что поскольку внутренний цикл переходит от i к i², сложность не должна быть O (i²).
Сложность действительно не более O (i²), но:
- Для i = 1 2-й цикл выполняется 1 раз
- Для i = 10 , 90 раз (не слишком далеко от 100)
- Для i = 100 , 9900 раз (не слишком далеко от 10000)
- Для i = 1000 , 999000 раз (не слишком далеко)от 1M)
Каждый раз, когда вы умножаете i на число n (в моем случае 10), внутренний цикл будет выполняться чуть больше, чем n² больше раз.Это показывает, что сложность составляет по крайней мере O (i²).
Вывод: сложность составляет точно (= максимум + по крайней мере) O (i²)
Общие знания о сложности:
Большая часть кода, который вы когда-либо увидите, имеет сложность в нижеуказанном упорядоченном списке или их комбинацию (подробнее об этомпозже):
n^0 (= constant) < log2(n) < sqrt(n) < n < n^2 < exp(n)
Сложность - это термин, который применяется только для очень больших чисел.
Он не имеет значения для небольших значений, как вы увидите, например, здесь ,
В вашем случае, с очень большим значением, i²
подавляет перед i
, поэтому O(i²-i) = O(i²)
.
В общем, сложность только умножается:
- Ваш внешний цикл равен
O(n)
- Ваш внутренний цикл равен
O(n^2)
- Результат: пример кода:
O(n^3)
ОчевидноКогда вы комбинируете сложности, порядок останется неизменным.
Например, мой ранее упорядоченный список, умноженный на O(n)
, станет:
n < n*log2(n) < n*sqrt(n) < n^2 < n^3 < n*exp(n)
Как видите, благодаряв моем предыдущем списке были значения между n и n ^ 2.