O(n) и функция временной сложности данного кода

если следующая структура цикла находится в разделе Анализ верхней границы. Вычисляет ли он по-прежнему O(n^2)? Я смущен, поскольку внутренний цикл зависит от внешнего цикла, и с каждой внешней итерацией внутренний цикл for зацикливается на один раз меньше. В дополнение к тому, что есть O(n), функция временной сложности будет «n!.N +C», где C - константа? Я предполагаю! из-за внутренней петли.

      for(int i=n;i>0;i--)
{
 for(int j=i;j>=1;j--)
  {
     count++;
  }
}

2 ответа

Решение

Этот код имеет ту же временную сложность, что и код в вопросе.

      for(int i = 0; i < n; i++){  // outer loop
    for(int j = 0; j < i; j++){  // inner loop
        count++;
    }
}

На первой итерации внешнего цикла (i = 0) внутренний цикл не выполняется.

Во второй итерации внешнего цикла (i = 1) внутренний цикл выполняет once.

На третьей итерации внешнего цикла (i = 2) внутренний цикл выполняет twice.

Итак, на последней итерации внешнего цикла (i = n) внутренний цикл выполняет n times.

Следовательно, общее количество выполнений этого кода равно

1 + 2 + 3 + … + n

= n(n + 1) / 2

= ((n^2) + n) / 2

= O(n^2)

Допустим, внешний цикл переходит к n, а внутренний цикл переходит к значению внутреннего цикла. (случай разворота вашего цикла). полные внутренние циклы подсчета вы можете рассчитать по формуле

Сумма k = 1..n (k) = n * (n+1) / 2 = 1/2 * n^2 + 1/2 n

так что у вас есть временная сложность

O(1/2 * n^2 + 1/2 n) = O(n² + n) = O(n²)

Другие вопросы по тегам