2017-02-20 21 views
3

Какова временная сложность функции ниже?Как рассчитать сложность времени для функции ниже?

void function(int n){ 
     for(int i=0; i<n; i++){. //n times 
      for(int j=i ; j< i*i; j++){ // n*n times 
       if(j%i == 0){ 
        for(int k=0; k<j; k++){ // j times = n * n times. 
         ++counter; 
        } 
       } 
      } 
     } 
    } 

Книга говорит O(n^5). Но я не мог понять, почему книга не учитывала j%i. На основании этого определяется петля k. Вы можете уточнить?

ответ

1

Рассмотрим часть кода, в которой и есть сомнения:

for(int j=i ; j< i*i; j++) 
{ 
    if(j%i == 0) 
     { 
       for(int p=0; p<j; p++){ 
       ++counter; 
     } 
     } 

Давайте проанализируем эту часть кода. Для каждого i, j%i==0 будет справедливо, когда j кратно i, т.е.

i, 2i, 3i, .... i*i // upto i*i only,since j<i*i 

Теперь для каждого j, внутри сложность O(j).

Так Сложность этой части коды:

enter image description here

Таким образом, общая сложность = O(n*n^3) = O(n^4)

+0

спасибо. Вы предполагаете, что все три петли возьмут O (n^4). Я немного смущен. Можете ли вы, пожалуйста, объяснить выше с помощью внешнего цикла. – Manoj

+0

@Manoj Я пишу еще один ответ, чтобы все было ясно. Возьмем пару минут –

+0

@Manoj: Да, для одной конкретной i внутренней петли (часть кода, о которой я упоминал) сложность O (i^3), и так как я будет варьироваться от 0-n, сложность равна O (п^4). По крайней мере, это то, что я получаю. Можете ли вы упомянуть книгу? –

1

В самом деле, функция работает во время О (п^4), так как if состояние бывает только один раз примерно n петли. См. Ниже для точного анализа.

void function (int n) { 
    for(int i=0; i<n; i++) { 
     // Runs a total of n times 
     for(int j=i; j< i*i; j++) { 
      // Runs a total of (n^3 - n)/3 = O(n^3) times 
      if(j%i == 0) { 
       // Runs a total of (n^2 - n)/2 = O(n^2) times 
       for(int k=0; k<j; k++) { 
        // Runs a total of (3n^4 - 10n^3 + 9n^2 - 2n)/24 = O(n^4) times 
        ++counter; 
       } 
      } 
     } 
    } 
} 
+0

Спасибо, как вы вычислили уравнение.? Я побежал за n = 5. Но (n^3 - n)/3 не наступает. – Manoj

+0

@Manoj Вы можете использовать вариант формулы Фаульхабера, чтобы получить точное выражение, я верю. Я использовал команду 'sumformal' PARI/GP. Выражения big-O проще, но точные выражения показывают, что у меня плотно. – Charles