что такое порядок сложности в нотации Big O?

91
8

Вопрос

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

Что я уже понимаю о большом O

Часть, которую я уже понимаю. о нотации Big O заключается в том, что мы измеряем сложность времени и пространства алгоритма с точки зрения роста входного размера n. Я также понимаю, что некоторые методы сортировки имеют лучшие, худшие и средние сценарии для Big O, такие как O (n), O (n ^ 2) и т.д., А n - размер ввода (количество элементов для сортировки).

Любые простые определения или примеры были бы весьма благодарны.

спросил(а) 2020-03-27T17:33:08+03:00 2 месяца назад
1
Решение
108

Анализ Big-O представляет собой форму анализа времени выполнения, которая измеряет эффективность алгоритма с точки зрения времени, которое требуется для выполнения алгоритма в зависимости от размера ввода. Его не формальный bench- знак, просто простой способ классифицировать алгоритмы по относительной эффективности при работе с очень большими размерами ввода.

Обновление: самым быстрым временем работы для любого анализа времени выполнения является O (1), обычно называемое постоянным временем выполнения. Алгоритм с постоянным временем работы всегда занимает одинаковое количество времени, независимо от размера ввода. Это идеальное время выполнения для алгоритма, но его редко достижимо. Производительность большинства алгоритмов зависит от n, размера ввода. Алгоритмы могут быть классифицированы следующим образом из наилучшей производительности:

O (log n) - Алгоритм называется логарифмическим, если его время работы логарифмически увеличивается пропорционально размеру ввода.

O (n) - Время работы линейных алгоритмов увеличивается пропорционально размеру ввода.

O (n log n) - суперлинейный алгоритм находится на полпути между линейным алгоритмом и полиномиальным алгоритмом.

O (n ^ c). Алгоритм многочленов быстро растет в зависимости от размера ввода.


O (c ^ n). Экспоненциальный алгоритм растет даже быстрее, чем полиномиальный алгоритм.

O (n!) - факториальный алгоритм растет быстрее и быстро становится непригодным для даже небольших значений n.

Время выполнения различных порядков алгоритмов разворачивается быстро по мере увеличения n. Рассматривайте время выполнения для каждого из этих классов алгоритмов с

   n = 10:
log 10 = 1
10 = 10
10 log 10 = 10
10^2 = 100
2^10= 1,024
10! = 3,628,800
Now double it to n = 20:
log 20 = 1.30
20 = 20
20 log 20= 26.02
20^2 = 400
2^20 = 1,048,576
20! = 2.43×1018

Поиск алгоритма, который работает в суперлинейном времени или лучше, может существенно повлиять на то, насколько хорошо работает приложение.

ответил(а) 2020-03-27T17:47:28.910602+03:00 2 месяца назад
91

Скажем, f(n) in O(g(n)) тогда и только тогда, когда существуют C и n0 такие, что f(n) < C*g(n) для всех n, больших n0.

Теперь это довольно математический подход. Поэтому я приведу несколько примеров. Простейшим случаем является O (1). Это означает "постоянный". Таким образом, независимо от того, насколько велика входная программа (n) программы, потребуется время для завершения. Примером постоянной программы является тот, который берет список целых чисел и возвращает первый. Независимо от того, как долго список, вы можете просто взять первый и сразу вернуть его.

Следующий - линейный, O (n). Это означает, что если размер ввода вашей программы удваивается, так будет время выполнения. Примером линейной программы является сумма списка целых чисел. Вам нужно будет посмотреть каждое целое число один раз. Поэтому, если вход представляет собой список размера n, вам нужно посмотреть n целых чисел.

Интуитивное определение может определять порядок вашей программы как соотношение между размером ввода и временем выполнения.

ответил(а) 2020-03-27T17:33:08+03:00 2 месяца назад
64

Другие здесь хорошо объяснили нотацию O. Я хотел бы отметить, что иногда слишком большое внимание уделяется большой нотации.

Рассмотрим матричное умножение, наивный алгоритм имеет O (n ^ 3). Используя Strassen algoirthm, это можно сделать как O (n ^ 2,807). Теперь существуют даже алгоритмы, которые получают O (n ^ 2.3727).

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

Поэтому просто смотреть на доминирующий термин в сложности может вводить в заблуждение. Иногда приходится учитывать все термины.

ответил(а) 2020-03-27T17:33:08+03:00 2 месяца назад
65

Big O - это поиск верхнего предела для роста некоторой функции. См. Официальное определение в Википедии http://en.wikipedia.org/wiki/Big_O_notation

Поэтому, если у вас есть алгоритм, который сортирует массив размером n и для этого требуется только постоянное количество дополнительного пространства, и для этого требуется (например) 2 n² + n шагов, тогда вы сказали бы, что сложность пространства равна O(n) или O(1) (в зависимости от того, сколько вы подсчитаете размер входного массива или нет), а его сложность времени - O(n²).

Зная только те цифры O, вы можете грубо определить, сколько пространства и времени требуется для перехода от n до n + 100 или 2 n или того, что вас интересует. Именно так алгоритм "масштабируется".

Обновить

Big O и сложность - это всего лишь два термина для одного и того же. Вы можете сказать "линейная сложность" вместо O(n), квадратичная сложность вместо O(n²) и т.д.

ответил(а) 2020-03-27T17:33:08+03:00 2 месяца назад
55

Я вижу, что вы комментируете несколько ответов, желающих узнать конкретный термин порядка, относящийся к Big-O.

Предположим, что f(n) = O(n^2), мы говорим, что порядок n^2.

ответил(а) 2020-03-27T17:33:08+03:00 2 месяца назад
39

Будьте осторожны, есть некоторые тонкости. Вы заявили, что "мы измеряем сложность времени и пространства алгоритма с точки зрения роста размера ввода n", и то, как люди часто его рассматривают, но это не совсем правильно. Скорее, с O (g (n)) мы определяем, что g (n), масштабируемое соответствующим образом, является верхней оценкой временной и пространственной сложности алгоритма для всех входных данных размера n, большего, чем какое-либо конкретное n '. Аналогично, с Omega (h (n)) мы определяем, что h (n), масштабируемое подходящим образом, является нижней оценкой временной и пространственной сложности алгоритма для всех входных данных размера n, большего, чем какое-либо конкретное n '. Наконец, если и нижняя, и верхняя границы являются одной и той же сложностью g (n), сложностью является Theta (g (n)). Другими словами, Theta представляет собой степень сложности алгоритма, в то время как big-O и big-Omega связывают его сверху и снизу.

ответил(а) 2020-03-27T17:33:08+03:00 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема