Есть несколько примечаний, таких как или и так далее. Мне было интересно, есть ли варианты таких в реальности, как или , или они математически неверны.
Или было бы правильно сказать, что можно улучшить до ? Я не могу и не должен выяснять время выполнения, и мне не нужно ничего улучшать, но мне нужно знать, как вы описываете свои функции в реальности.
Ответы:
Да,O(2n2) или O(log(n2)) являются допустимыми вариантами.
Тем не менее, вы увидите их редко, если увидите их вообще, особенно в конечных результатах. Причина в том, чтоO(2n2) есть O(n2) . Аналогично, O(log(n2)) есть O(logn) . Это может быть удивительно для начинающих. Тем не менее, эти равенства более или менее являются той самой причиной, по которой были введены большие O нотации, чтобы скрыть мультипликативный постоянный фактор, который часто трудно определить и относительно незначительный.
Это вовсе не улучшение, если временная сложность алгоритма изменяется сO(5n2) на O(3n2) или с Ω(5n2) на Ω(3n2) , потому что O(5n2) равно O(3n2) а Ω(5n2) равно Ω(3n2) . Поэтому неверно говорить, что сложность по времени улучшена сO(5n2) доO(3n2) . Правильно сказать, что временная сложность алгоритма, конечно,увеличена с5n2 до3n2 .
Упражнение 1. Покажите, чтоO(5n2)=O(3n2)=O(n2) .
Упражнение 2. Покажите, чтоO(logn)=O(log(n2)) .
Упражнение 3. Покажите, чтоΩ(n2+n)=Ω(n2) .
источник
Вы всегда можете не использовать эту запись вообще. То есть вы можете определить функциюf(n) как можно точнее, а затем попытаться улучшить ее. Например, у вас может быть алгоритм сортировки, который делает f(n) сравнения, поэтому вы можете попытаться придумать другой алгоритм сортировки, который выполняет только g(n) сравнения. Конечно, все виды функций f(n) существуют (в теории) и также могут появиться (на практике).
Вместо того, чтобы относиться к обозначению Большого О как к таинственной магии, когда вам приходится консультироваться с волшебниками, чтобы спросить, можете ли вы что-то сделать, вы должны взглянуть на его определение . Уважайте определение, а затем делайте все, что вам нужно, чтобы выполнить свою работу.
источник
Хотя принятый ответ довольно хороший, он все равно не затрагивает реальную причину, по которойO(n)=O(2n) .
Нотация Big-O описывает масштабируемость
По сути, Big-O Notation не является описанием того, сколько времени занимает алгоритм. Это также не описание количества шагов, строк кода или сравнений, которые делает алгоритм. Это наиболее полезно, когда используется для описания того, как алгоритм масштабируется с количеством входов.
Возьмите бинарный поиск, например. Учитывая отсортированный список, как вы можете найти произвольное значение внутри него? Ну, вы могли бы начать с середины. Поскольку список отсортирован, среднее значение скажет вам, в какой половине списка находится ваше целевое значение. Таким образом, список, который вы должны искать, теперь разделен пополам. Это можно применить рекурсивно, затем перейти к середине нового списка и так далее, пока размер списка не станет равным 1, и вы не найдете свое значение (или оно не существует в списке). Удвоение размера списка добавляет к алгоритму только один дополнительный шаг - логарифмическое соотношение. Таким образом, этот алгоритмO(logn) , Логарифм - это основание 2, но это не имеет значения - суть отношения заключается в том, что умножение списка на постоянное значение только добавляет постоянное значение времени.
Сравните стандартный поиск по несортированному списку - в этом случае единственный способ найти значение - проверить каждый. В худшем случае (что конкретно подразумевает Big-O), ваше значение находится в самом конце, что означает, что для списка размераn вы должны проверить n значений. Удвоение размера списка удваивает количество проверок, что является линейной зависимостью. O(n) . Но даже если вам нужно было выполнить две операции с каждым значением, например, при некоторой обработке линейные отношения сохраняются. O(2n) просто бесполезен в качестве дескриптора, так как он описывает ту же масштабируемость, что и O(n) .
Я ценю, что многие из этих ответов в основном подсказывают вам самим прийти к такому заключению, прочитав определение Big-O. Но это интуитивное понимание заняло у меня довольно много времени, чтобы обернуть мою голову, и поэтому я изложил это вам как можно проще.
источник
источник
Посмотрите на определение O (f (n)), и вы увидите, что, например, O (2n ^ 2) и O (n ^ 2) абсолютно одинаковы. Изменение алгоритма с 5n ^ 2 на 3n ^ 2 операций - это улучшение на 40 процентов. Переход от O (5n ^ 2) к O (3n ^ 2) на самом деле не является каким-либо изменением, они одинаковы.
Снова прочтите определение O (f (n)).
источник
источник