Java Big O нотация 3-х вложенных циклов журнала (n)

Что обозначение Big O будет для следующих вложенных циклов?

     for (int i = n; i > 0; i = i / 2){
        for (int j = n; j > 0; j = j / 2){
           for (int k = n; k > 0; k = k / 2){
              count++;
           }
        }
     }

Мои мысли: каждая петля O(log2(n)) так же просто, как умножить

O(log2(n)) * O(log2(n)) * O(log2(n))  =  O(log2(n)^3)

3 ответа

Решение

Да, это правильно.

Один из способов выяснить сложность вложенных циклов big-O, границы которых не зависят друг от друга, - это работать изнутри. Внутренний цикл выполняет O (log n). Второй цикл выполняется O (log n) раз и O (log n) работает каждый раз, поэтому он выполняет O (log2 n). Наконец, самый внешний цикл выполняется O (log n) раз и O (log2 n) работает на каждой итерации, поэтому общая работа - O (log3 n).

Надеюсь это поможет!

Да ты прав.

Простой способ рассчитать -

for(int i=0; i<n;i++){ // n times 
    for(int j=0; j<n;j++){ // n times
    }
}

Это пример простого вложенного цикла. Здесь Big-O каждого цикла O(n) и он вложен так, как правило, O(n * n), который является O(n^2), фактическим Big-O. А в твоем случае -

for (int i = n; i > 0; i = i / 2){ // log(n)
     for (int j = n; j > 0; j = j / 2){ // log(n)
         for (int k = n; k > 0; k = k / 2){ // log(n)
           count++;
         }
     }
}

Который находится во вложенном цикле, где каждый цикл Big-O O(log(n)) так что все вместе сложность будет O(log(n)^3)

Действительно, ваше предположение верно. Вы можете показать это методично следующим образом:

Другие вопросы по тегам