По сути, мы хотим описать время выполнения алгоритма на основе входных данных.«Время выполнения» - это расплывчатый термин, который часто скрывают под ковриком.Например, «время выполнения» алгоритма сортировки или операции хеширования измеряется числом сравнений, но использование «времени выполнения» для обозначения количества базовых операций (которые также обычно определяются только смутно).
Существует два варианта (или упрощения), которые часто делают при расчете времени выполнения.Во-первых, игнорировать фактический вход и использовать вместо него размер входа (измеренный каким-либо образом).Этот размер обычно обозначается n
.Во-вторых, использовать нотацию big-O для описания наихудшего случая (или лучшего, или среднего, или амортизированного ...).
Ни один из этих вариантов не всегда необходим, и иногда они выигрывают 'не имеет смысла.Повторим, так как это суть ответа: описание времени выполнения в big-O n
- не единственный способ описания времени выполнения, и иногда нет смысла это делать.
Например, вслучай алгоритма, который выполняется за O(sum(a))
время:
func f(a) {
t = 0
for x in a {
for i = 1..x {
t += 1
}
}
}
Бесполезно описывать время выполнения этого с использованием длины входного массива a
.Это бесполезно, потому что длина a
ничего не говорит о времени выполнения в худшем случае.
Сказать, что t
увеличивается sum(a)
раз , это полезное утверждение овремя выполнения программы.Он не использует нотацию сложности big-O.
И если вы do хотите выразить это в нотации big-O, вы можете сказать, что время выполнения этого кода равно O(sum(a))
,Это размывает в точности то, что вы измеряете во время выполнения, потому что вы можете включить стоимость выполнения операторов, кроме увеличения t
.
. Возвращаясь к примеру, вы могли бы (и если вы изучаете классы сложности, вы, вероятно, ) скажете, n
- это размер (в битах) входного массива.Тогда вы могли бы что-то сказать о времени выполнения (измеряется в основных операциях): это O (2 ^ n), поскольку наихудшим случаем ввода является массив с одним элементом, который принимает значение 2 ^ n-1 (* note).
* примечание: здесь игнорируются некоторые технические подробности о том, как кодировать массив с использованием битов.