Если n
ограничен сверху, то классы сложности, включающие n
, не имеют смысла. Не существует такого понятия, как «в пределе, когда 2 ^ 123 приближается к бесконечности», за исключением старой шутки, что «пятиугольник приближается к кругу при достаточно больших значениях 5».
Обычно, анализируя сложность кода, мы делаем вид, что размер ввода не ограничен пределами ресурсов машины, даже если это так. Это приводит к некоторым немного странным вещам, происходящим около log n
, поскольку если n
должен соответствовать типу int фиксированного размера, то log n
имеет довольно маленькую границу, так что эта граница, скорее всего, будет полезной /relevant.
Так что иногда мы анализируем слегка идеализированную версию алгоритма, потому что фактически написанный код не может принять произвольно большой ввод.
Например, ваша средняя быстрая сортировка формально использует стек Theta (log n) в худшем случае, очевидно, так и с довольно распространенной реализацией, в которой call-recurses на «маленькой» стороне раздела и loop-recurses на «большой» " боковая сторона. Но на 32-битной машине вы можете организовать использование массива фиксированного размера около 240 байтов для хранения «списка задач», который может быть меньше, чем какая-либо другая функция, написанная вами на основе алгоритма, формально имеющего O (1) использование стека. Мораль заключается в том, что реализация! = Алгоритм, сложность ничего не говорит вам о маленьких числах, а любое конкретное число «мало».
Если вы хотите учесть границы, вы могли бы сказать, что, например, ваш код для сортировки массива имеет время выполнения O (1), потому что массив должен быть меньше подходящего размера в адресном пространстве вашего компьютера, и, следовательно, время для его сортировки ограничено. Однако, если вы это сделаете, вы не справитесь с заданием CS и не будете никому предоставлять какую-либо полезную информацию: -)