Метод потенциалов (амортизационный анализ) (Bymk; hkmyuenglkf (gbkjmn[genkuudw gugln[))
Метод потенциалов — один из методов амортизационного анализа, позволяющий «сгладить» влияние дорогих, но редких операций на суммарную вычислительную сложность алгоритма[1][2].
Определения
[править | править код]В методе потенциалов вводится функция , связывающая состояние структуры данных с некоторым неотрицательным числом. Смысл данной функции заключается в том, что если — текущее состояние структуры, то — это величина, характеризующая объём работы «дорогих» операций, который уже был «оплачен» более дешёвыми операциями, но не был произведён. Таким образом, может рассматриваться как аналог потенциальной энергии, ассоциированной с данным состоянием[1][2]. Изначально значение потенциальное функции обычно полагается равным нулю.
Пусть — некоторая отдельная операция из серии, — состояние структуры до этой операции, а — после неё. Тогда амортизированная сложность операции равна
Соотношения между амортизированной и реальной стоимостью
[править | править код]Суммарная амортизированная стоимость последовательности операций является валидной оценкой сверху для реальной стоимости этой последовательности операций.
Для последовательности операций , можно определить:
- Суммарное амортизированное время:
- Суммарное реальное время:
В таких обозначениях:
Таким образом, последовательность значений потенциальной функции образует телескопическую сумму, в которой последовательные начальные и конечные значения потенциальной функции сокращаются друг с другом.
Из того, что и следует неравенство , как и было сказано ранее.
Примеры
[править | править код]Стек с массовыми удалениями
[править | править код]Можно рассмотреть вариант стека, поддерживающий следующие операции:
- initialize — создать пустой стек.
- push — добавить единственный элемент на верхушку стека, увеличив его размер на .
- pop(k) — убрать элементов с верхушки стека, где не превосходит текущий размер стека.
Одна операция pop(k) требует времени, совокупное же время работы может быть проанализировано с помощью следующей потенциальной функции , равной числу элементов в стеке . Данная величина всегда неотрицательна, при этом операция push работает за константу и увеличивает на единицу, а операция pop работает за , но также уменьшает потенциальную функцию на , поэтому её амортизированное время также константно. Из этого следует, что суммарное время исполнения любой последовательности из операций равно в худшем случае.
Двоичный счётчик
[править | править код]Другим примером является счётчик, реализованный в виде двоичного числа, поддерживающего такие операции:
- initialize -- создать счётчик со значением .
- inc — увеличить значение счётчика на .
Чтобы показать, что амортизированная стоимость inc равна , следует рассмотреть потенциальную функцию, равную числу бит счётчика, равных (вес Хемминга[англ.] счётчика). Как и требуется, такая функция всегда неотрицательна и изначально равна . Операция inc сперва инвертирует младший значимый бит счётчика, а затем, если он был равен , повторяет то же самое со следующим битом, пока не наткнётся на . Если до этого в конце битовой записи счётчика было единичных битов, потребуется инвертировать бит, затрачивая единиц реального времени и уменьшая потенциал на . Таким образом, амортизированная стоимость операции inc равна и, как следствие, время исполнения операций inc равно .
Применения
[править | править код]Метод потенциалов обычно используется для анализа фибоначчиевых куч, в которых извлечение элемента требует амортизированно логарифмического времени, а все остальные операции занимают амортизированно константное время[3]. Также с его помощью можно показать, что splay-дерево обладает логарифмической амортизированной стоимостью операций[4].
Примечания
[править | править код]- ↑ 1 2 Goodrich, Michael T.; Tamassia, Roberto (2002), "1.5.1 Amortization Techniques", Algorithm Design: Foundations, Analysis and Internet Examples, Wiley, pp. 36—38.
- ↑ 1 2 Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. 18.3 метод потенциалов // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — С. 412—416. — ISBN 5-8459-0857-4.
- ↑ Cormen et al., Chapter 20, «Fibonacci Heaps», pp. 476—497.
- ↑ Goodrich and Tamassia, Section 3.4, «Splay Trees», pp. 185—194.