O((n^3)/4)
не имеет смысла с точки зрения обозначения большого О, поскольку он предназначен для измерения сложности как отношения аргумента. Разделение на 4 не влияет, поскольку это изменяет значение отношения, но не его характер.
Все они эквивалентны:
O(n^3)
O(n^3/4)
O(n^3*1e6)
Другие термины имеют смысл только, когда они включают в себя n
термин, например:
O(n^3/log(n))
O(n^3 * 10^n)
Как Энтони Kanago справедливо указывает, что это соглашение, по которому:
- не должен поддерживать этот термин с наименьшими скоростями роста для сумм:
O(n^2+n) = O(n^2)
,
- Избавиться от констант для продуктов:
O(n^2/4) = O(n^2)
.
В целом, я не всегда согласен с этим первым правилом во всех случаях. Это правильное правило для определения максимальной скорости роста функции, но для таких вещей, как сравнение алгоритмов (a), где вы можете разумно установить ограничение на входной параметр, что-то вроде O(n^4+n^3+n^2+n)
заметно хуже, чем просто O(n^4)
.
В этом случае любой термин, который зависит от входного параметра, должен быть включен. На самом деле, там могут быть полезны даже постоянные термины. Сравните, например, O(n+1e100)
с O(n^2)
- последнее будет довольно долгое время превосходить прежнее, пока n
не станет достаточно большим, чтобы повлиять на константный срок.
(а) Есть, конечно, те, кто бы сказал, что не следует использовать таким образом, но прагматизм часто преодолевает догматизм в реальном мире :-)
п/4 * N * N = (п^3)/4 –
Смарт-компилятор, вероятно, оптимизируйте это гнездо цикла как O (1), так как оно фактически ничего не делает. – tgamblin
«Умный» компилятор оставил бы его в покое, если не сказать иначе - это может быть временная петля во встроенной системе, контролирующей скорость кровотока через диализную машину :-) – paxdiablo