Що таке амортизований аналіз алгоритмів? [зачинено]


85

Чим він відрізняється від асимптотичного аналізу? Коли ви використовуєте його, і чому?

Я прочитав деякі статті, які, здається, були написані добре, наприклад такі:

але я все ще не розумію цих понять повністю.

Тож, може хтось спростить мені це?


5
Ймовірно, належить на programmers.stackexchange.com
lanzz

2
@lanzz Можливо, це тепер належало б cs.stackexchange.com
nbro

Чудова нитка про значення Постійного амортизованого часу .
RBT

Відповіді:


87

Амортизований аналіз не наївно помножує кількість викликів на найгірший випадок одного виклику.

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

Амортизований аналіз - це не те саме, що "середня ефективність" - амортизований аналіз дає тверду гарантію того, що буде робити ефективність, якщо ви зробите стільки дій.


1
"Амортизований аналіз враховує, що для того, щоб рости, слід додавати n / 2 елементів, не викликаючи зростання, оскільки попередній ріст, тому додавання елемента насправді займає лише O (1) (вартість O (n) амортизується за n / 2 дії). " Це було досить заплутано і незрозуміло.
AleksandrH

@AleksandrH якась його частина?
Гарольд,

Так, просто важко слідувати математиці без пояснення, звідки беруться цифри
AleksandrH

44

Є багато відповідей на питання "що", але жодного на "чому".

Як сказали всі інші, асимптотичний аналіз стосується того, як продуктивність даної операції масштабується до великого набору даних. Амортизований аналіз стосується того, як масштабуються середні показники продуктивності всіх операцій на великому наборі даних. Амортизований аналіз ніколи не дає гірших меж, ніж асимптотичний, а іноді дає набагато кращі.

Якщо вас турбує загальний час роботи довшої роботи, то кращі межі амортизованого аналізу - це, мабуть, ваше значення. Ось чому мови сценаріїв (наприклад) часто раді збільшити масиви та хеш-таблиці за деяким фактором, хоча це дорога операція. (Вирощування може бути O(n)операцією, але амортизується тому, O(1)що ви робите це рідко.)

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

Який із них має значення у вашому випадку, залежить від того, яка саме проблема у програмуванні.


1
"Зростаюча операція може бути O (n), але амортизована O (1), оскільки ви робите це рідко". Я думаю, що це твердження дійсно потребує суворого математичного доказу.
nbro

"Якщо ви займаєтесь програмуванням у режимі реального часу ...", вам слід бути більш точним і пояснити, чому саме цей абзац слід сприймати як "істинний".
nbro

1
@nbro Чому, на вашу думку, "слід"? Питання задає питання, чим амортизований аналіз відрізняється від асимптотичного і коли ви хочете використовувати кожен. У ньому є посилання на статті, що пояснюють, як їх робити. Тож математичний аналіз видається зайвим. Що стосується програмування в режимі реального часу, я це пояснив. Програмування в реальному часі - це програмування, при якому окремі операції повинні виконуватися за передбачуваний час. Типовий приклад - це вбудоване програмування, де вам потрібно відстежувати щось через рівні проміжки часу. Такі як управління механізмами. У цьому випадку випадкові повільні операції неприйнятні.
btilly

26

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

Цей термін відноситься до аналізу роботи алгоритму за припущення, що дані, на яких працює алгоритм ( вхідні дані ), кажучи простою мовою, "достатньо великі, щоб їх збільшення не змінило висновок". Хоча точний розмір входу не потрібно вказувати (нам потрібно тільки верхня межа), набір даних , сам повинен бути вказаний.

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

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

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

Цей термін позначає аналіз продуктивності алгоритму, заснований на конкретній послідовності операцій, яка націлена на найгірший сценарій - тобто амортизований аналіз означає, що показник є найгіршим показником (хоча в ньому все ще не сказано, яка величина вимірюється ). Для проведення цього аналізу нам потрібно вказати розмір вхідних даних, але нам не потрібно робити жодних припущень щодо його форми.

Кажучи простою мовою, амортизований аналіз - це вибір довільного розміру для вхідних даних, а потім "відтворення" алгоритму. Щоразу, коли має бути прийнято рішення, яке залежить від вкладених даних, йдеться найгіршим шляхом¹. Після завершення роботи алгоритму ми ділимо обчислену складність на розмір вхідних даних для отримання кінцевого результату.

Примітка: Якщо бути точним, найгірший шлях, який теоретично можливий . Якщо у вас є вектор, який динамічно подвоюється в розмірі кожного разу, коли його потужність вичерпується, "найгірший випадок" не означає припускати, що йому доведеться подвоюватись при кожному вставці, оскільки вставки обробляються як послідовність. Нам дозволено (і справді потрібно) використовувати відомий стан для математичного усунення якомога більшої кількості "ще гірших" випадків, навіть якщо введені дані залишаються невідомими.

Найголовніша відмінність

Критична різниця між асимптотичним та амортизованим аналізом полягає в тому, що перший залежить від самого введення, тоді як другий залежить від послідовності операцій, які буде виконувати алгоритм.

Тому:

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

7
Наведена вище відповідь демонструє, чому люди не повинні сліпо голосувати за довгі відповіді людей з високим рейтингом.
btilly

2
@btilly: Ваш відгук був би набагато кориснішим, якби він діяв - тобто, чи можете ви дати мені уявлення про те, що саме не так із цією відповіддю та як її покращити?
Джон

7
з чого почати? Ви неправильно визначили обидва терміни та дали багато уточнюючих деталей, які також були помилковими. Для випадкового прикладу амортизований аналіз не завжди є найгіршим випадком. Інакше ми не могли б сказати, що амортизована продуктивність вставки в динамічно змінений хеш є O(1).
btilly

@btilly CLRS на сторінці 451 говорить: "... амортизований аналіз гарантує середню продуктивність кожної операції в гіршому випадку".
Glen Selle

1
@GlenSelle Амортизований аналіз - це математичний прийом. Він може бути використаний для різних цілей, включаючи найгірші показники. Однак це НЕ МАЄ бути найгіршим випадком. У вашому випадку це, мабуть, було використано для гіршого випадку. У випадку хешування це не було.
btilly

14

Відповідь на це стисло визначено першим реченням розділу «Амортизований аналіз» у книзі - «Вступ до алгоритмів»:

При амортизованому аналізі час, необхідний для виконання послідовності операцій зі структурою даних, усереднюється за всіма виконаними операціями.

Ми представляємо складність зростання програми за допомогою асимптотичного аналізу - який обмежує ріст програми функцією та визначає найгірший, найкращий або середній випадок цього.

Але це може ввести в оману в тих випадках, коли є лише один випадок, коли складність програми досягає піку, але загалом програма не вимагає великих обчислень.

Отже, є більш розумним усереднювати вартість за послідовність операцій, хоча одна операція може бути дорогою. Це амортизований аналіз!

Амортизований аналіз є альтернативою асимптотичній техніці, що використовується для розрахунку складності. Це допомагає нам розрахувати більш справжню складність з точки зору практичності, щоб порівняти та прийняти рішення між двома або більше алгоритмами.


5

Найкраще посилання, яке я знайшов на сьогодні для розуміння амортизованого аналізу алгоритмів, є у книзі Вступ до алгоритмів , третє видання, глава 17: "Амортизований аналіз". Це все є, пояснюється набагато краще, ніж те, що можна знайти в публікації переповнення стека. Книгу ви знайдете в бібліотеці будь-якого гідного університету.


Так. Читати про амортизований алгоритм із згаданої книги було краще і нарешті дало ясність.
Rajesh Mappu

2

Регулярний асимптотичний аналіз розглядає виконання окремих операцій асимптотично як функцію від розміру проблеми. Позначення O () - це те, що вказує на асимптотичний аналіз.

Амортизований аналіз (який також є асимптотичним аналізом) розглядає загальну продуктивність декількох операцій у спільній структурі даних .

Різниця полягає в тому, що амортизований аналіз, як правило, доводить, що загальні обчислення, необхідні для М операцій, мають кращу гарантію продуктивності, ніж М, у найгірший випадок для окремої операції.

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


1

Амортизований аналіз стосується загальної вартості протягом ряду циклів процедури та переваг, які можна отримати від них. Наприклад, пошук несортованого масиву з 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) для несортування. Таким чином, амортизована вартість дешевша.

Простіше кажучи, витративши трохи раніше на початку, ми зможемо значно заощадити пізніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.