Big O Обозначение выражения - PullRequest
6 голосов
/ 17 января 2010

Если у меня есть алгоритм, для выполнения которого требуется 4n ^ 2 + 7n ходов, что за O? О (4n ^ 2)? O (N ^ 2)

Я знаю, что 7n обрезано, но я не знаю, должен ли я сохранить коэффициент n ^ 2 или нет.

Спасибо

Ответы [ 6 ]

14 голосов
/ 17 января 2010

Вы должны отбросить любые коэффициенты, потому что вопрос действительно задает «порядка», который пытается охарактеризовать его как линейный, экспоненциальный, логарифмический и т. Д. То есть, когда n очень большое, коэффициент небольшое значение

Это также объясняет, почему вы отбрасываете + 7n, потому что когда n очень большое, этот термин имеет относительно небольшое значение для окончательного ответа. Если вы знакомы с исчислением, вы можете сказать, что lim n-> inf (4 * n ^ 2 + 7n) ~ = lim n-> inf (4 * n ^ 2) ~ = lim n-> inf (n ^ 2)

Вы также можете думать об этом в графическом смысле ... то есть, если вы построите график функции 4n ^ 2 + 7n для больших и больших значений n, математик может сказать: «это похоже на n ^ 2». Конечно, это должен быть довольно либеральный математик, поскольку это не строгое утверждение, но именно это и пытается донести О (...).

11 голосов
/ 17 января 2010

Коэффициенты не имеют значения в обозначении Big O, поэтому это просто O (n 2 ). Как объясняет Википедия :

[...] коэффициенты становятся неактуальными, если мы сравним их с любым другим порядком выражения, таким как выражение, содержащее член n 3 или n 2 .

9 голосов
/ 17 января 2010

Каждый, кто читает или пишет о сложности алгоритмов, должен точно знать, что представляют собой символы Ландау и асимптотические обозначения , в противном случае они на самом деле не понимают, что происходит, или просто имеют приблизительная (и часто вводящая в заблуждение) идея.

Чтобы упростить (много), пусть f и g будут двумя функциями f : N -> N и g : N -> N. Мы говорим, что f is O(g) тогда и только тогда, когда существует постоянная M > 0 такая, что |f(n)| < M|g(n)|, для всех n > M. То есть, более неофициально, начиная с большого значения n, все значения f(n) меньше кратного g(n) (то есть g растет быстрее , чем f) .

Это определение эквивалентно

f is O(g) <==> There is K >= 0 such that lim{n -> +oo} |f(n)|/|g(n)| = K

Итак, давайте возьмем f(n) = 4n^2 + 7n и g(n) = n^2 и попробуем доказать f is O(g) (я опущу {n -> +oo}):

lim |f(n)|/|g(n)| = lim f(n)/g(n) = lim (4n^2 + 7n) / n^2 = 4 + lim 7n/n^2 =
                  = 4 + lim 7/n = 4 + 0 = 4

Это означает, что существует M такое, что n > M ==> |f(n)| < M|g(n)|, и, следовательно, f is O(g).

С технической точки зрения правильно сказать 4n^2 + 7n is O(4n^2), как правильно сказать 4n^2 + 7n is O(n^3), 4n^2 + 7n is O(e^n) и так далее. Но чтобы иметь смысл, нас интересует нижняя граница. Так что если f is O(e^n) и f is O(n^2), нам больше интересно знать, что f is O(n^2), так как это намного более ограничительно.

ОЧЕНЬ ВАЖНОЕ примечание

Чрезвычайно важно при выборе алгоритма понимать, что нотации big-O относятся к асимптотическим случаям , то есть, когда вы рассматриваете чрезвычайно, невообразимые огромные входные данные , что может выходить далеко за пределы вычислительной мощности, доступной в известной вселенной (т. Е. Бесконечных входных множеств, математически выраженных {n -> +oo}).

Для практического использования (т. Е. Не , поэтому огромные входные данные), при выборе алгоритма, конечно, вы будете соблюдать алгоритмы-кандидаты big-O нотации , но вы должны быть уверены, что выбранный алгоритм хорошо адаптирован (и работает лучше) для вашего (ожидаемого) ввода.

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

6 голосов
/ 17 января 2010

Это O (n ^ 2). Постоянные факторы «переходят в О». Вы держите только наибольший показатель, так как этот показатель доминирует. И вы можете пропустить коэффициенты, поскольку при сравнении разных алгоритмов даже очень большие коэффициенты приводят к меньшим общим числам, чем при большем показателе (при достаточно большом n).

4 голосов
/ 17 января 2010

Заявление, подобное

4n² + 7n = O(n²)

означает, что для некоторого постоянного множителя c выражение cn² в конечном итоге обгонит 4n² + 7n. Технически не правильно оставлять коэффициент там - O(n²) и O(4n²) означают одно и то же, потому что любая константа c для первого может быть заменена c/4 для второго. Однако такая вещь менее ясна, может вводить в заблуждение и определенно нестандартна.

1 голос
/ 17 января 2010

Говоря математически, вы бы написали O (4n²). Это означает, что функция сложности ваших алгоритмов ведет себя как n-> 4n² к положительной бесконечности.

Но в информатике / алгоритме вы должны написать только O (n²), что достаточно для классификации вашего алгоритма.

...