Під асимптотичним аналізом я припускаю, що ми маємо на увазі поведінку алгоритму, оскільки розмір вхідного сигналу йде до нескінченності.
Причина, по якій ми використовуємо асимптотичний аналіз, полягає в тому, що
вона корисна для прогнозування поведінки алгоритмів на практиці . Прогнози дозволяють нам приймати рішення, наприклад, коли у нас є різні алгоритми для проблеми, яку нам слід використовувати? (Бути корисним не означає, що це завжди правильно.)
Це ж питання можна задати про будь-яку спрощену модель реального світу. Чому ми використовуємо спрощені математичні моделі реального світу?
Подумайте про фізику. Класична ньютонівська фізика не така хороша, як релятивістська фізика в прогнозуванні реального світу. Але це досить хороша модель для будівництва автомобілів, хмарочосів, підводних човнів, літаків, мостів тощо. Є випадки, коли це недостатньо добре, наприклад, якщо ми хочемо побудувати супутник або відправити космічний зонд до Плутона або передбачити рух масивних небесних об'єктів, таких як зірки і планети або дуже швидкісні об'єкти, як електрони.
Важливо знати, які межі моделі.
Зазвичай це досить хороше наближення до реального світу.
На практиці ми часто бачимо, що алгоритм з кращим асимптотичним аналізом працює краще на практиці. Рідко буває так, що алгоритм має кращу асимптотичну поведінку. Отже, якщо входи можуть бути достатньо великими, то, як правило, ми можемо розраховувати на асимптотичний аналіз як на перший прогноз поведінки алгоритмів. Це не так, якщо ми знаємо, що вхід буде малим. Залежно від ефективності, яку ми хочемо, нам може знадобитися зробити більш ретельний аналіз, наприклад, якщо у нас є інформація про розподіл входів, алгоритм буде наданий, ми можемо зробити більш ретельний аналіз для досягнення поставлених цілей (наприклад, швидкий на 99 % входів). Справа, як перший крок, асимптотичний аналіз є гарною відправною точкою. На практиці ми також повинні робити тести на працездатність, але майте на увазі, що це також має свої проблеми.
AAAмає кращу асимптотичну складність. Що жоден з них не кращий за інший у всіх входах? Тоді вона стає більш хитрою і залежить від того, що нас хвилює. Чи ми дбаємо про великі входи чи малі входи? Якщо ми дбаємо про великі входи, то нечасто алгоритм має кращу асимптотичну складність, але погіршує себе на великих входах, які нас цікавлять. Якщо ми дбаємо більше про невеликі введення, то асимптотичний аналіз може виявитися не таким корисним. Ми повинні порівнювати час роботи алгоритмів на входах, які нас цікавлять. На практиці для складних завдань із складними вимогами асимптотичний аналіз може бути не таким корисним. Для простих основних проблем, які охоплюють підручники алгоритму, це досить корисно.
Коротше кажучи, асимптотична складність порівняно легко обчислити наближення фактичної складності алгоритмів для простих основних завдань (проблеми в підручнику з алгоритмами). Оскільки ми будуємо складніші програми, вимоги до продуктивності змінюються та ускладнюються, а асимптотичний аналіз може виявитися не настільки корисним.
Добре порівнювати асимптотичний аналіз з іншими підходами для прогнозування продуктивності алгоритмів та їх порівняння. Одним із загальних підходів є тести на ефективність щодо випадкових або контрольних входів. Це часто, коли обчислення асимптотичної складності є важким або нездійсненним, наприклад, коли ми використовуємо евристику, як, наприклад, рішення SAT. Інший випадок, коли вимоги є складнішими, наприклад, коли продуктивність програми залежить від зовнішніх факторів, і нашою метою може бути те, що закінчується в певні встановлені часові рамки (наприклад, подумайте про оновлення інтерфейсу, показаного користувачеві) на 99% входи.
Але майте на увазі, що аналіз ефективності також має свої проблеми. Це не дає математичних грантів на ефективність на меншій мірі, ми фактично виконуємо тест на ефективність на всіх входах, які будуть задані алгоритму (часто обчислювально непереборним) (і часто неможливо вирішити, що деякі входи ніколи не будуть надані). Якщо ми протестуємо на випадковій вибірці або еталоні, ми неявно припускаємо деяку закономірність
щодо роботи алгоритмів, тобто алгоритм буде виконувати аналогічно на інших входах, які не були частиною тесту на ефективність.
Друге питання тестів на ефективність полягає в тому, що вони залежать від тестового середовища. Тобто продуктивність програми не визначається лише вхідними даними, а зовнішніми факторами (наприклад, тип машини, операційна система, ефективність кодованого алгоритму, використання центрального процесора, час доступу до пам'яті тощо), деякі з яких можуть змінюватися в різних режимах роботи тест на одній машині. Тут ми знову припускаємо, що конкретні середовища, в яких проводиться тест продуктивності, аналогічні фактичному середовищу, якщо ми не робимо тести на ефективність у всіх середовищах, на яких ми можемо запустити програму (і як ми можемо передбачити, на яких машинах хтось може запустити сортування алгоритм включення через 10 років?).
Θ(nlgn)Θ(n2)Θ(lgn)O(n)