Понимание Того, Сколько Раз Будут Выполняться Вложенные Циклы

Я пытаюсь понять, сколько раз оператор " x = x + 1 "выполняется в коде ниже, как функция"n":

for (i=1; i<=n; i++)
  for (j=1; j<=i; j++)
    for (k=1; k<=j; k++)
       x = x + 1 ;

Если я не ошибаюсь, выполняется первый цикл n раз, и второй n (n+1)/2 раз, но на третьем цикле я теряюсь. То есть я могу сосчитать, сколько раз она будет выполнена, но не могу найти формулу или объяснить ее математическими терминами.

можно?

By то, что это не домашнее задание или что-то в этом роде. Я только что нашел книгу и подумал, что это интересная концепция для изучения.

6 ответов


рассмотрим цикл for (i=1; i <= n; i++). Тривиально видеть, что это loops n раза. Мы можем нарисовать это как:

* * * * *

теперь, когда у вас есть два вложенных цикла, как это, ваш внутренний цикл будет цикл n (n+1)/2 раза. Обратите внимание, как это образует треугольник, и на самом деле числа этой формы известны как треугольные числа.

* * * * *
* * * *
* * *
* *
*

Итак, если мы расширим это на другое измерение, оно образует тетраэдр. Поскольку я не могу сделать 3D здесь, представьте, что каждый из них наслаивается друг на друга.

* * * * *     * * * *     * * *     * *     *
* * * *       * * *       * *       *
* * *         * *         *
* *           *
*

они известны как число тетраэдрических, которые производятся по следующей формуле:

n(n+1)(n+2)
-----------
     6

вы должны быть в состоянии подтвердить, что это действительно так с небольшую тестовую программу.

если мы заметим, что 6 = 3!, это не слишком трудно увидеть как этот шаблон обобщается на более высокие измерения:

n(n+1)(n+2)...(n+r-1)
---------------------
         r!

здесь r is количество вложенных циклов.


математическая формула здесь.

Это O (n^3) сложность.


Это число равно числу троек {a, b, c}, где a Поэтому его можно выразить как сочетания с повторениями.. В этом случае общее количество комбинаций с повторениями: n(n+1) (n+2)/6


3-й внутренний цикл такой же, как 2-й внутренний цикл, но ваш n вместо формулы.

Итак, если ваш внешний цикл составляет n раза...

и ваш 2-й цикл n(n+1)/2 раза...

ваш 3-й цикл....

(n(n+1)/2)((n(n+1)/2)+1)/2

это довольно грубая сила и определенно может быть упрощена, но это просто алгоритмическая рекурсия.


1 + (1+2) + (1+ 2+ 3 ) +......+ (1+2+3+...n)


вы знаете, сколько раз выполняется второй цикл, чтобы можно было заменить первые два цикла одним правым? как

for(ij = 1; ij < (n*(n+1))/2; ij++)
   for (k = 1; k <= ij; k++)
      x = x + 1;

применяя ту же формулу, которую вы использовали для первого, где " n " на этот раз n (n+1) / 2 вы будете иметь ((n(n+1) / 2)*(n(n+1)/2+1))/2 - раз выполняется x = x+1.