Это довольно запутанный анализ, поэтому давайте разберем его по частям, чтобы иметь смысл вычислений:
Самый внешний цикл выполняется для n-1 итераций (так как 1 ≤ i Следующий цикл внутри него выполняет (i² - 1) итераций для каждого индекса i внешнего цикла (так как 1 ≤ j В целом это означает, чтоколичество итераций для этих двух циклов равно сумме (i²-1) для каждого 1 ≤ i вычислению суммы первых n квадратов и является порядком величины O (n³).Примечание Оператор по модулю% требует постоянного времени (O (1)) для вычисления , поэтому проверка условия if (j % i == 0)
для всех итераций этих двух циклов не повлияет на время выполнения O (n³).
Теперь поговорим о внутреннем цикле внутри условного.
Мы заинтересованы в том, чтобы узнать, сколько раз (и для каких значений j) это, если условие оценивается как истинное, поскольку это будет определять, сколько итераций будет выполняться самый внутренний цикл.Практически говоря, (j% i) никогда не будет равно 0, если j Обратите внимание, что для данного числа i (j% i == 0) тогда и только тогда, когда i является делителем числа j.Поскольку наш диапазон равен (1 ≤ j Если это сбивает с толку, рассмотрим этот пример:
Давайте предположим, что i = 4. Тогда наш индекс j будет перебирать все значения 1, .., 15 = i² и (j% i == 0) будет верно для j = 4, 8, 12 - точно (i - 1) значений.Таким образом, самый внутренний цикл будет выполнять (12 + 8 + 4 = 24) итераций.
Таким образом, для общего индекса i мы будем искать сумму: i + 2i + 3i + ... + (i-1) i, чтобы указать количество итераций, которые сделает самый внутренний цикл.
И это можно обобщить, рассчитав сумму этой арифметической прогрессии.Первое значение - это i, а последнее - (i-1) i, что приводит к сумме (i³ - i²) / 2 итераций цикла k для каждого значения i.В свою очередь, сумма этого для всех значений i может быть вычислена путем вычисления суммы кубов и суммы квадратов - для общего времени выполнения O (n⁴) итераций самого внутреннего цикла (kloop) для всех значений i.
Таким образом, в целом, время выполнения этого алгоритма будет суммой обеих сред выполнения, которые мы рассчитали выше.Мы проверили оператор if O (n³) раз, и самый внутренний цикл выполнялся для O (n⁴), поэтому, предполагая, что // Simple computation
выполняется в постоянное время, наше общее время выполнения уменьшится до:
O (n³) +O (n⁴) * O (1) = O (n⁴)