You are on page 1of 58

МЕТОДИ РОЗРОБКИ

АЛГОРИТМІВ

ГЛИБОВЕЦЬ М.М.

ЛЕКЦІЯ 2. МАТЕМАТИЧНА
СКЛАДОВА АНАЛІЗУ
АЛГОРИТМІВ
КЛАСИ ВХІДНИХ ДАНИХ
 При аналізі алгоритму вибір вхідних даних може
істотно вплинути на його виконання.
Тому не будемо обмежуватися аналізом поведінки
алгоритмів на одному вхідному наборі даних.
 Практично потрібно шукати такі дані, які
забезпечують як найшвидше, так і саме повільне
виконання алгоритму.
 Крім того, корисно оцінювати і середню
ефективність алгоритму на всіх можливих наборах
даних.
КЛАСИ ВХІДНИХ ДАНИХ
 Час виконання алгоритму в найкращому випадку дуже
часто виявляється маленьким або просто
постійним, тому подібний аналіз проводиться рідко.
 Аналіз найгіршого випадку надзвичайно важливий,
оскільки він дозволяє представити максимальний час
роботи алгоритму.
 При аналізі найгіршого випадку необхідно знайти вхідні
дані, на яких алгоритм буде виконувати найбільше роботи.
КЛАСИ ВХІДНИХ ДАНИХ
 Аналіз середнього випадку є найскладнішим, оскільки
він вимагає обліку множини різноманітних деталей.
 В основі аналізу лежить визначення різних груп, на які
слід розбити можливі вхідні набори даних.
 На другому кроці визначається ймовірність, з якою
вхідний набір даних належить кожній групі.
 На третьому кроці підраховується час роботи
алгоритму на даних з кожної групи.
 Час роботи алгоритму на всіх вхідних даних однієї
групи має бути однаковим, в іншому випадку групу
слід подрібнити.
 Середній час роботи обчислюється за формулою:
КЛАСИ ВХІДНИХ ДАНИХ
 Середній час роботи обчислюється за формулою:

де через n позначений розмір вхідних даних, через m - число груп.


через pi - ймовірність того, що вхідні дані належать групі з номером i,
а через ti - час, необхідний алгоритму для обробки даних з групи з
номером i.
 У більшості випадків ми будемо припускати, що ймовірності
попадання вхідних даних в кожну з груп однакові.
 Іншими словами, якщо груп п'ять, то ймовірність потрапити в першу
групу така ж, як ймовірність потрапити в другу, і т.д., то є ймовірність
потрапити в кожну групу дорівнює 0.2.
У цьому випадку середній час роботи можна або оцінити за
попередньою формулою, або скористатися еквівалентної їй
формулою
НИЖНІ МЕЖІ. ДЕРЕВО РІШЕНЬ.
 Алгоритм є оптимальним, якщо будь-який інший
алгоритм, що вирішує це завдання, працює не швидше
даного.
 Як дізнатися оптимальність алгоритму?

 Для цього ми повинні знати мінімальну кількість


операцій, необхідне для вирішення поставленого
завдання, яке називається нижньою межею.
 Але для цього нам потрібно вивчати саме
ЗАВДАННЯ, а не конкретний алгоритм!
 Як приклад, розглянемо аналіз процесу сортування
списку з 3 чисел, скориставшись бінарним деревом.
 Таке дерево називається деревом рішень.
ЧАС ВИКОНАННЯ СОРТУВАНЬ ПОРІВНЯННЯМИ
 Існує "загальновідома теорема" (з математичного фольклору),
що для сортування n елементів "потрібно часу n log n".
 Але, це твердження не завжди вірно: якщо тип ключів такий,
що значення ключів вибираються з кінцевого (за кількістю
елементів) множини (це дозволяє з "користю" застосувати
метод "кишенькової" або порозрядного сортування)
 Тоді для сортування достатньо часу порядку О(n). Однак в
загальному випадку ми не можемо стверджувати, що ключі
приймають значення з кінцевої множини.
 Тому при проведенні сортування ми можемо спиратися тільки
на операцію порівняння двох значень ключів, в результаті якої
можна сказати, що одне значення ключа менше іншого.
ДЕРЕВО РІШЕНЬ
 Можна намалювати двійкове дерево, в якому вузли будуть
відповідати "станам" алгоритму після певної кількості
зроблених порівнянь ключів.
 Вузли дерева можна також розглядати як відповідність деяким
початковим упорядкування даних, які "призвели" алгоритм
сортування до такого "стану".
 Можна також сказати, що цей "стан" відповідає нашим
знанням про первісне впорядкування початкових даних, які
можна отримати на даному етапі виконання алгоритму.
ДЕРЕВО РІШЕНЬ
 Якщо який-небудь вузол відповідає кільком упорядкуванням
початкових даних, то алгоритм на цьому етапі не може точно
визначити справжній порядок даних і тому необхідно
виконати наступне порівняння ключів, наприклад
"Чи є k1 < k2 ? ".
 В залежності від можливих відповідей на це питання
створюються два сина цього вузла.
 Лівий син відповідає випадку, коли значення ключів задовольняють
k1 < k2 ;
 правий син відповідає впорядкування при виконанні нерівності k1>
k2.

 Таким чином, кожен син "містить« інформацію, доступну


батькові, плюс відомості, що випливають з відповіді на
питання, "Чи є k1 < k2 ? ".
ДЕРЕВО РІШЕНЬ

ДЕРЕВО РІШЕНЬ

 Найдовший шлях
у цьому дереві відповідає найгіршому випадку і
навпаки, найкоротший - кращому.
 Середній випадок описується часткою від ділення
числа ребер в дереві на число листів.
 Для перестановки 2-х елементів ми маємо 1 листок,
для N ел-тів, за правилами комбінаторики, N! листів.
 Число листів на рівні k становить 2k-1, тому в
нашому дереві рішень буде L-рівнів, де L -
найменше ціле число, для якого N! ≤ 2L-1.
УТОЧНИМО СКАЗАНЕ
 Дерево має шість листів,
відповідних 6 шляхам
упорядкування
початкового списку з трьох елементів.
У загальному випадку, якщо сортується список з n елементів, тоді
існує n! = 1*2 *...* (n - 2)*(n - 1) можливих результатів, які
відповідають різним упорядкованостям початкового списку
елементів.
Справді, на першу позицію можна поставити будь-який з
n елементів, на другу - будь-який з решти n - 1 елементів, на
третю - будь-який з n - 2 елементів і т.д., твір кількості всіх цих
окремих результатів дає n!
 Таким чином, будь-яке дерево рішень, яке описує алгоритм
сортування списку з п елементів, повинно мати не менше n!
листя.
УТОЧНИМО СКАЗАНЕ
 Фактично, якщо видалити
вузли і листя, відповідні
неможливим сполученням елементів, отримаємо в точності n!
листя.
 Двійкові дерева, що мають багато листя, повинні мати і довгі
шляхи.
 Довжина шляху від кореня до листа дорівнює кількості
порівнянь, які необхідно зробити, щоб отримати те
впорядкування, яке відповідає даному листу, виходячи з
певного початкового списку елементів.
 Тому довжина найдовшого шляху від кореня до листа - це
нижня межа кількості кроків (кількість порівнянь ключів),
ви виконуваних алгоритмом сортування в найгіршому випадку.
УТОЧНИМО СКАЗАНЕ
 Але також не треба забувати, що, крім порівняння ключів,
алгоритм виконує і інші операції.
 Розглянемо, яка ж може бути довжина шляхів в двійковому
дереві з k листям.
 Двійкове дерево, в якому всі шляхи мають довжину р або менше,
може мати: 1 корінь, 2 вузла на першому рівні, 4 вузли на
другому рівні і далі 2^i вузлів на рівні i.
 Томунайбільше число листя 2^p на рівні р, якщо немає вузлів, що
перевищують цей рівень.
 Звідси випливає, що двійкове дерево з k листям повинно мати
шлях довжиною не менше log k.
 Якщо покласти k = n! то отримаємо, що будь-який алгоритм
сортування, який використовує для впорядкування n елементів
тільки порівняння значень ключів, в найгіршому випадку
повинен виконуватися за час, не менше
УТОЧНИМО СКАЗАНЕ
 Як зростає величина log(n!) ?
 За формулою Стірлінга n! можна достатньо точно
апроксимувати функцією (n/е)^n , де е — 2.7183... — основа
натурального логарифма.
 Оскільки

log((n/e)^n) = n logn - n loge = n log n - 1.44n,


тоді можемо сказати, що log(n!) має порядок n logn.
 Можна отримати быльш просту нижню межу, якщо помітити,
що n! є добутком не менше n/2 співмножників, кожний із яких
не більший n/2.
 Тому n! > (n/2)^n/2 .
 Звідки, log(n!) > (n/2)log(n/2) = (n/2)logn - n/2.

 Із цих оцінок випливає, що упорядкування з використанням


порівнянь вимагає в найгіршому випадку часу порядка
В КІНЦЕВОМУ ПІДСУМКУ
 Ось ми і дізналися, що будь-який алгоритм
сортування, порядку
О(NlgN) є найкращим і його можна вважати
оптимальним.
 Більш того, з цього дослідження випливає, що
алгоритм, який вирішує завдання сортування
швидше О (NlgN) операцій, не може
працювати правильно!
ЕФЕКТ ВІД 10-КРАТНОГО ЗБІЛЬШЕННЯ ШВИДКОДІЇ
КОМП'ЮТЕРА

АСИМПТОТИЧНІ ПОЗНАЧЕННЯ
 Підрахунок кількості операцій дозволяє порівняти
ефективність алгоритмів. Однак, аналогічний результат
можна отримати простішим шляхом.
 Аналіз проводять з розрахунком на досить великий
обсяг оброблюваних даних (n → ∞), тому ключове
значення має швидкість росту функції складності, а не
точна кількість оп-цій.
 При аналізі швидкості росту ігноруються постійні члени
та множники у виразі, тобто функції f(x) = 10⋅x^2 + 20 і
g(x) = x^2 «еквівалентні з точки зору швидкості росту».
 Незначущі члени лише додають «хвилястості», яка
ускладнює аналіз.
АСИМПТОТИЧНІ ПОЗНАЧЕННЯ
 В оцінці алгоритмів використовуються спеціальні асимптотичні
позначення, що задають такі класи функцій:
• O(g) - функції, що ростуть повільніше ніж g;
• Ω(g) - функції, що ростуть швидше ніж g;
• Θ(g) - функції, що ростуть з тією ж швидкістю, що і g.
 Запис f(n) = O(g(n)) означає приналежність функції f класу O(g),
тобто функція f обмежена зверху функцією g для досить великих
значень аргументу: ∃n0> 0, c> 0: ∀n> n0, f(n)≤c⋅g(n).
 Обмеженість функції g знизу функцією f записується в такий
спосіб: g(n) = Ω(f(n)).
 Нотації Ω і O взаємозамінні:

f(n) = O(g(n)) ⇔ g(n) = Ω (f(n)).


АСИМПТОТИЧНІ ПОЗНАЧЕННЯ «О ВЕЛИКЕ» І «ОМЕГА
ВЕЛИКЕ»
АСИМПТОТИЧНЕ ПОЗНАЧЕННЯ «ТЕТА ВЕЛИКЕ»
 Якщо функції f і g мають однакову швидкість росту f(n)
= Θ (g(n)), то існують позитивні константи c1 і c2 такі,
що
∃n0> 0: ∀n> n0, f(n)≤c1⋅g(n), f(n)≥c2⋅g(n).
 При цьому f(n) = Θ (g(n)) ⇔ g(n) = Θ(f(n)).
МАТЕМАТИЧНИЙ АПАРАТ АНАЛІЗУ АЛГОРИТМІВ (МААА).
ФОРМУЛИ ПІДСУМОВУВАННЯ
 Щоб дати оцінку суми можна використовувати ряд відомих
тотожностей:
• винесення постійного множника за знак суми:

Σi = 1,n (c⋅f(i)) = c⋅ Σi = 1,n f(i);


• спрощення суми складеного виразу:

Σi = 1,n (f(i) + g(i)) = Σi = 1,n (f(i)) + Σi = 1,n (g(i));


• сума чисел арифметичної прогресії:

Σi = 1,n (ip) = Θ(np + 1);


• сума логарифмів: Σi = 1,n log(i) = Θ(n⋅log(n)).
 Якщо під знаком суми стоїть складніше формула,
додавання можна замінити інтегруванням.
ОЦІНКИ
 Найбільш часто в оцінці алгоритмів використовуються наступні
функції:
log n, n, n⋅log n, n^2, n^3, 2^n, 10^n, n!.
 Алгоритми, що мають оцінку O(log(n)) називаються дуже
швидкими алгоритмами.
 Таких алгоритмів існує не дуже багато. Насправді в літературі
згадується зазвичай тільки один алгоритм, який має оцінку O(log n) -
цеалгоритм бінарного пошуку.
 Алгоритми, що мають оцінку O(n) і O(n· log n) називаються
швидкими алгоритмами.
 Алгоритми мають оцінку O (n^2), O(n^3), aбо в загальному
випадку O (n^c)), де С довільна позитивна константа, називаються
поліноміальними алгоритмами.
 Нарешті, алгоритми, які мають оцінку O(2^n), O(10^n),

O(n!) називаються неполіноміальними алгоритмами.


ОЦІНКИ

 Якщо ж алгоритм є неполіноміальним, то це означає,


що точне рішення практично важливих задач за
допомогою такого алгоритму знайти буде неможливо.
 У наступній таблиці наводяться значення цих
функцій для деяких аргументів:
ОЦІНКА АЛГОРИТМІВ, КІЛЬКІСТЬ ІТЕРАЦІЙ ЯКИХ НЕ ЗАДАНО
ЯВНО
 Розглянемонаступну задачу.
 Обчислити суму нескінченного ряду

 Легко бачити, що це розкладання в ряд широко відомої експоненційної


функції е^x.
 Ряд сходиться, тобто кожний черговий доданок має бути менший за
абсолютною величиною попереднього.
 Це означає, що завжди знайдеться такий доданок, починаючи з якого всі
інші будуть додавати до суми дуже малу величину. Таким чином, ми
можемо написати алгоритм, який обчислює потрібну суму з будь-якою
заданою точністю.
 Наприклад, якщо задана точність 0,01, то всі складові, значення яких менше
0,01, ми відкинемо, і наша обчислена сума буде відрізнятися від істинної
але лише на 0,01.
 Для вирішення цього завдання можна скласти два алгоритми.
ПЕРШИЙ ЯВЛЯЄ СОБОЮ «ЛОБОВЕ» РІШЕННЯ. СТУПІНЬ І ФАКТОРІАЛ
ОБЧИСЛЮЮТЬСЯ ЯВНО:
ДРУГИЙ

 Другий алгоритм більш «хитрий». Він враховує той факт, що


для того щоб отримати другий доданок, досить перший
доданок помножити на х і розділити на 1. Для того щоб
отримати третій доданок досить другому доданок помножити
на х і розділити на 2, і так далі.
АНАЛІЗ
 Навіть на перший погляд другий алгоритм здається більш
ефективним, ніж перший.
 Давайте оцінимо це точно.

 При оцінці подібних алгоритмів ми стикаємося з однією


проблемою: ми не можемо знати заздалегідь, скільки разів
буде виконуватися тіло циклу в цьому алгоритмі.
 Ми не можемо обчислити це відносно точності eps, все
залежить від конкретного ряду.
 Проблема здається важко вирішуваною, однак зауважимо, що
в обох алгоритмах для однакових вхідних даних цикли
виконуються однакову кількість разів.
 А так як нам треба лише з'ясувати у скільки разів один
алгоритм ефективніший іншого, то можна просто задати будь-
яку абстрактну кількість ітерацій циклу.
АНАЛІЗ
 Тоді
алгоритми будуть виглядати так.
 Перший алгоритм і оцінка часу:

 Сумарна оцінка
ДРУГИЙ АЛГОРИТМ

 Сумарна оцінка: 3m+3


АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ

 Розглянеморекурсивний алгоритм, що обчислює суму


компонентів одновимірного масиву.
АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ

 Основна операція - cума.


 При зміні аргументу на 1 кількість виконаних
основних операцій дорівнює 1.
 При значенні аргументу рівним 0 (n <1), кількість
виконаних основних операцій дорівнює 0.
 Таким чином, ми отримуємо наступне рекурентне
співвідношення:
АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ

 Вирішуємо це рекурентне співвідношення методом


зворотної підстановки.
 Пряма підстановка:


 Тепер підставляємо знайдені значення назад у вихідне
співвідношення:
АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ

 Або в загальному вигляді, для довільного k:

 Длятого, щоб скористатися початковими умовами, аргумент у S в


правій частині повинен бути рівним 0. Тобто, n-k = 0. Звідси k = n.

 Оцінка ефективності нашого алгоритму за часом –


O(n).
АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ
 Рекурсивний алгоритм знаходження найбільшого
значення серед компонентів одновимірного масиву
АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ
 Основна операція - порівняння
(max (a, n-1)> a [n]).
 Зауважимо, що час роботи нашого алгоритму
залежить не тільки від розмірності, тому будемо
будувати гіршу оцінку Cw.
 У гіршому випадку, при зміні значення розмірності
на 1, задача розпадається на дві, меншої
розмірності, плюс одне порівняння.
 Отримуємо наступне рекурентне співвідношення
(РС):
АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ
 Вирішуємо рекурентне співвідношення методом
зворотної підстановки.
 Пряма підстановка:


АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ
 Теперпідставляємо знайдені значення назад у
вихідне співвідношення:

 Або в загальному вигляді, для довільного k:


АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ

 Для того, щоб скористатися початковими


умовами, аргумент у Cw в правій частині
повинен бути рівним 1. Тобто, n-k = 1. Звідси k =
n-1.

 Cw(1) = 0, таким чином

У правій частині - сума ступенів 2:


АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ
 Оцінка ефективності нашого алгоритму за часом - O (2^n).
 Це дуже "погана оцінка. Але чому оцінка саме така?

 Справа в тому, що в гіршому випадку ми два рази


рекурсивно викликаємо екземпляр нашого алгоритму з
одним і тим же аргументом!
 Якщо його викликати один раз, і зберігати результат, можна
значно поліпшити наш алгоритм.
АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ

АНАЛІЗ РЕКУРСИВНИХ АЛГОРИТМІВ
 Основна операція як і раніше – порівняння
(m> a [n]).
 У гіршому випадку, при зміні значення розмірності на 1,
потрібно один раз вирішити задачу меншої розмірності і
виконати одне порівняння.
 Отримуємо наступне рекурентне співвідношення:

Cw(n) = Cw(n-1) + 1, з початковою умовою:


Cw(1) = 0.
 Таке рекурентне співвідношення ми вже вирішували вище і
знаємо відповідь:
Cw(n) = n
 Оцінка ефективності поліпшеного алгоритму за часом -
O(n).
ПЛАН АНАЛІЗУ
 1. Виберіть ЕФЕКТИВНОСТІ
параметр РЕКУРСИВНИХ
(параметри), АЛГОРИТМІВ
за якими буде оцінюватися
розмір вхідних даних алгоритму.
 2. Визначте основну операцію алгоритму.

 3. Перевірте, чи залежить число виконуваних основних


операцій тільки від розміру вхідних даних.
 Якщо воно залежить і від інших факторів, розгляньте при
необхідності, як змінюється ефективність алгоритму для
найгіршого, середнього і найкращого випадків.
 4. Складіть рекурентне співвідношення, що виражає кількість
виконуваних основних операцій алгоритму, і вкажіть відповідні
початкові умови.
 5. Знайдіть рішення рекурентного рівняння або, якщо це
неможливо, визначте хоча б його порядок зростання.
P, NP І NP-ПОВНІ ЗАДАЧІ
 При вивченні обчислювальної складності задач перше,
на що слід звернути увагу - чи може дана задача
бути вирішена за допомогою
деякого алгоритму за поліноміальний час.
 Кажуть, що алгоритм вирішує завдання за
поліноміальний час, якщо його тимчасова
ефективність в найгіршому випадку належить класу
O(p (n)), де p (n) - поліном від розміру вхідних даних
n.
 Ми не можемо вирішити складні завдання за реальний
час, за винятком дуже малих розмірів вхідних даних.
P ЗАДАЧІ
 Хоча час роботи може сильно відрізнятися для різних
ступенів полінома, є дуже мало практичних
поліноміальних алгоритмів з ступенем полінома
більше трьох.
 Крім того, поліноми, зазвичай не містять дуже
великих коефіцієнтів.
 Поліноміальні функції володіють багатьма зручними
властивостями (як сума, так і композиція двох
поліномів завжди залишаються поліномами).
 Говорячи не строго, завдання, які вирішуються за
поліноміальний час, можна розглядати як множину,
яка в теорії обчислювальної складності називається P.
P ЗАДАЧІ
 Клас P являє собою клас задач прийняття рішення, які можуть
бути вирішені (детерміністичним) алгоритмом за
поліноміальний час. Цей клас завдань називається
поліноміальним.
 Багато задач, які не є задачами прийняття рішення в своєму
природному формулюванні, можуть бути приведені до класу
задач прийняття рішення.
 Наприклад, у задачі розмальовки вершин графа так, щоб ніякі
дві суміжні вершини не були одного кольору, ми можемо
з'ясувати, чи існує таке розфарбовування вершин графа не
більше ніж m фарбами при
m = 1,2, ... .
 Перше значення m в цьому ряду для якого завдання
розмальовки має рішення, дає відповідь на оптимізаційну
задачу розмальовки графа.
P, NP І NP-ПОВНІ ЗАДАЧІ
 Виникає питання: чи кожна задача прийняття рішення
може бути вирішена за поліноміальний час? Відповідь - ні.
 Деякі завдання прийняття рішення не можуть бути вирішені в
принципі.
 Друге питання: чи існують завдання вирішувані, але важкі?
Відповідь - так.
 Але кількість відомих прикладів невелика, особливо тих, які
виникають природним шляхом, а не побудовані в якості теоретичного
доказу.
 Є, однак, велика кількість важливих завдань, для яких не
знайдено алгоритм з поліноміальним часом роботи, але і не
доведена неможливість його існування.
ОСЬ КІЛЬКА З НАЙБІЛЬШ ВІДОМИХ ТАКИХ ЗАДАЧ
 1. Гамільтонів цикл. Визначити, чи є в даному графі
гамільтонів цикл (шлях, який починається і закінчується в
одній і тій же вершині і проходить по всіх інших вершинах
рівно по одному разу).
 2. Задача комівояжера. Знайти найкоротший маршрут по n
містах з відомими відстанями між ними (знайти найкоротший
гамильтонів цикл в повному графі з позитивними цілими
вагами).
 3. Задача про рюкзак. Знайти підмножина з найбільшою
вартістю з n предметів із заданими позитивними цілими вагами
і вартостями, яке може бути вміщено в рюкзак із заданою
позитивної цілою ємністю (вантажопідйомністю).
 4. Завдання про поділ. Дано n позитивних цілих чисел;
потрібно визначити, чи можна розділити їх на дві непересічні
підмножини з однаковими сумами.
ОСЬ КІЛЬКА З НАЙБІЛЬШ ВІДОМИХ ТАКИХ ЗАДАЧ
 5. Упаковка кошиків. Дано n предметів, розміри яких
становлять собою додатні раціональні числа, що не
перевищують 1. Їх треба розмістити в найменшу кількість
корзин розміром 1.
 6. Розфарбовування графа (карти). Для даного графа знайти
його хроматичне число (найменша кількість фарб, якими
можна розфарбувативершини графа так, щоб ніякі дві суміжні
вершини не були пофарбовані в один і той же колір).
 7. Цілочисельне лінійне програмування. Знайти
максимальне (мінімальне) значення функції кількох
цілочисельних змінних за умови виконання кінцевої множини
обмежень у вигляді лінійних рівностей і / або нерівностей.
ЗАГАЛЬНЕ У НАЙБІЛЬШ ВІДОМИХ ЗАДАЧАХ
 Спільне в усіх цих задачах те, що вони мають експоненційне
(або ще більш швидке) зростання кількості варіантів вибору
рішення з ростом розмірності задачі n.
 Зауважимо, що є ряд задач з дуже схожими умовами, але
вирішуваних за поліноміальний час.
 Наприклад, задача про ейлеровий цикл, тобто, про існування
циклу, який проходить по всіх ребрах даного графа рівно по
одному разу, може бути вирішена за час O (n^2) шляхом
перевірки зв'язності графа і чи всі його вершини мають парну
ступінь
 Цей приклад є вражаючим: інтуїтивно, абсолютно не чекаєш,
що задача обходу всіх ребер по одному разу (Ейлеров цикл)
настільки простіша від удаваної за схожістю задачі про цикли,
що обходять по одному разу всі вершини (Гамільтонів цикл).
ЩЕ ОДНА ЗАГАЛЬНА ВЛАСТИВІСТЬ
 Ще одна загальна властивість величезної більшості завдань
прийняття рішення полягає в тому, що при тому, що рішення
задач може бути обчислювально складним, перевірка
запропонованого рішення зазвичай досить проста і може
бути виконана за поліноміальний час (такі рішення можна
уявити як випадковим чином генеруються кимось і
пропоновані нам для перевірки їх коректності).
 Наприклад, для того щоб перевірити, що запропонований
список вершин є гамільтоновим циклом для даного графа з n
вершинами, необхідно переконатися, що список містить n + 1
вершину графа, що перші n вершин в списку різні, а остання
збігається з першою, і що кожна пара сусідніх вершин в списку
з'єднується ребром.
 Це властивість приводить нас до поняття недетермінованого
алгоритму.
НЕДЕТЕРМІНОВАНИЙ АЛГОРИТМ
 Недетермінованим алгоритмом називається двох етапна
процедура, яка отримує в якості входу екземпляр I завдання
прийняття рішення і робить наступне:
- недетермінованй етап ( «вгадування»): генерується
довільний рядок S, який може розглядатися як кандидат
в рішення завдання I (але може виявитися і повною
нісенітницею);
- детерминований етап ( «перевірка»): подає I і S в якості
вхідних даних і видає «так», якщо S є рішенням I. (Якщо S НЕ є
рішенням I, алгоритм або повертає «ні», або може взагалі не
завершити роботу).
 Недетермінований алгоритм є недетермінованим
поліноміальним, якщо часова ефективність етапу перевірки
поліноміальна.
КЛАС NP
 Клас NP - це клас задач прийняття рішення, які можуть бути
вирішені недетермінованим поліноміальним алгоритмом
(nondeterministic polynomial).
 P ⊆ NP (для P на етапі перевірки просто ігноруємо рядок S, що
генерується на етапі вгадування).
 Більшість завдань прийняття рішення належать класу NP.

 Задача про зупину не належить класу NP.

 Важливий відкрите питання теоретичної інформатики: чи є


клас P власною підмножиною NP або ці класи збігаються?
ЗВІДНІСТЬ
 Кажуть, що задача прийняття рішення D1 поліномиально
приводиться до задачі прийняття рішення D2, якщо є функція t,
яка перетворює екземпляри D1 в екземпляри D2 так, що
1. t відображає всі екземпляри D1 з позитивною відповіддю на
екземпляри D2 з позитивною відповіддю, і всі екземпляри D1 з
негативною відповіддю на екземпляри D2 з негативною
відповіддю.
2. t – обчислювана за допомогою алгоритму з поліноміальним
часом роботи.
 Якщо завдання D1 поліномиально приводиться до деякої
задачі D2, яка може бути вирішена за поліноміальний час, то
завдання D1 також може бути вирішене за поліноміальний час.
NP-ПОВНОТА
 Завдання прийняття рішення D називається NP-повним, якщо:
1. воно належить класу NP;
2. будь-яке завдання із NP полиноміально приводиться до D.
 Поняття NP-повноти вимагає поліноміальної звідності всіх
завдань в NP, як відомих, так і невідомих, до розглянутої
задачі.
 При величезній кількості завдань прийняття рішення викликає
подив той факт, що були знайдені конкретні приклади NP-
повних задач.
 Цього домоглися незалежно один від одного Стівен Кук (в 1971
році) і Леонід Левін (в 1973 році
NP-ПОВНОТА
 Вони показали, що задача КНФ-здійсненності є
NP-повною. (КНФ (CNF) - кон'юнктивна нормальна форма
булевого виразу).
Кожний булевий вираз може бути представлено в КНФ.
 Питається, чи можна призначити в булевом виразі змінним
(true або false) так, щоб результат обчислення всього виразу був
true.
NP-ПОВНОТА

З того часу знайдені сотні прикладів NP-повних задач.


Деякі з них були приведені вище.
Відомо, однак, що якщо P ≠ NP, то повинні
існувати NP-задачі, які не є ні P-задачами, ні
NP-повними задачами.
Безпосередньо з визначення NP-повноти випливає, що
якщо буде знайдений
детермінований алгоритм розв'язання однієї з NP-
повних задач, то всі задачі в NP можуть бути вирішені
за поліноміальний час за допомогою
детермінованого алгоритму, отже, P = NP.
 Дякую за увагу.

http://seojam.ru/wp-content/uploads/2009/03/sherlock.gif

You might also like