При анализе констант сложности времени их сложно и неуместно вычислять.
В некоторых архитектурах сложение может занять вдвое больше времени, чем умножение, поэтому теперь мы должны пройти алгоритм и вычислить количество добавлений, которые мы делаем, и количество умножений, которые мы делаем, чтобы получить точный анализ времени выполнения. Не красиво!
Что еще более важно, даже если это верно сейчас, в какой-то момент в будущем или в другой слегка другой архитектуре, эта константа может отличаться, поэтому время выполнения может варьироваться в зависимости от архитектуры. Так что теперь мой алгоритм имеет более одного времени выполнения? Один на данный момент для этой архитектуры, другой для другой архитектуры, и каждый из них может измениться в будущем ... Опять не красиво.
В мире, где возможности вычислений все время меняются, завтра вдвое больше возможностей ЦП, в четыре раза больше памяти за неделю и т. Д., Это не имеет отношения к постоянным факторам. Это не тот случай, если нам нужно количественно оценить реальное время выполнения, но когда мы анализируем сложность алгоритма в целом, а не сложность решения в конкретной среде, это так.
Кроме того, и, вероятно, самое главное, постоянные факторы не являются хорошей мерой сложности проблемы, и в конце дня мы пытаемся измерить сложность. Алгоритм, имеющий определенный класс сложности, ведет себя (или, точнее, ограничен) определенным образом для всех входных данных размера. Поэтому, когда я пытаюсь измерить общую сложность двух решений, я делаю это как можно более общим способом, и поэтому стараюсь учитывать все значения входного размера (т.е. n-> бесконечность).
Наконец, это позволяет теоретикам группировать алгоритмы в один класс, независимо от определенных постоянных факторов, которые могут изменяться или не изменяться, а могут и не улучшаться. Это полезно, помимо прочего, для доказательства оптимальности; обнаружение, что проблема omega(f(n))
, полезно только в том случае, если мы рассмотрим алгоритмы в классе сложности O(f(n))
, независимо от констант.