Не существует общей процедуры для этого, которая всегда будет работать, но в целом существует множество мощных методов.
Предположим, что среда выполнения вашей программы имеет одну из следующих «стандартных» форм:
- Полином: O (n k )
- Экспоненциальный: O (a n )
Еслиу него есть одна из этих форм, вот несколько полезных методов для определения констант, управляющих выражением big-O.
Полиномиальное время
Если ваша функция имеет время выполнения O (n k), тогда (для больших n) время выполнения будет приблизительно иметь вид T (n) = c · n k .Действительно полезный способ выяснить, что такое c и k, - это использовать log-log plot .Предположим, что вы посмотрите на значения log T (n) и log (c · n k ).Обратите внимание, что
log (c · n k ) = log c + k log n
Это означает, что если у вас есть log-logplot, где зависимая переменная - log T (n), а независимая переменная - log n, тогда любой многочлен будет выглядеть как линия.Затем вы можете использовать любой стандартный метод линейной регрессии, чтобы получить наиболее подходящую линию, соответствующую линии, из которой вы можете восстановить log c и k в приведенном выше выражении.Оттуда время выполнения вашего алгоритма будет O (n k )
Экспоненциальное время
Если ваше время выполнения экспоненциально (то есть O (a )n ) для некоторых а), тогда вы можете использовать стандартный лог-план для восстановления базы а.Если ваша функция приблизительно равна T (n) = c · a n для некоторых констант a и c, то взятие логарифма с правой стороны дает вам
log (c · a n ) = log c + n log a
Это означает, что если вы построите T (n) вместо log c + n log a, вы вернетеськакая-то прямая линия.Затем вы можете выполнить регрессию для восстановления журнала c и журнала a, из которого время выполнения может быть считано как O (a n ).
Надеюсь, это поможет!