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

Метод потенциалов — один из методов амортизационного анализа, позволяющий «сгладить» влияние дорогих, но редких операций на суммарную вычислительную сложность алгоритма[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.