
Лабораторна робота №2
Тема. Дослідження ефективності алгоритму
Мета: набуття навичок визначення часової складності алгоритму.
Професійна спрямованість: дана лабораторна робота є складовою частиною професійної підготовки фахівця з інформатики до роботи.
Теоретичні питання (план)
Функція складності алгоритму.
Види функції складності алгоритмів.
Часова функція складності.
Аналіз функції складності за програмою.
Хід виконання роботи
Ознайомтеся з основними теоретичними відомостями.
Згідно номеру свого варіанту оберіть умову задачі.
Побудувати блок-схему.
Провести аналіз складності алгоритму та побудувати графік ефективності програми.
Теоретичні відомості
Для оцінки якості алгоритму вводиться поняття складності алгоритму, або обернене поняття – ефективність алгоритму. Чим більший час та об’єм пам’яті необхідно для реалізації алгоритму, тим більша його складність та відповідно нижча ефективність. Складність алгоритму поділяється на часову та ємнісну. Часова складність – це критерій, що характеризує часові витрати на реалізацію алгоритму. Ємнісна складність – критерій, що характеризує витрати пам’яті з тією ж метою. Залежно від конкретної форми цих критеріїв складність алгоритму поділяється на практичну та теоретичну. Практична часова складність зазвичай оцінюється у часових одиницях (секунди, мілісекунди, кількість часових тактів процесора, кількість виконання циклів і т.п.). Практична ємнісна складність виражається у бітах, байтах, словах і т.п.
Щоб підвищити об’єктивність оцінки алгоритмів, учені, які працюють в галузі комп’ютерних наук, прийняли асимптотичну часову складність як основну міру ефективності виконання алгоритму.
Часто говорять, що час виконання алгоритму має порядок T(N) від вхідних даних розміру N. Одиниця вимірювання T(N) точно не визначена, але в більшості випадків розуміють під нею кількість інструкцій, які виконуються на ідеалізованому комп’ютері.
Для багатьох програм час виконання дійсно є функцією вхідних даних, а не їх розміру. У цьому випадку визначають T(N) як час виконання в найгіршому випадку, тобто, як максимум часів виконання за всіма вхідними даними розміру N. Поряд з тим розглядають Tср(N) як середній (в статистичному розумінні) час виконання за всіма вхідними даними розміру N. Хоча Tср(N) є достатньо об’єктивною мірою виконання, але часто неможливо передбачити, або обґрунтувати, рівнозначність усіх вхідних даних. На практиці середній час виконання знайти складніше, ніж найгірший час виконання, так як математично це зробити важко і, крім цього, часто не буває простого визначення поняття „середніх” вхідних даних. Тому, в основному, користуються найгіршим часом виконання як міра часової складності алгоритмів.
Аналіз часу виконання алгоритмів
Час виконання алгоритму можна оцінювати шляхом підрахунку кількості «базових операцій», що виконуються, - як функцію від розміру вхідних даних.
Приймаються наступні припущення про гіпотетичну обчислювальну машину (виконавця):
для виконання «простої» операції (+, -, *, /, =, if, call) потрібно один часовий крок (такт обчислювальної машини);
звертання до пам’яті (читання, запис) виконуються за один часовий крок;
цикли та підпрограми складаються із послідовності простих операцій.
Приклад 1. Обчислимо кількість T(N) операцій, що виконуються алгоритмом пошуку максимального елемента в масиві:
Результат умовного
розгалуження невідомий. Оцінюємо у
найгіршому випадку – умова виконується
завжди: if
– 1 такт; порівняння
h[i]>hmax
– 1 такт.
Кількість T(N) операцій, що виконує алгоритм у найгіршому випадку:
T(N) = 1+(2+2)N+1 = 2+4N.
Найкращий спосіб порівняння ефективності алгоритмів полягає у співставленні їх порядків складності. Цей метод застосовується як для часової, так і ємнісної складності. Порядок складності виражає його ефективність через кількість даних, що обробляються.
Порядок алгоритму – це функція, що домінує над точним виразом часової складності. Функція f(n) має порядок O(g(n)), якщо константа k і лічильник n0 такі, що f(n)≤kg(n) для n>n0. Дійсний час є функція, що залежить від довжини масиву.
Наприклад, відомо, що точний час обробки масиву визначається з рівняння
Дійсний час (довжина масиву) = Довжина масиву2 + 5*Довжина масиву + 100.
Грубе значення визначається допоміжною функцією:
Оцінка часу (довжина масиву) = 1,1*Довжина масиву2.
Функція складності О виражає відносну швидкість алгоритму в залежності від деякої змінної (або змінних).
Існує три важливих правила для визначення функції складності:
O(kf) = O(f).
O(fg) = O(f)O(g) або O(f/g) = O(f)/O(g).
O(f+g) дорівнює домінанті O(f) і O(g).
Тут k позначає константу, а f і g – функції.
Перше правило декларує, що постійні множники не мають значення для визначення порядку складності, наприклад:
O(1,5N) = O(N).
З другого правила слідує, що порядок складності добутку двох функцій дорівнює добутку їх складностей, наприклад:
O(17N*N) = O(17N)O(N) = O(N)O(N) = O(N*N) = O(N2).
З третього правила слідує, що порядок складності функцій визначається як порядок домінанти першого і другого доданків, тобто вибирається найбільший порядок, наприклад:
O(N5 + N2) = O(N5).