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

Амортизационный анализ — это метод анализа вычислительной сложности алгоритма, используемый в случаях, когда время исполнения одного шага алгоритма, умноженное на число шагов, даёт слишком большую оценку на время исполнения всего алгоритма по сравнению с тем, какая она на самом деле .

История

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

Метод

Основной идеей амортизационного анализа является то, что любая трудоёмкая операция меняет состояние программы таким образом, что до следующей трудоёмкой операции обязательно пройдёт достаточно много мелких, тем самым «амортизируя» вклад трудоёмкой операции. Есть три основных метода ведения амортизированного анализа: агрегирующий анализ, метод предоплаты и метод потенциалов. Все три дают правильный ответ и в конкретном случае обычно выбирается наиболее удобный :

  • При агрегирующем анализе вычисляется оценка сверху на время исполнения операций, затем амортизационная сложность одной операции приравнивается к .
  • В каждой операции заранее приписывается амортизированная стоимость , которая может отличаться от её реальной стоимости. При этом более «дешёвые» операции обычно имеют амортизированную стоимость выше реальной, а более «дорогие» имеют амортизированную стоимость ниже реальной. За счёт этого при исполнении дешёвых операций накапливается некоторая сумма, которую можно «потратить» на то, чтобы выполнить операцию, чья амортизированная стоимость ниже реальной. Считается, что изначальная сумма равна нулю и если в течение алгоритма она не становится отрицательной, то суммарное время работы алгоритма будет равно разности суммарной амортизированной стоимости операций и накопленной суммы. Таким образом, амортизированная стоимость операций является оценкой сверху для реальной стоимости при условии, что накопленная сумма не становится отрицательной .
  • В методе потенциалов накопленная сумма вычисляется как функция («потенциал») от состояния структуры данных. Амортизированная стоимость при этом равна сумме реальной стоимости и изменения потенциала .

Примеры

Динамический массив

Амортизированный анализ операции push в динамическом массиве

В динамическом массиве помимо индексации есть операция push , которая добавляет элемент в конец массива и увеличивает его размер на единицу. Примерами такого массива являются контейнеры ArrayList в Java и std::vector в C++ . Если изначально размер массива равен 4, в него можно добавить 4 элемента и каждое добавление будет занимать константное время. Добавление же пятого элемента потребует создания нового массива размера 8, в который будут перенесены элементы старого, а затем добавлен новый элемент. Следующие три операции push при этом снова будут занимать константное время, после чего массив снова придётся удвоить.

В общем случае, если было произведено операций push в массив размера , все эти операции будут исполнены за константное время, кроме последней, которая займёт . Из этого можно сделать вывод, что амортизированная стоимость добавления элемента в динамический массив равна .

Примечания

  1. . Carnegie Mellon University . Дата обращения: 14 марта 2015. 26 февраля 2015 года.
  2. Tarjan, Robert Endre . (англ.) // (англ.) : journal. — 1985. — April ( vol. 6 , no. 2 ). — P. 306—318 . — doi : . 30 октября 2022 года.
  3. Rebecca Fiebrink (2007), (PDF) , Дата обращения: 3 мая 2011 . Дата обращения: 7 апреля 2020. Архивировано из 20 октября 2013 года.
  4. Kozen, Dexter . Cornell University (Spring 2011). Дата обращения: 14 марта 2015. 3 октября 2018 года.
Источник —

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