2016-05-29 5 views
0

Я должен найти временную сложность следующей программы:выполнения сложность функции

function(int n) 
{ 
    for(int i=0;i<n;i++)     //O(n) times 
     for(int j=i;j<i*i;j++)    //O(n^2) times 
      if(j%i==0) 
      { //O(n) times 
       for(int k=0;k<j;k++)  //O(n^2) times 
        printf("8"); 
      } 
} 

Я проанализировал эту функцию следующим образом:

i : O(n) : 1  2  3   4    5 
j :  : 1  2..3  3..8  4..15   5..24   (values taken by j) 
    O(n^2): 1  2  6   12   20    (Number of times executed) 
j%i==0 : 1  2  3,6  4,8,12  5,10,15,20  (Values for which the condition is true) 
    O(n) : 1  1  2   3    4 
k   : 1  2  3,6  4,8,12  5,10,15,20  (Number of times printf is executed) 
    Total : 1  2  9   24   50    (Total) 

Однако я не могу привести какие-либо выводы так как я не нашел никакой корреляции между $ i $, которая по существу равна O (n) и Total k (последняя строка). На самом деле я не понимаю, нужно ли нам смотреть на временную сложность с точки зрения количества раз printf, так как это будет пренебрегать выполнением цикла j-for O (n^2). Ответ дал O (n^5), который, я полагаю, ошибочен, но тогда что правильно? Чтобы быть более конкретным о моем замешательстве, я не могу понять, как это условие if(j%i==0) влияет на общую сложность выполнения функции.

ответ

0

Ответ, безусловно, не O (n^5). Это можно увидеть очень легко. Предположим, что ваш второй внутренний цикл всегда работает n^2 раз, и ваш самый внутренний цикл всегда работает n раз, даже тогда общая временная сложность будет O (n^4).

Теперь посмотрим, что такое фактическая сложность времени.

. Самая внешняя петля всегда работает O (n) раз.

.Теперь давайте посмотрим, сколько раз второй внутренний цикл выполняется для одной итерации внешнего цикла:

Цикл будет выполняться

0 время i = 0

0 время i = 1

2 раз за i = 2 ....

i*i - i раз для j = i.

i*i - i является O(i^2)

. Приступая к самому внутреннему контуру, он работает только тогда, когда j делится на i и j варьируется от i to i*i-1.

Это означает, что j проходит через i*1, i*2 , i*3 ..... до последнего кратного i менее i*i. Очевидно, что O (i). Следовательно, для одной итерации второй внутренней петли внутренней петли внутреннего цикла O (i) раз это означает, что полные итерации двух внутренних петель составляют O (i^3).

Подведение итогов O(i^3) для i = 0 до n-1 определенно даст термин, который равен O (n^4).Таким образом, правильная временная сложность O (n^4).

+0

ОК, так что вы тоже придумываете схожие сложности этих отдельных циклов, как я сказал в оригинальном вопросе. Тем не менее, я считаю, что это нечестно суммировать эти степени n так, как вы делали O (n) * O (n^2) * O (n) = O (n^4) в этом случае. Просто обратите внимание на последнюю строку в моем анализе под названием «Всего» (количество раз, когда printf выполняется). Эти числа определенно не кажутся O (n^4). Например, для i = 3 total = 9 = O (i^2), тогда как для i = 4, Total = 24. Таким образом, O (i^2) anir

+0

Обозначение Big O используется в асимптотическом анализе, что означает очень очень большие входы. Вы просто не можете анализировать сложность с использованием фактических чисел. Это неправильный путь. –

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