- •0Міністерство освіти і науки, молоді та спорту україни
- •«Теорія алгоритмів» Методичні вказівки
- •2.1 Види алгоритмів
- •2.2 Організація лінійних алгоритмів .
- •2.3 Організація розгалужень в са
- •2.4 Організація циклів.
- •Розділ 3. Моделі обчислень
- •3.1 Скінченний автомат, як модель перетворювача дискретної інформації
- •3.2 Визначення та властивості скінченого автомату
- •3.3 Автомат Мілі
- •3.4 Автомат Мура
- •3.5 Машина Тюрінга.
- •3.5.1 Історія
- •3.5.2 Визначення машини т.
- •3.5.3 Можливості машини Тюрінга
- •3.5.4 Приклади
- •4.1 Необхідність структурування даних. Поняття Структури даних
- •4.2 Послідовне і зв’язне розподілення даних в пам’яті еом.
- •4.2.2 Зв'язаний розподіл в пам'яті.
- •4.3 Лінійні та нелінійні структури даних.
- •4.3.1 Лінійні струтури даних
- •Однозв'язні списки
- •Двохзв'язні списки
- •4.3.2 Нелінійні структури даних
- •4.4 Статичні структури даних.
- •4.5 Уявлення в пам’яті машини множин; операції над множинами. Уявлення графів. Дерева і бінарні дерева. Характеристики дерев. Ліс. Уявлення бінарних дерев. Перехід від дерева до бінарного дерева.
- •4.5.1 Множини. Опис множин, операції над множинами.
- •4.5.2 Поняття графа як структури даних.
- •Застосування графів
- •4.5.3 Поняття дерева як структури даних
- •4.5.4 Бінарне дерево
- •Перехід від дерева до бінарного дерева
- •4.6 Порядок обходу вузлів дерева: обернений і внутрішній. Властивості обходу вузлів дерева: прямий, обернений і внутрішній. Властивості обходу дерев. Порядок та властивості обходу дерева.
- •5.1 Предмет теорії комбінаторних алгоритмів (обчислювань)
- •5.2 Правила множення і суми для знаходження
- •5.3 Види задач підрахунку числа елементів множин
- •1. Метод рекурентних співвідношень.
- •2. Метод включення і виключення.
- •5.4 Елементи комбінаторики. Набори: набори з повторюванням; специфікація набору
- •Розділ 6 Ефективність алгоритмів
- •6.1. Характеристики алгоритмів.
- •6.2 Ємна та часова складність. Поліноміальна зв’язність.
- •6.3 Класи p та np
Розділ 6 Ефективність алгоритмів
6.1. Характеристики алгоритмів.
Інтуїтивно алгоритм визначається як "послідовність чітких недвозначних інструкцій, які зрозумілі виконавцеві і які призводять до певного результату за скінченний час". Точне визначення алгоритму дати неможливо, але можна сформулювати ряд інтуїтивних вимог до алгоритмів. Вважається, що послідовність інструкцій є алгоритмом, якщо вона задовольняє таким вимогам:
* дискретність: алгоритм являє собою послідовність кроків, на кожному з яких виконується та чи інша інструкція; кожна наступна інструкція виконується після того, як завершиться виконання попередньої;
* елементарність кроків: кожна інструкція є елементарною для виконавця і не вимагає від нього ніякої винахідливості;
* локальність кроків: процес виконання інструкції не вимагає повернення до попередніх інструкцій або звертання до наступних;
* детермінованість: після завершення чергового кроку завжди відомо, що робити на наступному кроці;
* результативність: повинно бути визначено, що слід вважати результатом роботи алгоритму;
* скінченність: результат повинен досягатися за скінченну кількість кроків;
* масовість: алгоритм повинен бути призначений для вирішення не однієї конкретної задачі, а цілого класу однотипних задач.
Будемо називати деяку функцію y = f(x1,…,xn) ефективно обчислюваною, або просто обчислюваною, якщо існує будь-яка механічна процедура, яка дозволяє знайти значення y, якщо відомі значення x1,…,xn. Якщо функція визначена не для всіх значень x1,…,xn, вона називається частково обчислюваною.
Отже, будь-який алгоритм, і, відповідно, будь-яку програму ми розглядаємо як реалізацію деякого інформаційного перетворення, тобто як реалізацію частково обчислюваної функції, аргументами якої є вхідні дані алгоритму, а значенням - результат роботи алгоритму.
Слова "алгоритм" і "механічна процедура" ми розглядаємо як синоніми. Ми кажемо, що будь-яка механічна процедура реалізує певний алгоритм, і навпаки - якщо послідовність інструкцій є алгоритмом, то повинен існувати якийсь механізм, здатний виконати цю послідовність інструкцій.
6.2 Ємна та часова складність. Поліноміальна зв’язність.
Основними мірами обчислювальною складності алгоритмів є:
* часова складність, яка характеризує час, необхідний для виконання алгоритму на даній машині; цей час, як правило, визначається кількістю операцій, які потрібно виконати для реалізації алгоритму;
* ємнісна складність, яка характеризує пам'ять, необхідну для виконання алгоритму. Часова та ємнісна складність тісно пов'язані між собою. Обидві є функціями від розміру вхідних даних. Надалі обмежимося тільки аналізом часової складності.
Складність алгоритму описується функцією f(n), де n - розмір вхідних даних. Важливе теоретичне і практичне значення має класифікація алгоритмів, яка бере до увагу швидкість зростання цієї функції.
Означення. Кажуть, що f(n) = O (g(n)), якщо існує така константа с > 0, що для будь-якого n виконується нерівність: |f(n)| Ј с |g(n)|.Оскільки і розмір вхідних даних, і кількість операцій є величинами невід'ємними (а фактично - додатніми), модулі можна опустити.
Виділяють такі основні класи алгоритмів:
* логарифмічні: f(n) = O (log2n);
* лінійні: f(n) = O (n);
* поліноміальні: f(n) = O (nm); тут m - натуральне число, більше від одиниці; при m = 1 алгоритм є лінійним;
* експоненційні: f(n) = O (an); a - натуральне число, більше від одиниці.
Для однієї й тієї ж задачі можуть існувати алгоритми різної складності. Часто буває і так, що більш повільний алгоритм працює завжди, а більш швидкий - лише за певних умов.
Приклад.
Часто зустрічається задача пошуку в масиві, яка неформально формулюється таким чином: в заданій послідовності чисел знайти елемент з певним значенням.
В загальному випадку застосовується алгоритм послідовного пошуку, який полягає в послідовному перегляді всіх елементів і порівнянні їх з потрібним значенням. Легко бачити, що цей алгоритм має лінійну часову складність.
Але, якщо заздалегідь відомо, що послідовність упорядкована за зростанням або за спаданням, можна застосувати інший алгоритм - алгоритм половинного ділення. Послідовність ділиться на дві рівні частини. Оскільки послідовність упорядкована, можна визначити, в якій частині знаходиться потрібний елемент. Після цього процедура повторюється: потрібна частина знову ділиться навпіл і т.п. Цей алгоритм є логарифмічним.
Будемо називати часовою складністю задачі часову складність найбільш ефективного алгоритму для її вирішення.
На початок
Експоненційні алгоритми та перебір
Експоненційні алгоритми часто пов'язані з перебором різних варіантів розв'язку.
Приклад.
Розглянемо задачу про виконуваність булевого виразу, яка формулюється так: для будь-якого булевого виразу від n змінних знайти хоча б один набір значень змінних x1… xn, при якому цей вираз приймає значення 1.
Типова схема розв'язку цієї задачі може мати такий вигляд: спочатку надаємо одне з двох можливих значень (0 або 1) першій змінній x1, потім другій і т.д. Коли будуть розставлені значення всіх змінних, ми можемо визначити значення булевого виразу. Якщо він дорівнює 1, задача вирішена. Якщо ні - потрібно повернутися назад і змінити значення деяких змінних.
Можна інтерпретувати цю задачу як задачу пошуку на певному дереві перебору. Кожна вершина цього дерева відповідає певному набору встановлених значень x1 …, xk . Ми можемо встановити змінну x k+1 в 0 або 1, тобто маємо вибір з двох дій. Тоді кожній з цих дій відповідає одна з двох дуг, які йдуть від цієї вершини. Вершина x1 …, xk має двох синів x1 …, xk 0 і x1 …, x k 1.
При n=3 дерево можливостей матиме вигляд, показаний на мал. (вершини помічені наборами значень змінних, а дуги - рішеннями, які приймаються на черговому кроці). Вершини, що відповідають рішенням задачі для виразу (x1 x2) є x3, зафарбовані.
Слід звернути увагу на те, що не будь-який перебірний алгоритм є експоненційним. (Наприклад, алгоритм пошуку в масиві. Незважаючи на його перебірний характер, він є лінійним, а не експоненційним).
Зі зростанням розмірності будь-який поліноміальний алгоритм стає більш ефективним, ніж будь-який експоненційний. Для лінійного алгоритму зростання швидкодії комп'ютера в 10 разів дозволяє за той же час розв'язати задачу, розмір якої в 10 разів більший. Для експоненційного алгоритму з основою 2 цей же розмір можна збільшити лише на 3 одиниці.
Як правило, якщо для розв'язку якоїсь задачі придумано деякий поліноміальний алгоритм, часова оцінка цього алгоритму швидко поліпшується.
