- •1.1. Визначення інформації
- •1.2. Визначення алгоритму
- •1.3. Виконавці алгоритмів
- •1.4. Способи описання алгоритмів
- •1.5. Властивості алгоритмів
- •1.6. Поняття обчислювальної складності
- •1.7. Класи алгоритмів
- •1.7.1. Експоненційні алгоритми та перебір
- •1.7.2. Алгоритм із поверненнями назад
- •1.7.3. Машини Тьюринґа
- •Будь-який алгоритм може бути реалізований відповідною машиною Тьюринґа.
- •Усе, що реалізовано в одній з цих конструкцій, можна зробити і в інших.
- •1.7.4. Рекурсія та її використання
- •1.7.5. Теза Чорча. Алгоритмічно нерозв’язні проблеми
- •2.1. Поняття структури даних
- •2.2. Рівні описуваннявання даних
- •2.3. Класифікація структур даних у програмах користувача й у пам’яті комп’ютера
- •2.4. Основні види складених типів даних
- •2.4. Структури даних у пам’яті комп’ютера
- •2.4.1. Структури даних в оперативній пам’яті
- •2.4.2. Сд у зовнішній пам’яті
- •3.1. Поняття структури даних типу «масив»
- •3.2. Набір допустимих операцій для сд типу «масив»
- •3.3. Дескриптор сд типу «масив»
- •3.4. Ефективність масивів
- •3.5. Зберігання багатовимірних масивів
- •3.6. Сд типу «множина»
- •3.7. Сд типу «запис (прямий декартовий добуток)»
- •3.8. Сд типу «таблиця»
- •3.9. Сд типу «стек»
- •3.9.1. Дескриптор сд типу «стек»
- •3.9.2. Області застосування сд типу «стек»
- •3.10. Сд типу «черга»
- •3.11. Сд типу «дек»
1.7.1. Експоненційні алгоритми та перебір
Експоненційні алгоритми часто пов’язані з перебором різних варіантів розв’язання.
Наведемо типовий приклад.
Приклад 1.8. Розглянемо задачу про виконуваність булевого виразу, яка формулюється так: для будь-якого булевого виразу від n змінних знайти хоча б один набір значень змінних x1… xn, при якому цей вираз приймає значення 1.
Типова схема розв’язування цієї задачі може мати такий вигляд: спочатку надаємо одне з двох можливих значень (0 або 1) першій змінній x1, потім другій і т.ін. Коли будуть розставлені значення всіх змінних, ми можемо визначити значення булевого виразу. Якщо він дорівнює 1, задача розв’язана. Якщо ні – треба повернутися назад і змінити значення деяких змінних.
Можна інтерпретувати цю задачу як задачу пошуку на певному дереві перебору. Кожна вершина цього дерева відповідає певному набору встановлених значень x1 …, xk . Ми можемо встановити змінну xk+1 в 0 або 1, тобто маємо вибір з двох дій. Тоді кожній із цих дій відповідає одна з двох дуг, які йдуть від цієї вершини. Вершина x1 …, xk має двох синів x1 …, xk 0 і x1 …, xk 1.
При n=3 дерево можливостей матиме вигляд, показаний на рис. 1.2. (вершини позначені наборами значень змінних, а дуги – рішеннями, які приймаються на черговому кроці). Вершини, що відповідають розв’язкам задачі для виразу (x1 x2) є x3, зафарбовані.
З рис.1.2 видно, що розв’язування задачі зводиться до перебору листків дерева з метою виявлення, які з них відповідають наборам, що перетворюють заданий булевий вираз на 1. Для виразу (x1 x2) є x3 такими наборами будуть 000, 010, 111.
Якщо n=3, дерево має 23= 8 листів. У загальному ж випадку кількість можливих варіантів дорівнює 2n. Цей вираз експоненційно залежить від n, і перебірний алгоритм має експоненційний характер.
Описана вище схема алгоритму розв’язування цієї задачі має фундаментальний характер. Вона має назву бектрекінгу (інша назва – перебір з поверненням) і використовується для розв’язування найрізноманітніших перебірних задач (задача про вісім ферзів, задача про розфарбовування карти, автоматизація дедуктивних побудов тощо).
Рис. 1.2. Пошук на дереві.
Звертаємо увагу на те, що не кожен перебірний алгоритм є експоненційним. (Наприклад, алгоритм пошуку в масиві. Незважаючи на його перебірний характер, він є лінійним, а не експоненційним).
Зі зростанням розмірності будь-який поліноміальний алгоритм стає ефективнішим, ніж будь-який експоненційний. Для лінійного алгоритму зростання швидкодії комп’ютера в 10 разів дозволяє за той самий час розв’язати задачу, розмір якої в 10 разів більший. Для експоненційного алгоритму з основою 2 цей самий розмір можна збільшити лише на 3 одиниці.
Як правило, якщо для розв’язування якоїсь задачі є деякий поліноміальний алгоритм, то часова оцінка цього алгоритму значно покращується.
1.7.2. Алгоритм із поверненнями назад
Метод перебору із поверненнями дозволяє розв’язувати практично незліченну множину задач, для багатьох з яких не відомі інші алгоритми. Незважаючи на таке велике різноманіття перебірних задач, в основі їх розв’язування є щось спільне, що дозволяє застосувати цей метод. Таким чином, перебір можна вважати практично універсальним методом розв’язування перебірних завдань. Наведемо загальну схему цього методу.
Розв’язування задачі методом перебору з поверненням будується конструктивно послідовним розширенням часткового розв’язування. Якщо на конкретному кроці таке розширення провести не вдається, то відбувається повернення до коротшого часткового розв’язування, і спроби його розширити продовжуються.
{ пошук одного вирішення }
procedure backtracking(k: integer); { k – номер ходу }
begin
{ запис варіанту }
if { рішення знайдене } then
{ виведення рішення }
else
{ перебір всіх варіантів }
if { варіант задовольняє умови задачі } then
backtracking(k+1); { рекурсивний виклик }
{ стирання варіанту }
end
begin
backtracking(1);
end.