Обчислювальна складність: відмінності між версіями

[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
мНемає опису редагування
мНемає опису редагування
Рядок 4:
 
Нехай А - [[алгоритм]] розв’язання деякого класу задач, а <math>N</math> - [[розмірність]] окремої задачі цього класу. <math>N</math> може бути, наприклад, розмірністю оброблюваного [[масив|масиву]], числом вершин оброблюваного [[граф]]а тощо, Позначимо <math>f_{A}\left(N\right)</math> функцію, що дає верхню межу максимального числа основних операцій (додавання, множення і т. д.), які повинен виконати алгоритм А, розв’язуючи задачу розмірності <math>N</math>. Говоритимемо, що алгоритм А [[поліноміальний алгоритм|поліноміальний]], якщо <math>f_{A}\left(N\right)</math> зростає не швидше, ніж деякий [[поліном]] від <math>N</math>. В іншому разі А - [[експоненціальний алгоритм]]. Виявляється, що між цими класами алгоритмів є істотна різниця: при великих розмірностях задач (які, зазвичай, найцікавіші на практиці), поліноміальні алгоритми можуть бути виконані на сучасних комп'ютерах, тоді як експоненціальні алгоритми для практичних размірностей задач, як правило, не можуть виконатися повністю. Зазвичай розв’язання задач, що породжують експоненціальні алгоритми, пов'язаний з повним перебором всіх можливих варіантів, і зважаючи на практичну неможливість реалізації такої стратегії, для їх розв’язання розробляються інші підходи. Наприклад, якщо навіть існує експоненціальний алгоритм для знаходження оптимального розв’язку деякої задачі, то на практиці застосовуються інші, ефективніші поліноміальні алгоритми для знаходження не обов'язково оптимального, а лише прийнятного розв’язку (наближеного до оптимального). Але навіть якщо задача допускає розв’язання за допомогою поліноміального алгоритму, його можна побудувати лише після глибокого вникання в суть поставленої задачі.
Поліноміальні алгоритми також можуть істотно розрізнятися залежно від степеня полінома, що апроксимує залежність <math>f_{A}\left(N\right)</math>. Розглянемо оцінювання часової складності алгоритму. Така оцінка проводиться із застосуванням відношення <math>O</math> (“велике О”): кажуть, що <math>f_{A}\left(N\right)</math> зростає як <math>g(N)</math> для великих N і записується це як <math>f_{A}\left(N\right)=O\left(g\left(N\right)\right)</math>. Якщо існує позитивна константа Сonst>0, така, що <math>\lim_{N\arrowto\infty} f_Аf_A(N)/g(N) = Const</math>, то оцінка О(g(N)) називається асимптотичною часовою складністю алгоритму. Оцінка О(g(N)) для функції <math>f_Аf_A\left(N\right)</math> застосовується, коли точне значення <math>f_Аf_A\left(N\right)</math> невідоме, а відомо лише порядок зростання часу, затрачуваного на розв’язання задачі розмірністю N за допомогою алгоритму А. Точні значення <math>f_Аf_A\left(N\right)</math> залежать від конкретної реалізації, тоді як О(g(N)) є характеристикою самого алгоритму. Наприклад, якщо тимчасовачасова асимптотична складність алгоритму дорівнює <math>ОO(N^2)</math> (такий алгоритм називається квадратичним), то при збільшенні N час розв’язання задачі збільшується як квадрат N. Факт експоненціальної складності алгоритму в термінах введеної символіки можна записати як <math>f_Аf_A\left(N\right)=O\left(k^N\right)</math>, де k — як правило ціле число більше за одиницю.
Інший вид оцінки пов'язаний з введенням "малого о": кажуть, що <math>f_Аf_A\left(N\right)</math> зростає не швидше від g(N) для великих N, що записується <math>f_Аf_A\left(N\right)=оo\left(g\left(N\right)\right)</math>, якщо <math>\lim_{N\arrowto\infty} f_Аf_A(N)/g(N) = 0</math>. Наприклад, очевидно, що <math>x^2=o(x^5), sin(x)=o(x)</math>. Інший приклад: алгоритм А є поліноміальним, якщо <math>f_Аf_A\left(N\right)= оo\left(P_k\left(N\right)\right)</math>, де P<sub>k</sub>(N) - деякий поліном від N степеня k. Так, алгоритм, асимптотична складність якого дорівнює о(N log N), належить до поліноміальних.