Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1809 / 499 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 1:

Вводная

Лекция 1: 123 || Лекция 2 >

Классы функций, используемые для оценки сложности алгоритмов

Все функции, используемые ниже для оценки сложности алгоритмов, считаются асимптотически неотрицательными функциями натурального аргумента, то есть неотрицательными, начиная с некоторого значения аргумента n.

Для асимптотических оценок сверху используется класс функций

{
O (g(n))=\{f(n):\exists c>0, \exists n_{0} \forall n>n_{0}
[0\le f(n)\le c\cdot g(n)]\}.
}

Для асимптотических оценок снизу используется класс функций

{
\Omega (g(n))=\{ f(n):\exists c>0,\exists n_{0}
\forall n>n_{0} [0\le c\cdot g(n)\le f(n)]\}.
}

Для асимптотически точных оценок используется класс функций

{
\Theta (g(n))=\{ f(n):\exists c_{1},c_{2} >0,\exists n_{0}
\forall n>n_{0} [0\le c_{1} g(n)\le f(n)\le c_{2} g(n)]\}.
}

Очевидно, что справедливы следующие соотношения

{
\begin{gathered}
\Theta (g(n))= O (g(n))\cap \Omega (g(n)),\\
f(n)\in O (g(n))\Leftrightarrow g(n)\in \Omega (f(n)).
\end{gathered}
}

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

Амортизационный анализ

Наряду с получением верхних и нижних оценок и оценок в среднем, часто используются так называемые амортизационные оценки.

Амортизационный анализ применяется при оценке времени выполнения корректной последовательности, состоящей из n однотипных или разнотипных операций с некоторой структурой данных. Если верхнюю оценку времени выполнения одной операции умножить на n, получим верхнюю оценку выполнения всех n операций. Часто такая оценка бывает сильно завышенной. Иногда длительное время выполнения очередной операции влечет за собой малое время выполнения следующих операций. Более того, такая ситуация может создаваться искусственно, то есть при выполнении очередной операции мы можем готовить почву для более эффективного выполнения следующей. Поэтому возникает задача изучения асимптотического поведения гарантированной оценки для среднего времени выполнения одной операции.

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

Ниже рассмотрим три часто используемых метода амортизационного анализа: метод группировки, метод предоплаты и метод потенциалов.

Метод группировки. Предположим, что мы оценили сверху время выполнения последовательности из n операций, установив, что она не превосходит T(n), тогда величину T(n)/n объявим учетной стоимостью любой операции из рассматриваемой последовательности, независимо от ее длительности.

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

Метод потенциалов. Этот метод является обобщением метода предоплаты. Здесь резерв определяется функцией состояния структуры данных в целом. Эта функция называется потенциалом.

Общая схема метода такова. Пусть над структурой данных предстоит произвести n операций, и пусть D_i — состояние структуры данных после i -й операции ( D_0 — исходное состояние). Потенциал представляет собой функцию \phi из множества возможных состояний структуры данных в множество действительных чисел.

Пусть c_i — реальная стоимость i -й операции. Учетной стоимостью i -й операции объявим число C_i, определяемое формулой

\eq*{
C_{i} =c_{i} +\phi (D_{i})-\phi (D_{i-1})
}
как сумма реальной стоимости операции плюс приращение потенциала в результате выполнения этой операции. Тогда суммарная учетная стоимость всех операций равна
\eq*{
\suml_{i=1}^{n}C_{i}  =\suml_{i=1}^{n}c_{i}
+\phi (D_{n} )-\phi (D_{0}).
}

Если нам удалось придумать функцию \phi, для которой

\eq*{
\phi (D_{n} )\ge \phi (D_{0}),
}
то суммарная учетная стоимость даст верхнюю оценку для реальной стоимости последовательности из n операций. Не ограничивая общности, можно считать, что
\eq*{
\phi (D_{0} )=0.
}
Говоря неформально, если разность потенциалов
\eq*{
\phi (D_{i} )-\phi (D_{i-1})
}
положительна, то учетная стоимость i -й операции включает в себя резерв (предоплату за будущие операции); если же эта разность отрицательна, то учетная стоимость i -й операции меньше реальной и разница покрывается за счет накопленного к этому моменту потенциала.

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

Ниже эти три метода будут проиллюстрированы на примере анализа работы двоичного счетчика с единственной операцией Increment (прибавление единицы).

Лекция 1: 123 || Лекция 2 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...