Что такое амортизированный анализ алгоритмов?

Чем он отличается от асимптотического анализа? Когда вы используете его и почему?

Я прочитал несколько статей, которые, похоже, были написаны хорошо, например:

но я до сих пор не полностью понял эти понятия.

Итак, может ли кто-нибудь упростить это для меня?

Ответ 1

Амортизированный анализ не наивно умножает количество вызовов с наихудшим случаем для одного вызова.

Например, для динамического массива, который при необходимости удваивается по размеру, нормальный асимптотический анализ будет заключаться только в том, что добавление элемента к нему стоит O (n), потому что ему, возможно, придется расти и копировать все элементы в новый массив. Амортизированный анализ учитывает, что для того, чтобы расти, необходимо добавить n/2 элемента, не вызывая роста с тех пор, как предыдущее растёт, поэтому добавление элемента действительно занимает только O (1) (стоимость O (n) равна амортизируется над n/2 действиями).

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

Ответ 2

Есть много ответов на "что", но никто не "почему".

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

Если вы обеспокоены общим временем работы более длительной работы, лучшие оценки амортизируемого анализа, вероятно, вас волнует. Именно поэтому языки сценариев (например) часто с удовольствием выращивают массивы и хеш-таблицы, хотя это дорогостоящая операция. (Возрастание может быть операцией O(n), но амортизация O(1), потому что вы делаете это редко.)

Если вы выполняете программирование в реальном времени (отдельные операции должны выполняться в предсказуемое время), то лучшие оценки от анализа с амортизацией не имеют значения. Не имеет значения, была ли операция в среднем быстрой, если вы не смогли закончить ее вовремя, чтобы вернуться и отрегулировать ленточную пилу до того, как она срезана слишком далеко...

Что имеет значение в вашем случае, зависит от вашей проблемы программирования.

Ответ 3

Асимптотический анализ

Этот термин относится к анализу производительности алгоритма в предположении, что данные, на которых работает алгоритм (вход), в терминах непрофессионала "достаточно велики, чтобы сделать его более крупным, не изменит вывод". Хотя точный размер ввода не нужно указывать (нам нужна только верхняя граница), сам набор данных должен быть указан.

Заметим, что до сих пор мы говорили только о методе анализа; мы не указали точно, какое количество мы анализируем (временная сложность? пространственная сложность?), и мы не указали, какую метрику мы интересуем (наихудший случай? лучший случай? средний?).

На практике термин "асимптотический анализ" обычно относится к сложной временной сложности алгоритма, т.е. к худшему результату, измеренному общим временем работы, который представлен большой ночейкой (например, алгоритм сортировки может быть O(nlogn)).

Амортизированный анализ

Этот термин относится к анализу производительности алгоритма на основе определенной последовательности операций, которая нацелена на наихудший сценарий - то есть, амортизированный анализ подразумевает, что показатель является наихудшим показателем (хотя он все еще не говорит, какое количество измеряется). Чтобы выполнить этот анализ, нам нужно указать размер ввода, но нам не нужно делать какие-либо предположения о его форме.

В условиях непрофессионала амортизированный анализ выбирает произвольный размер для ввода и затем "выполняет" алгоритм. Всякий раз, когда принимается решение, зависящее от ввода, происходит худший путь¹. После того как алгоритм завершился до конца, мы делим рассчитанную сложность на размер ввода для получения конечного результата.

¹note: Точнее, наихудший путь, который теоретически возможен. Если у вас есть вектор, который динамически удваивает размер каждый раз, когда его емкость исчерпана, "наихудший случай" не означает, что ему нужно удвоить каждую вставку, потому что вставки обрабатываются как последовательность. Нам разрешено (и действительно необходимо) использовать известное состояние для математического устранения как можно большего числа "еще худших" случаев, даже если вход остается неизвестным.

Самое важное различие

Критическое различие между асимптотическим и амортизированным анализом состоит в том, что первое зависит от самого входа, а второе зависит от последовательности операций, которые выполнит алгоритм.

Таким образом:

  • асимптотический анализ позволяет утверждать, что сложность алгоритма, когда ему присваивается наилучший/худший/средний случай ввода размера, приближающегося к N, ограничен некоторой функцией F (N) - где N - переменная
  • Амортизированный анализ позволяет утверждать, что сложность алгоритма, когда ему задан вход неизвестных характеристик, но известный размер N не хуже значения функции F (N) - где N - известное значение

Ответ 4

Ответ на это кратко определяется первым предложением главы "Амортизированный анализ" в книге "Введение в алгоритмы":

В амортизированном анализе время, необходимое для выполнения последовательности операции структуры данных усредняются по всем операциям выполняется.

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

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

Следовательно, имеет смысл усреднять стоимость по последовательности операций, хотя одна операция может быть дорогостоящей. Это Амортизированный анализ!

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

Ответ 5

Лучшая ссылка, которую я нашел до сих пор для понимания амортизированного анализа алгоритмов, содержится в книге Введение в алгоритмы, третье издание, глава 17: "Амортизированный анализ". Все это там, объясняется намного лучше, чем то, что можно найти в столбце Stack Overflow. Вы найдете книгу в библиотеке любого приличного университета.

Ответ 6

Регулярный асимптотический анализ асимптотически оценивает работу отдельной операции в зависимости от размера проблемы. Обозначение O() - это то, что указывает на асимптотический анализ.

Амортизированный анализ (который также является асимптотическим анализом) рассматривает общую производительность нескольких операций в общей структуре данных.

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

Например, отдельная операция в splay tree размера N может занимать до O (N) время. Однако последовательность операций M в дереве размера N ограничена временем O (M (1 + log N) + N log N), которое приблизительно равно O (log N) за операцию. Однако учтите, что амортизационный анализ гораздо более строг, чем "средний случай": он доказывает, что любая возможная последовательность операций будет удовлетворять его асимптотическому наихудшему случаю.

Ответ 7

Амортизированный анализ касается общей стоимости в течение ряда прогонов рутины и преимуществ, которые могут быть получены в ней. Например, поиск несортированного массива из n элементов для одного совпадения может занимать до n сравнений и, следовательно, является o (n) сложностью. Однако, если мы знаем, что один и тот же массив будет искать m элементов, повторение общей задачи будет иметь сложность O (m * n). Однако, если мы сортируем массив заранее, стоимость равна O (n log (n)), и для последовательных поисков для сортированного массива требуется только O (log (n)). Таким образом, общая амортизированная стоимость для m элементов, применяющих этот подход, равна O (n * log (n) + m * log (n)). Если m >= n, это равно O (n log (n)) путем предварительной сортировки по сравнению с O (n ^ 2) для не сортировки. Таким образом, амортизированная стоимость дешевле.

Проще говоря, потратив немного немного раньше, мы можем сэкономить намного позже.