for i = 1 to n do
for j = 1 to i do
for k = 1 to j do
Какова его временная сложность с точки зрения «n»?Какова временная сложность данного фрагмента?
for i = 1 to n do
for j = 1 to i do
for k = 1 to j do
Какова его временная сложность с точки зрения «n»?Какова временная сложность данного фрагмента?
Внутренняя петля, очевидно, будет работать j
раз. Если предположить, что он содержит операции на сумму 1 единицу времени, то это будет:
T_inner(j) = j
Средний цикл будет выполняться i
раз, то есть
T_middle(i) = Sum {j from 1 to i} T_inner(j)
= Sum {j from 1 to i} j
= i/2 * (1 + i)
Наконец:
T_outer(n) = Sum {i from 1 to n} T_middle(i)
= Sum {i from 1 to n} (i/2 * (1 + i))
= 1/6 * n * (1 + n) * (2 + n)
= 1/6 n^3 + 1/2 n^2 + 1/3 n
И это, очевидно, O(n^3)
.
Примечание: Учитываются только операции во внутреннем большинстве блоков. Он пренебрегает операциями, необходимыми для выполнения цикла. Но если вы включите их, вы увидите, что временная сложность одинакова.
Спасибо! @NicoSchertler, он работает :) –
Так обычно, когда речь идет о сложности алгоритма, они рассматривают операции, необходимые для циклов, или это всегда игнорируется? –
Операции, необходимые для поддержания цикла, всегда будут пропорциональны количеству итераций (плюс операции инициализации). Таким образом, это похоже на добавление постоянной суммы во внутренний блок. В конце концов, это не меняет сложность. –
Какую работу вы предприняли по этой проблеме? Например, можете ли вы указать сложность и точную формулу для 'j'? Для точной формулы для 'k', что делает сложность очевидной, см. [Tetrahedral number] (https://en.wikipedia.org/wiki/Tetrahedral_number). –
Похож на n^3. Хотя я довольно плохой во времени, поэтому я мог ошибаться. Кроме того, большинство этих тегов не имеют значения. – byxor
Я удалил теги, как было предложено. @BrandonIbbotson –