Тройной вложенный цикл For с двумя независимыми внешними циклами и одним зависимым внутренним циклом

#algorithm

#алгоритм

Вопрос:

У меня есть следующая последовательность циклов.

   TripleLoop(int n)
   for i <- 1 to n
       for j <- 1 to n
          for k <- j to n 
   do num <- j   i
   return num
  

Я знаю, что два внешних цикла выполняются «n» раз.
Таким образом, мы имеем n * n = n ^ 2 для двух внешних циклов.
Однако третий внутренний цикл зависит от переменной «j».

Как мне начать решать эти типы вложенных зависимых циклов for? Я не уверен, следует ли мне умножать или добавлять третий внутренний цикл к двум внешним циклам.

Кто-нибудь может мне здесь помочь?

Комментарии:

1. В чем конкретно заключается проблема?

2. У меня возникли проблемы с вычислением времени выполнения для внутреннего цикла for, потому что оно зависит от индекса j.

Ответ №1:

Ну, внутренний цикл (тот, у которого k в качестве итератора) выполняется n-j 1 раз, поскольку он начинается с j и заканчивается на n .

Общее количество шагов, выполняемых таким образом средним for циклом, равно сумме шагов за итерацию для j , так что это означает, что общее количество раз, когда мы запускаем тело внутреннего цикла for, равно:

  n
---
                  n * (n   1)
/    n - j   1  = -------------
---                    2
j=1
  

итак, после одной итерации внешнего цикла (с i в качестве итератора) у нас есть n*(n 1)/2 шаги.

Таким образом, в общей сложности наш алгоритм будет запускать тело внутреннего цикла в общей сложности n * n * (n 1)/2 раз. Поскольку внешний цикл выполняется n раз, и количество шагов в теле этого цикла не зависит от значения i самого цикла.

Если мы рассматриваем num <- j 1 часть для выполнения в постоянное время (ну, строго говоря, суммирование огромных чисел не может быть выполнено в постоянное время), то это, таким образом, алгоритм O (n3).

Комментарии:

1. Итак, почему это O (n ^ 3), если внутренний цикл зависит от индекса j. Я думал, что все циклы for должны выполняться от 1 до n, чтобы весь алгоритм был равен O (n ^ 3).

2. @JohnDoeX: потому что, как указано в ответе, сумма n-j 1 с j от 1 до n , равна n*(n 1)/2 , что, конечно, является O (n ^ 2) . Имейте в виду, что O (n ^ 2) — это набор функций . Количество шагов не равно n ^ 3 , то есть n ^ 2 * (n 1)/2 , но для временной сложности это не имеет значения.