2014-11-21 3 views
3

Первоначально я думал, что сложность O (n^3), потому что внутренний цикл переходит в i * i, но теперь я считаю, что сложность O (n^2) из-за заявления «break».Какой порядок сложности (Big O) этого кода

Что вы думаете об этом?

#include <stdio.h> 

int main() 
{ 
    int i,k,l,m; 
    unsigned int j; 
    l=0; 
    for (i=3; i<65535;i+= 2) { 
     k=1; 
     for (j=3; j <= i*i; j += 2) { 
      if (j==i) continue; 
      if(i%j ==0) { 
       k=0; 
       break; 
      } 
     } 
     if (k) { l++; } 
    } 
    printf("%i\n", l); 
    return 0; 
} 
+1

Вы можете думать "без" "если (J == я) продолжить;" также ... Я добавил эту строку позже и не думаю, что она сильно меняет сложность. – Nix

+3

Что такое n в ваших предположениях O (n) – UmNyobe

+1

Похоже, что это подсчет простых чисел, но это такая пустая трата времени, чтобы продолжать идти после 'j' pass' i'. В действительности условие должно быть 'j * j <= i'. – JS1

ответ

2

Внутренний цикл O (N^2) для простых чисел, но быстро для не простых чисел (в худшем случае O (N^1/2), потому что вы только должны искать до SQRT (N)) ,

Число простых чисел, однако, невелико по сравнению с числом простых чисел. Аппроксимация числа простых чисел до X является: X/log (X), как найдено в этом reference link.

Таким образом, выбрасывая ненулевые числа как несущественные, существуют N/log (N) простых чисел и каждая внутренняя цикл принимает O (N^2) время, поэтому общее время равно O (N^3/log (N)).

0

for (j=3; j <= i*i; j += 2) { if (j==i) continue; if(i%j ==0) { k=0; break; } }

Без J == я

здесь у = 3,5,7,9,11,13,15,17 .... 65535. Это означает, что j будет содержать все простые числа до 65535, отличные от 2. Здесь есть математика. j < i * i. если i - степень 2 или простое число, то j цикл будет выполнен полностью, но мы можем пренебречь степенью 2, поскольку i всегда нечетно. Для любого i в некоторой точке i = j [O (n) сложность]

Если i является согласным, тогда i% j == 0 произойдет быстро. Как указано JS1, j-цикл будет принимать n/logn, пренебрегая j == i.

Так общая временная сложность = O (N * 2/LOGN)

+0

Думаю, вы меня не достали. если вы пропустите j == i statement, то любое число в i будет доступно j в O (n). Вот что я пытался упомянуть. Он не будет идти до O (n * n) только до O (n). Например, возьмем общее число 101, итерацию j от 3 до 101 * 101, но j достигнет 101 в O (n) и, следовательно, i% j == 0 без j == i statement – Shankar

+0

Так j никогда не достигнет i * i if '(j == i) continue' удален J даже не пойдет больше, чем я – Shankar

+1

Я получаю его сейчас .. удалил свой комментарий. – JS1

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