Очевидно, что размер скаляров в любой конкретной реализации C ++ конечен.
Конечно, вы правы с этим утверждением! Другой способ сказать, что это так: «C ++ работает на оборудовании, а оборудование конечно». Опять же, абсолютно правильно.
Однако ключевой момент таков: C ++ не формализован для какого-либо конкретного оборудования. Вместо этого он формализован для абстрактной машины .
Например, sizeof(int) <= 4
верно для всего оборудования, для которого я лично когда-либо программировал. Однако в стандарте вообще нет верхней границы, касающейся sizeof(int)
. Что в стандарте C ++ указано значение типа int, long?
Итак, на определенном оборудовании вход для некоторой функции void f(int)
действительноограничено 2^31 - 1
. Таким образом, теоретически можно утверждать, что, независимо от того, что он делает, это алгоритм O (1), потому что его число операций никогда не может превышать определенный предел (который является определением O (1)). Однако на абстрактной машине буквально такого ограничения нет, поэтому этот аргумент не может быть сохранен.
Итак, в целом, я думаю, что ответ на ваш вопрос заключается в том, что C ++ не так ограниченкак Вы думаете. C ++ не является ни конечным, ни ограниченным. Оборудование есть. C ++ абстрактной машины нет. Следовательно, имеет смысл заявить о формальной сложности (как определено математикой и теоретической CS) стандартных алгоритмов.
Утверждение, что каждый алгоритм является O (1), просто потому, что на практике всегда существуют аппаратные ограничения, может быть оправдано чисто теоретическим мышлением, но это было бы бессмысленно. Хотя, строго говоря, большой О имеет смысл только в теории (где мы можем идти к бесконечности), на практике он обычно оказывается весьма значимым, даже если мы не можем идти к бесконечности, а только к 2^32 - 1
.
ОБНОВЛЕНИЕ:
Относительно вашего редактирования: Вы, кажется, перепутали две вещи:
- Не существует конкретной машины (будь то абстрактная илинастоящий) имеет тип
int
, который может «стремиться к бесконечности». Это то, что вы говорите, и это правда! Таким образом, в этом смысле всегда есть верхняя граница. - Стандарт C ++ написан для любой машины, которая когда-либо может быть изобретена в будущем. Если кто-то создает оборудование с
sizeof(int) == 1000000
, это нормально для стандарта. Итак, в этом смысле верхней границы нет.
Надеюсь, вы понимаете разницу между 1. и 2. и почему оба они являются действительными утверждениями и не противоречат друг другу. Каждая машина конечна, но возможности поставщиков оборудования бесконечны.
Таким образом, если стандарт определяет сложность алгоритма, он делает (должен делать) это с точки зрения пункта 2. В противном случае он ограничил бырост оборудования. И этому росту нет предела, поэтому имеет смысл использовать математическое определение сложности, которое также предполагает отсутствие ограничений.