2016-11-26 5 views
-1
for i = 1 to n do 
    for j = 1 to i do 
     for k = 1 to j do 

Какова его временная сложность с точки зрения «n»?Какова временная сложность данного фрагмента?

+1

Какую работу вы предприняли по этой проблеме? Например, можете ли вы указать сложность и точную формулу для 'j'? Для точной формулы для 'k', что делает сложность очевидной, см. [Tetrahedral number] (https://en.wikipedia.org/wiki/Tetrahedral_number). –

+0

Похож на n^3. Хотя я довольно плохой во времени, поэтому я мог ошибаться. Кроме того, большинство этих тегов не имеют значения. – byxor

+0

Я удалил теги, как было предложено. @BrandonIbbotson –

ответ

1

Внутренняя петля, очевидно, будет работать 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).

Примечание: Учитываются только операции во внутреннем большинстве блоков. Он пренебрегает операциями, необходимыми для выполнения цикла. Но если вы включите их, вы увидите, что временная сложность одинакова.

+0

Спасибо! @NicoSchertler, он работает :) –

+0

Так обычно, когда речь идет о сложности алгоритма, они рассматривают операции, необходимые для циклов, или это всегда игнорируется? –

+0

Операции, необходимые для поддержания цикла, всегда будут пропорциональны количеству итераций (плюс операции инициализации). Таким образом, это похоже на добавление постоянной суммы во внутренний блок. В конце концов, это не меняет сложность. –

Смежные вопросы