ВПЕРЁД

НАЗАД



Асимптотическая оценка сложности вычислений

Получая оценку для сложности вычислений какого-либо алгоритма, мы, в первую очередь, хотим узнать порядок роста для функции , вносящий решающий вклад в рост сложности вычислений рассматриваемого алгоритма. Можно даже сказать, что, оценивая функцию , мы ищем некоторые границы, за пределы которых функция не должна выходить.

Мы можем оценивать время работы алгоритма по разному, например:

  • как время , которое для любого фиксированного усредняется по всем возможным экземплярам входных данных;
  • как время , для любых значений которого рассматриваются только наихудшие варианты экземпляров входных данных, когда алгоритм отрабатывает медленней всего;
  • как время , для любых значений которого рассматриваются только наилучшие варианты экземпляров входных данных, когда алгоритм отрабатывает быстрей всего.
  • как время , получаемое для входных данных, обладающих некоторым определённым характером.

Поскольку поведение функции определяется её старшим членом (то есть порядком её роста), содержащим параметр , то целесообразно оценивать время работы алгоритма при больших значениях параметра (в идеале, при бесконечно больших значениях этого параметра), чтобы младшие члены функции не оказывали значимого влияния на её поведение. Соответственно, и ограничения функции лучше искать/оценивать для этих же больших значений параметра . В этом случае допустимо возникновение ситуаций, когда, при малых значениях параметра , функция будет выходить за пределы найденных ограничений по причине того, что на функцию оказывают сильное влияние её младшие члены, из-за которых и происходит выход за границы.

Оценка сложности вычислений алгоритма , полученная для размера входных данных , стремящегося к бесконечности, называется асимптотической оценкой сложности вычислений и показывает, к какому поведению стремится функция при достижении параметром предельных значений.

Если порядок роста функции говорит только о том, каким характером изменения/поведения обладает функция (рассматривается старшее слагаемое без множителя), то асимптотическая оценка сложности вычислений говорит о том, чему приблизительно равна функция с подобным характером изменения (множитель старшего слагаемого в этом случае учитывается).

Рассмотрим функцию . Эту функцию можно асимптотически оценить как , поскольку, при крайне больших значениях параметра , даже такое большое слагаемое как перестанет вносить значимый вклад в эту функцию. Поскольку коэффициент/множитель в члене никак не влияет на характер изменения (в данном случае, на квадратичность) функции и может быть любым, то говорим, что порядком роста функции является . Таким образом, получили: - асимптотическая оценка; - порядок роста. Для асимптотической оценки введём в рассмотрение новую функцию , в качестве аргумента которой будет задаваться порядок роста исходной функции (), и будем использовать обозначение новой функции в оценке сложности исходной зависимости :

Если мы положим, что , то это будет даже лучше, поскольку в этом случае функция будет точно отражать суть функции :

.

В приведённом примере мы можем обобщить/распространить полученный результат на любые значения множителя старшего члена и константного младшего члена:

Можно выделить два преимущества записи исходной функции в виде :

  • Все незначащие множители и слагаемые убраны из рассмотрения и сокрыты под “капотом” функции .
  • В качестве аргумента функции явным образом указывается порядок роста функции , благодаря чему моментально становится понятным, каким поведением обладает функция . В данном случае по самой форме записи можно без труда сделать вывод, что функция имеет порядок роста .

В рассмотренном примере нам удалось свести исходную функцию к функции , где - порядок роста функции . Мы можем обобщить/распространить этот пример на какие-угодно алгоритмы, для которых требуется найти их время работы .

Предположим, что нам известна исходная зависимость , оценку для которой хотелось бы получить. Тогда процесс получения оценки времени работы для любого алгоритма может быть сведён к следующим шагам:

  1. В исходной зависимости необходимо выделить главный член, соответствующий порядку роста функции . Пусть - порядок роста исходной зависимости .
  2. Для полученного порядка роста исходной зависимости необходимо найти/подобрать такую функцию , что .

Таким образом, получаем, что оценка времени работы алгоритма является композицией двух функций: - порядка роста функции ; - функции, которая при довольно точно описывает исходную функцию , то есть :

, где - композиция функций и ;

.



ВПЕРЁД

НАЗАД