Метод потенциалов (амортизационный анализ)

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Значения Метод потенциалов — один из методов амортизационного анализа, позволяющий «сгладить» влияние дорогих, но редких операций на суммарную вычислительную сложность алгоритма[1][2].

Определения

В методе потенциалов вводится функция Φ, связывающая состояние структуры данных с некоторым неотрицательным числом. Смысл данной функции заключается в том, что если S — текущее состояние структуры, то Φ(S) — это величина, характеризующая объём работы «дорогих» операций, который уже был «оплачен» более дешёвыми операциями, но не был произведён. Таким образом, Φ(S) может рассматриваться как аналог потенциальной энергии, ассоциированной с данным состоянием[1][2]. Изначально значение потенциальное функции обычно полагается равным нулю.

Пусть o — некоторая отдельная операция из серии, Sbefore — состояние структуры до этой операции, а Safter — после неё. Тогда амортизированная сложность операции o равна

Tamortized(o)=Tactual(o)+Φ(Safter)Φ(Sbefore).

Соотношения между амортизированной и реальной стоимостью

Суммарная амортизированная стоимость последовательности операций является валидной оценкой сверху для реальной стоимости этой последовательности операций.

Для последовательности операций O=o1,o2,,on, можно определить:

  • Суммарное амортизированное время: Tamortized(O)=i=0nTamortized(oi),
  • Суммарное реальное время: Tactual(O)=i=0nTactual(oi).

В таких обозначениях:

Tamortized(O)=i=1n(Tactual(oi)+Φ(Si)Φ(Si1))=Tactual(O)+Φ(Sn)Φ(S0),

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

Из того, что Φ(S0)=0 и Φ(Sn)0 следует неравенство Tactual(O)Tamortized(O), как и было сказано ранее.

Примеры

Стек с массовыми удалениями

Можно рассмотреть вариант стека, поддерживающий следующие операции:

  • initialize — создать пустой стек.
  • push — добавить единственный элемент на верхушку стека, увеличив его размер на 1.
  • pop(k) — убрать k элементов с верхушки стека, где k не превосходит текущий размер стека.

Одна операция pop(k) требует O(k) времени, совокупное же время работы может быть проанализировано с помощью следующей потенциальной функции Φ(S), равной числу элементов в стеке S. Данная величина всегда неотрицательна, при этом операция push работает за константу и увеличивает Φ на единицу, а операция pop работает за O(k), но также уменьшает потенциальную функцию на k, поэтому её амортизированное время также константно. Из этого следует, что суммарное время исполнения любой последовательности из m операций равно O(m) в худшем случае.

Двоичный счётчик

Другим примером является счётчик, реализованный в виде двоичного числа, поддерживающего такие операции:

  • initialize -- создать счётчик со значением 0.
  • inc — увеличить значение счётчика на 1.

Чтобы показать, что амортизированная стоимость inc равна O(1), следует рассмотреть потенциальную функцию, равную числу бит счётчика, равных 1 (Шаблон:Не переведено 5 счётчика). Как и требуется, такая функция всегда неотрицательна и изначально равна 0. Операция inc сперва инвертирует младший значимый бит счётчика, а затем, если он был равен 1, повторяет то же самое со следующим битом, пока не наткнётся на 0. Если до этого в конце битовой записи счётчика было k единичных битов, потребуется инвертировать k+1 бит, затрачивая k+1 единиц реального времени и уменьшая потенциал на k1. Таким образом, амортизированная стоимость операции inc равна 2 и, как следствие, время исполнения m операций inc равно O(m).

Применения

Метод потенциалов обычно используется для анализа фибоначчиевых куч, в которых извлечение элемента требует амортизированно логарифмического времени, а все остальные операции занимают амортизированно константное время[3]. Также с его помощью можно показать, что splay-дерево обладает логарифмической амортизированной стоимостью операций[4].

Примечания

Шаблон:Примечания

  1. 1,0 1,1 Шаблон:Citation.
  2. 2,0 2,1 Шаблон:Книга:CLRS
  3. Cormen et al., Chapter 20, «Fibonacci Heaps», pp. 476—497.
  4. Goodrich and Tamassia, Section 3.4, «Splay Trees», pp. 185—194.