2014-11-17 5 views
4

В соответствии с этим кодом:В чем сложность следующего кода?

for (int i=1; i<=N; i*=2) 
{ 
    for (int j=1;j<=i;j++) 
    { 
    System.out.println("The value for i is "+i+" and the value for j is "+j); 
    } 
} 

Первый for-loop будет работать log(n) раз, сначала я подумал о 2n-1 для второго for-loop, но он не работает для нечетных чисел.

Любые идеи? :)

+0

Это количество времени, в течение которого выполняется первый цикл ('log (n)'), умноженный на количество выполняемых вторых циклов ('i'). – Charlie

+0

Вы хотите асимптотическую сложность или количество итераций?Асимптотика n * log (n) –

+0

Мне нужно подумать о количестве итераций для любой строки, чем найти нотацию O. – user3813409

ответ

2

Ваш первый цикл получил i как серии:

enter image description here

Первый цикл останавливается, когда последний элемент из этой серии Biger или равно N:

enter image description here

x стенды за сколько раз выполняется первый цикл. Сейчас мы пытаемся найти x:

enter image description here

где

enter image description here

Да, это, как вы говорите:

Первый для цикла будет выполняться журнал (п) раз

Вторые для тела цикла выполняется в виде суммы:

enter image description here

Это является доказательством того, что ваш алгоритм имеет O (п) сложность

Ваша печать происходит 2N-1 раз, если N является одним из: 1, 2, 4, 8, ... , 2^n


это поверхностно анализ, но это делает работу.

4
  • Когда i = 1, внутренний цикл будет выполняться 1 раз
  • Когда i = 2, внутренний цикл будет выполняться 2 раза
  • Когда i = 4, внутренний цикл будет работать в 4 раза
  • ...
  • Когда i = N, внутренний цикл будет работать N раз

Оператор печати выполняется 1 + ... + N/4 + N/2 + N раз, что является O (n).

+1

'O (n)' правильно, но это доказательство (эта форма доказательства) работает только для '2^n - 1' –

+1

@DmitryGinzburg. Ограничение сверху и снизу следующей мощностью 2 будет выполняться. –

+0

@ G.Bach стоит упомянуть в ответ –

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