2014-09-17 4 views
1

Я пытаюсь понять, как работает эта нотация O, и здесь у меня есть блок кода, а рядом с каждой LINE у меня будет комментарий с временной сложностью, на которую я полагаю. Если я ошибаюсь, исправьте меня и объясните, почему моя логика неправильна.Как найти временную сложность (Big O) этого блока кода?

код # 1

for (int i = 0; i < n; i++) <<<<<<<<<<<<<<<<<<< O(1)*O(N) 
{ 
    for (int j = 0; j < 3; j++) <<<<<<<<<<<<<<< O(1)*O(1) 
     { 
     for (int k = 0; k < 3; k++) <<<<<<<<<<<<<<O(1)*O(1) 
      { 
      printf("%d", arr[i]); <<<<<<<<<<<<<<O(1) 
      } 
     printf("\n"); <<<<<<<<<<<<<<<<<<O(1) 
    } 

} 

Хронометраж = O (N), после добавления все.

код # 2

for (int i = 2; i <= n; i++) <<<<<<<<<<<<O(1)*O(N) 
{ 
     int j;<<<<<<<<<<<<<<<<<<<<<<<O(1) 
     printf("\n%d:", i);<<<<<<<<<<<<<<O(1) 
     for(j = 2; j <= i; j = j * 2) <<<<<<<<<<<O(n-2)?????????? 
     { 
      printf("%d ", j);<<<<<<<<<<<<<<O(1) 
     } 
     printf("\n%d:", i);<<<<<<<<<<<<<<<<<<<<O(1) 
     for(int k = j/2; k >= 2; k = k/2)<<<<<<<<<<<<<I am not sure of this one 
     { 
      printf("%d ", k); 
     } 
    } 

Продолжительность: Неуверенный ..

В целом, я Любопытный получить представление о нем, но еще не до конца уверен в том, как использовать его в некоторых ситуациях. У кого-нибудь еще есть руководство или какой-то вид, который дает примеры и объяснения временной сложности для циклов и циклов?

+0

Подсказка для временной сложности 'к = к/2' цикла: Сколько раз вы можете разделить' (2^x) 'by' 2', пока не дойдете до '2'? – Serge

+0

x раз, я думаю? – Belphegor

+0

@ пользователь3718584: Corect. 'X'. Теперь как вы получаете от 'n = 2^x' до' x'? –

ответ

5

блок k равен O(lg j), где j равно O(n), поэтому k равно O(lg n). но если вы рассматриваете всю программу, это O(n lg n).

+0

поэтому j не n-2? – Belphegor

+0

фактически O (n-2) = O (n). – HuStmpHrrr

+0

Правильно, потому что мы избавляемся от констант? Как на других примерах они просто оставляют там константу? – Belphegor

1

Вот правила:

  • Loop является число итераций раз сложности тела
  • Последовательные блоки являются суммой сложностей
    • Но в O() только асимптотически наибольший член имеет значение, поэтому вы можете сразу упростить до более сложной сложности
  • Мультипликативные константы неактуальны
  • Геометрическая прогрессия (j петля с j = j * 2 и k петля с k = k/2) имеет сложность O(log n)
+0

Вы имеете в виду в 2.1 точке: более высокая степень сложности? –

+0

@JaviV: Да, опечатка. Благодарю. –

+0

что будет общее время выполнения? – Belphegor

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