Я должен найти временную сложность следующей программы:выполнения сложность функции
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)
влияет на общую сложность выполнения функции.
ОК, так что вы тоже придумываете схожие сложности этих отдельных циклов, как я сказал в оригинальном вопросе. Тем не менее, я считаю, что это нечестно суммировать эти степени 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
Обозначение Big O используется в асимптотическом анализе, что означает очень очень большие входы. Вы просто не можете анализировать сложность с использованием фактических чисел. Это неправильный путь. –