Я видел, как термин «время доступа O (1)» означает «быстро», но я не понимаю, что он означает. Другой термин, который я вижу с ним в том же контексте, - «время доступа O (n)». Может ли кто-нибудь просто объяснить, что означают эти термины?
Смотрите также
Ответы:
Вы захотите прочитать о порядке сложности.
http://en.wikipedia.org/wiki/Big_O_notation
Короче говоря, O (1) означает, что требуется постоянное время, например, 14 наносекунд или три минуты, независимо от количества данных в наборе.
O (n) означает, что на это требуется время, линейное с размером набора, поэтому набор вдвое большего размера займет в два раза больше времени. Вы, вероятно, не захотите помещать миллион объектов в один из них.
источник
int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }
естьO(1)
.По сути, это означает, что для поиска значения в вашей коллекции требуется одинаковое количество времени, независимо от того, есть ли у вас небольшое количество элементов в вашей коллекции или очень много (в пределах ограничений вашего оборудования).
O (n) означает, что время, необходимое для поиска элемента, пропорционально количеству элементов в коллекции.
Типичными примерами этого являются массивы, к которым можно получить доступ напрямую, независимо от их размера, и связанные списки, которые необходимо пройти в порядке с самого начала, чтобы получить доступ к заданному элементу.
Другая обычно обсуждаемая операция - это вставка. Коллекция может быть O (1) для доступа, но O (n) для вставки. Фактически, массив имеет именно такое поведение, потому что для вставки элемента посередине вам нужно будет переместить каждый элемент вправо, скопировав его в следующий слот.
источник
Каждый ответ, отвечающий в настоящее время на этот вопрос, говорит вам, что это
O(1)
означает постоянное время (что бы это ни происходило с измерением; может быть время выполнения, количество операций и т. Д.). Это не совсем так.Сказать, что время выполнения есть,
O(1)
означает, что существует такая константаc
, что время выполнения ограничено сверхуc
, независимо от ввода. Например, возвращение первого элемента массиваn
целых чиселO(1)
:Но эта функция
O(1)
тоже есть:Время выполнения здесь ограничено выше 1 годом, но в большинстве случаев время выполнения составляет порядка наносекунд.
Сказать, что время выполнения есть,
O(n)
означает, что существует такая константаc
, что время выполнения ограничено сверхуc * n
, гдеn
измеряет размер ввода. Например, определение количества вхождений определенного целого числа в несортированном массивеn
целых чисел с помощью следующего алгоритмаO(n)
:Это связано с тем, что мы должны перебирать массив, проверяя каждый элемент по одному.
источник
O (1) означает, что время доступа к чему-либо не зависит от количества элементов в коллекции.
O (N) означает, что время доступа к элементу пропорционально количеству (N) элементов в коллекции.
источник
O (1) не обязательно означает «быстро». Это означает, что время, которое требуется, постоянно и не зависит от размера входных данных функции. Постоянный может быть быстрым или медленным. O (n) означает, что время, затрачиваемое функцией, будет меняться прямо пропорционально размеру входных данных функции, обозначенных n. Опять же, он может быть быстрым или медленным, но он будет медленнее по мере увеличения размера n.
источник
Он называется нотацией Big O и описывает время поиска для различных алгоритмов.
O (1) означает, что время работы в наихудшем случае постоянно. В большинстве случаев это означает, что вам не нужно искать в коллекции, вы можете сразу найти то, что ищете.
источник
O(1)
всегда выполнять в одно и то же время, независимо от набора данных n. Примером O (1) может быть ArrayList, обращающийся к своему элементу по индексу.O(n)
также известный как линейный порядок, производительность будет расти линейно и прямо пропорционально размеру входных данных. Примером O (n) может быть вставка и удаление ArrayList в случайном месте. Поскольку каждая последующая вставка / удаление в случайном положении приведет к смещению элементов в ArrayList влево и вправо от его внутреннего массива, чтобы сохранить его линейную структуру, не говоря уже о создании новых массивов и копировании элементов из старого к новому массиву, который требует дорогостоящего времени обработки и, следовательно, снижает производительность.источник
Нотация Big O - это способ выразить скорость работы алгоритмов.
n
- это количество данных, с которыми работает алгоритм.O(1)
означает, что независимо от объема данных он будет выполняться в постоянное время.O(n)
означает, что он пропорционален количеству данных.источник
По сути, O (1) означает, что время его вычисления постоянно, в то время как O (n) означает, что оно будет линейно зависеть от размера ввода - т.е. цикл через массив имеет O (n) - просто цикл - потому что он зависит от числа элементов, при вычислении максимума между обычными числами имеет O (1).
Википедия тоже может помочь: http://en.wikipedia.org/wiki/Computational_complexity_theory
источник
Самый простой способ отличить O (1) от O (n) - это сравнить массив и список.
Для массива, если у вас есть правильное значение индекса, вы можете мгновенно получить доступ к данным. (Если вы не знаете индекс и вам нужно перебирать массив, тогда он больше не будет O (1))
Для списка вам всегда нужно прокручивать его независимо от того, знаете ли вы индекс или нет.
источник
Вот простая аналогия; Представьте, что вы загружаете фильмы онлайн, с помощью O (1), если для загрузки одного фильма требуется 5 минут, то же самое время потребуется для загрузки 20 фильмов. Поэтому неважно, сколько фильмов вы загружаете, они займут одинаковое время (5 минут), будь то один фильм или 20. Обычный пример этой аналогии - когда вы заходите в библиотеку фильмов, берете ли вы один фильм или пять, вы просто выбираете их сразу. Следовательно, тратить то же время.
Однако с O (n), если для загрузки одного фильма требуется 5 минут, для загрузки 10 фильмов потребуется около 50 минут. Таким образом, время не является постоянным или каким-то образом пропорционально количеству фильмов, которые вы загружаете.
источник
Это означает, что время доступа постоянно. Независимо от того, получаете ли вы доступ к 100 или 100 000 записей, время получения будет одинаковым.
Напротив, время доступа O (n) будет означать, что время извлечения прямо пропорционально количеству записей, из которых вы получаете доступ.
источник
Это означает, что доступ занимает постоянное время, т.е. не зависит от размера набора данных. O (n) означает, что доступ будет линейно зависеть от размера набора данных.
Буква O также известна как big-O.
источник
Введение в алгоритмы: второе издание Cormen, Leiserson, Rivest & Stein говорит на странице 44, что
Если алгоритм работает за время O (1), это означает, что асимптотически не зависит от какой-либо переменной, а это означает, что существует по крайней мере одна положительная константа, которая при умножении на единицу превышает асимптотическую сложность (~ время выполнения) функции для значений n выше определенной суммы. Технически это время O (n ^ 0).
источник
O (1) означает произвольный доступ. В любой оперативной памяти время, необходимое для доступа к любому элементу в любом месте, одинаково. Здесь время может быть любым целым числом, но нужно помнить только то, что время, затраченное на извлечение элемента в (n-1) -м или n-м месте, будет одинаковым (то есть постоянным).
Тогда как O (n) зависит от размера n.
источник
На мой взгляд,
O (1) означает, что время на выполнение одной операции или инструкции за раз равно одной, во временном анализе сложности алгоритма в лучшем случае.
источник