Чтобы проанализировать алгоритм, вы не хотите идти по очереди, спрашивая: «Сколько времени занимает эта конкретная строка?» Причина в том, что каждая строка не выполняется столько же раз. Например, самая внутренняя строка выполняется целая куча раз, по сравнению с первой строкой, которая запускается только один раз.
Чтобы проанализировать такой алгоритм, попробуйте идентифицировать некоторую величину, значение которой находится в пределах постоянного коэффициента общей продолжительности работы алгоритма. В этом случае это количество, вероятно, будет «сколько раз выполняется строка sum++
?», Так как, если мы знаем это значение, мы знаем общее количество времени, потраченное двумя циклами в алгоритме. Чтобы понять это, давайте выясним, что происходит с этими циклами. На первой итерации внешнего цикла i == 0
, и поэтому внутренний цикл будет выполняться ровно один раз (отсчет от 0 до 0). На второй итерации внешнего цикла i == 1
и внутренний цикл выполняются ровно дважды (сначала с j == 1
, один раз с j == 0
. В более общем плане, на k-й итерации внешнего цикла внутренний цикл выполняет k + 1
раз. Это означает, что общая сумма число итераций внутреннего цикла задаются
1 + 2 + 3 + ... + N
этой величина может быть показана равным
N (N + 1) N^2 + N N^2 N
--------- = ------- = --- + ---
2 2 2 2
из этих двух слагаемых, N^2/2
термина является доминирующим термином роста, и поэтому, если мы игнорируем его постоянную ctors мы получаем время выполнения O (N).
Не смотрите на этот ответ как на что-то, что вы должны запомнить - подумайте о всех шагах, необходимых для ответа. Мы начали с того, что нашли количество, чтобы подсчитать, а затем увидели, как на это количество повлияло выполнение циклов. Из этого мы смогли получить математическое выражение для этой величины, которое мы затем упростили. Наконец, мы взяли полученное выражение и определили доминирующий член, который служит большой-O для общей функции.
Вам нужно вычислить сложность по отношению к N, а не к счетчикам цикла. – thkala