0
for(int i = 1; i < n; i = i ∗ 2){ 
    for(int j = 0; j < n; j++){ 
     if(i == j){ 
      for(int k = 0; k < n; k++){ 
       // Do something elementary 
      } 
     }else{ 
      // Do another elementary thing 
     } 
    } 
} 

Я занимаюсь некоторыми упражнениями, и может кто-то помочь мне разобраться в Θ вышеуказанного алгоритма? Я понимаю, что если бы это были только два внешних вложенных цикла, временная сложность должна быть Θ (nlogn). Но я не знаю, как обращаться с утверждением if-else. Спасибо заранее!Временная сложность вложенных петель

+0

Подсказка 1: сколько раз 'i == j' в этом цикле? Подсказка 2: можете ли вы снять самую внутреннюю петлю из средней, чтобы программа стала легче анализировать? –

+0

Спасибо. Я думал о том, сколько раз я == j, но нет вывода. – stillAFanOfTheSimpsons

+0

@matheburg Обычно считается, что сравнение и ветвление принимают O (1) раз. –

ответ

3

Вы выполнить внешний цикл log(n) раз, потому что вы удвоить значение для г каждый раз, когда

Затем выполнить внутренний цикл n раз, а последний внутренний рамочную инф, если заявление вы выполнить один раз (если i == j держит) n раз, это весь внутренний цикл требует n + n шагов каждый раз.

Это дает верхнюю границу O(2n log(n)) и поскольку константы не изменяют асимптотическую сложность среды выполнения ограничена O(n log(n))

for(int i = 1; i < n; i = i ∗ 2){     ---------- 
for(int j = 0; j < n; j++){   ----------    | 
    if(i == j){         |   | 
     for(int k = 0; k < n; k++){  ----  |   | 
      // Do something elementary  | (n | + n)  | * log(n) 
     }        ----  |   | 
    }else{          |   | 
     // Do another elementary thing   |   | 
    }         ----------    | 
}                | 
}                | 
                ------------ 

Обратите внимание, что самый внутренний цикл выполняется только один раз в секунду самый внутренний цикл (!), а так как вторая самая внутренняя петля будет выполнена log n раз (с n шагами), мы должны добавить n раз для самого внутреннего цикла во время выполнения второго самого внутреннего цикла, а затем умножить его на общее время seondmost внутренний цикл выполнен

+0

Как получилось, что самый внутренний цикл был выполнен n раз? Я не знаю, сколько раз он должен запускаться, но я предполагаю, что i == j не произойдет в течение n раз? – stillAFanOfTheSimpsons

+0

Правильно, он получает только один экземпляр один раз, но сам цикл имеет n шагов – wastl

+0

, например, когда n = 16, самый внутренний цикл выполняется, когда i = j = 2,4 и 16, это не один раз, а 3 раза правильно? – stillAFanOfTheSimpsons

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