Какой алгоритм быстрее O (N) или O (2N)?
Говоря о нотациях Big O, если один временной сложный алгоритм - O (N), а другой - O (2N), который быстрее?
Ответы
Ответ 1
Определение большого O:
O (f (n)) = {g | существуют N и c > 0 такие, что g (n) c * f (n) для всех n > N}
На английском языке O (f (n)) представляет собой множество всех функций, которые имеют конечную скорость роста, меньшую или равную той, что и f.
So O (n) = O (2n). Ни один из них не "быстрее", чем другой, с точки зрения асимптотической сложности. Они представляют одинаковые темпы роста, а именно "линейные" темпы роста.
Доказательство:
O (n) - подмножество O (2n): Пусть g - функция из O (n). Тогда найдутся N и c > 0 такие, что g (n) c * n для всех n > N. Таким образом, g (n) (c/2) * 2n для всех n > N. Таким образом, g находится в O (2n).
O (2n) - подмножество O (n): пусть g - функция из O (2n). Тогда найдутся N и c > 0 такие, что g (n) c * 2n для всех n > N. Таким образом, g (n) 2c * n для всех n > N. Таким образом, g находится в O (n).
Обычно, когда люди ссылаются на асимптотическую сложность ( "большой O" ), они относятся к каноническим формам. Например:
- логарифмический: O (log n)
- linear: O (n)
- linearithmic: O (n log n)
- квадратично: O (n 2)
- экспоненциально: O (c n) для некоторого фиксированного c > 1
(Здесь более полный список: Таблица общих проблем времени)
Итак, обычно вы должны писать O (n), а не O (2n); O (n log n), а не O (3 n log n + 15 n + 5 log n).
Ответ 2
Timothy Shield answer абсолютно корректен, что O (n) и O (2n) относятся к одному и тому же набору функций, и поэтому он не "быстрее", чем другой. Важно отметить, однако, что более быстрый способ не применим здесь.
Статья в Википедии о нотации Big O использует термин "медленнее растущий", где вы могли бы использовать "быстрее", что лучшая практика. Эти алгоритмы определяются тем, как они растут с ростом n.
Легко представить себе функцию O (n ^ 2), которая быстрее, чем O (n), в частности, когда n мало или функция O (n) требует комплексного преобразования. Обозначения показывают, что для в два раза большего количества ввода можно ожидать, что функция O (n ^ 2) займет примерно 4 раза до тех пор, пока она была раньше, где функция O (n) займет примерно вдвое больше, чем раньше.
Ответ 3
Теоретически O (N) и O (2N) одинаковы.
Но практически, O (N), безусловно, будет иметь более короткое время работы, но не значительно. Когда N достаточно велико, время работы обоих будет одинаковым.
Ответ 4
Это зависит от констант, скрытых асимптотическим обозначением. Например, алгоритм, который принимает шаги 3n + 5
, находится в классе O(n)
. Таким образом, алгоритм принимает шаги 2 + n/1000
. Но 2n
меньше 3n + 5
и больше, чем 2 + n/1000
...
Это немного похоже на вопрос, если 5
меньше некоторого неуказанного числа от 1 до 10. Это зависит от неуказанного числа. Просто зная, что алгоритм, выполняемый в шагах O(n)
, недостаточно информации, чтобы решить, будет ли алгоритм, выполняющий шаги 2n
, быстрее или быстрее.
На самом деле это еще хуже: вы спрашиваете, превышает ли какой-то неуказанный номер от 1 до 10, чем какой-либо другой неуказанный номер между 1 и 10. Наборы, которые вы выбираете из одного и того же, не означают номера, которые вы произойдет выбор будет равен! O(n)
и O(2n)
являются наборами алгоритмов, и поскольку определение Big-O отменяет мультипликативные факторы, они являются одинаковыми. Отдельные члены наборов могут быть быстрее или медленнее, чем другие члены, но наборы одинаковы.