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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

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

Определения[править | править код]

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

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

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

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

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

  • Суммарное амортизированное время:
  • Суммарное реальное время:

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

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

Из того, что и следует неравенство , как и было сказано ранее.

Примеры[править | править код]

Стек с массовыми удалениями[править | править код]

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

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

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

Двоичный счётчик[править | править код]

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

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

Чтобы показать, что амортизированная стоимость inc равна , следует рассмотреть потенциальную функцию, равную числу бит счётчика, равных (вес Хемминга[англ.] счётчика). Как и требуется, такая функция всегда неотрицательна и изначально равна . Операция inc сперва инвертирует младший значимый бит счётчика, а затем, если он был равен , повторяет то же самое со следующим битом, пока не наткнётся на . Если до этого в конце битовой записи счётчика было единичных битов, потребуется инвертировать бит, затрачивая единиц реального времени и уменьшая потенциал на . Таким образом, амортизированная стоимость операции inc равна и, как следствие, время исполнения операций inc равно .

Применения[править | править код]

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

Примечания[править | править код]

  1. 1 2 Goodrich, Michael T.; Tamassia, Roberto (2002), "1.5.1 Amortization Techniques", Algorithm Design: Foundations, Analysis and Internet Examples, Wiley, pp. 36—38.
  2. 1 2 Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. 18.3 метод потенциалов // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — С. 412—416. — ISBN 5-8459-0857-4.
  3. Cormen et al., Chapter 20, «Fibonacci Heaps», pp. 476—497.
  4. Goodrich and Tamassia, Section 3.4, «Splay Trees», pp. 185—194.