O(log n)
относится к функции (или алгоритму, или шагу в алгоритме), работающей в течение времени, пропорционального логарифму (обычно основание 2 в большинстве случаев, но не всегда, и в любом случае это незначительно по big-O обозначение *) размера ввода.
Логарифмическая функция является инверсией экспоненциальной функции. Иными словами, если ваш вклад растет экспоненциально (а не линейно, как вы обычно это считаете), ваша функция растет линейно.
O(log n)
время выполнения очень распространено в любом приложении типа «разделяй и властвуй», потому что вы (в идеале) сокращаете работу пополам каждый раз. Если на каждом из этапов деления или завоевания вы выполняете работу с постоянным временем (или работу, которая не является постоянной, но со временем, растущим медленнее, чем O(log n)
), тогда вся ваша функция равна O(log n)
. Довольно часто каждый шаг требует линейного времени на входе; это составит общую сложность времени O(n log n)
.
Сложность времени выполнения бинарного поиска является примером O(log n)
. Это связано с тем, что в бинарном поиске вы всегда игнорируете половину своего ввода на каждом последующем шаге, разделяя массив пополам и фокусируясь только на одной половине с каждым шагом. Каждый шаг является постоянным временем, потому что в бинарном поиске вам нужно сравнить только один элемент с вашим ключом, чтобы выяснить, что делать дальше, независимо от того, насколько большой массив вы рассматриваете в любой момент. Таким образом, вы делаете примерно log (n) / log (2) шагов.
Сложность времени выполнения сортировки слиянием является примером O(n log n)
. Это связано с тем, что вы делите массив пополам с каждым шагом, в результате чего получается примерно log (n) / log (2) шагов. Однако на каждом шаге необходимо выполнять операции слияния для всех элементов (будь то одна операция слияния на двух подсписках из n / 2 элементов или две операции слияния на четырех подсписках из n / 4 элементов) не имеет значения, поскольку она добавляет к необходимости сделать это для п элементов в каждом шаге). Таким образом, общая сложность составляет O(n log n)
.
* Помните, что обозначение big-O, по определению , константы не имеют значения. Также с помощью изменения базового правила для логарифмов единственное различие между логарифмами разных оснований - постоянный коэффициент.