2015-10-14 2 views
1

Я знаком с материалом Big O и вообще знаю, как использовать критический раздел, чтобы выяснить сложность. Это один дает мне работу немного, так что я хотел бы ответ и небольшое объяснение:Расчет быстрой алгоритмической сложности

i = 1; 
while(i<= n){ 
    if(i%2 == 0)(
    System.out.println(i); 
    } 
    i++; 
} 

Из того, что я понимаю, что тело из, если будет работать п/2 раз, потому что только даже я был бы распечатать. Так будет общая сложность: 1+ (n/2), что делает большой O O (n)? `

+2

На самом деле это бесконечный цикл, если 'i <= n'. Я думаю, вы что-то забыли там – Rerito

+0

Упс. Забыл увеличить i в цикле! @dasblinkenlight –

ответ

1

Общая сложность n + n/2 * (сложность System.out.println(i);). В этом случае, я думаю, вы можете предположить, что сложность вызова System.out.println является постоянной, поэтому общая сложность O (N). Важно заметить, что вы не можете игнорировать сложность итерации.

+0

Спасибо. Это был довольно четкий ответ. Итак, итерация - это то, что выполняется n раз, в то время как тело if выполняется n/2 раза. Первоначальное объявление i просто константа, которая будет означать, что общая функция будет 1 + n + n/2. Верный? –

+0

@samz_manu правильно. Еще более важно отметить, что вы выполняете n/2 раз функцию System.out.println в теории, это может быть сложной и дорогостоящей операцией - например, если вы печатаете дерево или какую-либо другую сложную структуру. –

+0

Получил это. Еще одна вещь, которая все еще меня путает. Является ли аргумент, если он не имеет отношения к сложности? Не стоит ли проверять, нет ли его равных или нет? На самом деле сложность исходит из кода, выполняемого внутри него, а не от проверки аргумента. –

0

Общая сложность по-прежнему равна O (n), поскольку проверка значения i%2 и приращение i по-прежнему считается работой. Тело оператора if, которое выполняет n/2 раз, просто добавляет дополнительную O (n) сумму работы.

0

Вы неверно истолковали, что именно тело вашего кода (скорее, тело вашей петли). Это тело вашего кода (/ петли):

if (i%2 == 0) { 
    System.out.println(i); 
} 
i++; 

И это тело будет выполнено общим п раз, даже если половина времени условия if провалится.

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