2014-10-05 2 views
4

Я не получаю часть, где T (n) второго цикла цикла - log (n). Обе петли связаны i, и это запутывает. Как T (n) кода O (nlog (n)) с использованием фундаментального правила продукта?Как T (n) кода O (nlog (n))?

for(i = 1; i <= n; i++) 
{ 
    for(j = 1; j <= n; j = j + i) 
    { 
     printf("Hi"); 
    } 
} 
+0

Посмотрите на 'j = j + i' – tangrs

+0

Да j = j + i, Как это исправить. Как рассчитать T (n) для зависимых циклов? – Hari

+2

Очень похожий вопрос: http://stackoverflow.com/questions/18863422/asymptotic-analysis –

ответ

5

Для i=1 внутренний цикл выполняется n раз. Для i=2 внутренний цикл выполняет n/2 раз и так далее. Время работы T(n) = n + n/2 + n/3 + ... + n/n. Это равно n(1 + 1/2 + 1/3 + ...+ 1/n) = nH(n), где H(n) - номер n-й гармоники. H(n) ~ lg n, следовательно, время работы O(n lg n).

+0

Awesome !! Но можете ли вы помочь мне решить проблему с использованием правила продукта для поиска T (n)? @saadtaame – Hari

+1

Это продукт! Второй фактор немного отличается от того, к чему вы привыкли. Если внутренний цикл выполнял «m» раз, например, вы пишете 'm + m + ... + m',' m' появляется 'n' раз. Имеет смысл? – saadtaame

2
for(i = 1; i <= n; i++) // Executes n times 
{  
    for(j = 1; j <= n; j = j + i) 
    { // This loop executes j times with j increases by rate of i 
     printf(“Hi”); 
    } 
} 

Внутренний цикл выполняется n/i раз для каждого значения i. Его продолжительность составляет nxSum(n/i) для всех i в [1, п]

=>O(nlogn)

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