Трудно понять, как найти время выполнения в тэта-записи вложенного цикла for - PullRequest
1 голос
/ 06 февраля 2020

У меня есть тройное вложенное значение для l oop, которое нужно выразить в тета для времени выполнения (сложность).

Я закончил с тета (n ^ 3), но не уверен на 100%, если мои рассуждения верны.

func(n)
x = 0 
for i = 1 to n do
   for  j = 1 to i do
      for k = j to i + j do
          x <- x + 1
return x

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Вы можете решить этот шаг за шагом от внутреннего к внешнему l oop:

func(n)
x = 0 
for i = 1 to n do
   for  j = 1 to i do
      for k = j to i + j do
          x <- x + 1
return x

Начните с самого внутреннего утверждения. x <- x + 1 - это отдельная инструкция, поэтому

func(n)
x = 0 
for i = 1 to n do
   for  j = 1 to i do
      for k = j to i + j do
          Theta(1)
return x

Следующее l oop выполняется (i + j) - j + 1 = i + 1 раз:

func(n)
x = 0 
for i = 1 to n do
   for  j = 1 to i do
      Theta(i)
return x

Продолжая таким образом, мы получаем:

func(n)
    x = 0 
    for i = 1 to n do
       Theta(i^2)
    return x

и, наконец, используя тот факт, что сумма квадратов от 1 до n равна n(n + 1)(2n + 1)/6 = n^3/3 + n^2/2 + n/6 = Theta(n^3):

func(n)
    x = 0 
    Theta(n^3)
    return x

Поскольку все остальные операторы выполняются в постоянном времени, общая сложность Theta(n^3).

0 голосов
/ 06 февраля 2020

Посмотрим. Предполагая, что n очень велико (иначе сложность не будет проблемой). Ваш внешний l oop имеет n шагов. Посредник l oop имеет примерно n / 2 шагов.

Чтобы понять внутреннее l oop, давайте подумаем о его границах. Конец i + j, а начало j, поэтому количество элементов i + j - j + 1, то есть i + 1. Это может быть очень и очень мало, если i = 1, или очень очень большое, если i практически бесконечен (n).

Бесконечность имеет свойство, которое

Бесконечность / 2 = Бесконечность

Таким образом, даже n / 2 будет не конечным, если мы примем бесконечность в качестве значение n. Итак, ваш результат верный, у нас есть тэта (n ^ 3), конечно, мы не очень заботимся о добавлении некоторого постоянного значения или умножении n на конечное строго положительное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...