
- •До лабораторної роботи № 2
- •6.050102 “Комп’ютерна інженерія”
- •1. Мета роботи
- •2. Теоретичні відомості
- •2.1. Поняття алгоритму
- •2.2. Складність алгоритмів
- •2.3. Функція трудомісткості і система позначень
- •2.4. Класифікація алгоритмів на основі функції трудомісткості
- •2.5. Інша класифікація алгоритмів
- •2.6. Елементарні операції в процедурній мові високого рівня
- •2.7. Методика аналізу основних алгоритмічних конструкцій
- •2) Конструкція розгалуження.
- •2.8. Приклади аналізу трудомісткості алгоритмів
- •3. Порядок виконання роботи
- •4. Завдання на лабораторну роботу
- •4.1. Завдання
- •4.2. Вибір варіанту індивідуального завдання
- •4.3. Варіанти завдань
- •1. Мета роботи
- •6. Контрольні питання та завдання
- •Список літератури
2.2. Складність алгоритмів
Для оцінки алгоритмів існує багато критеріїв. Найбільшу увагу приділяють порядку росту, необхідного для розв'язання задачі часу та розміру пам'яті при збільшені вхідних даних. З кожною конкретною задачею зв'язане число, яке називається розміром задачі і яке виражає міру кількості вхідних даних. Наприклад, розміром задачі множення матриць може бути найбільший розмір матриць-співмножників. Розміром задачі про графи може бути число ребер даного графа.
Час, затрачений на обчислення при виконанні алгоритму, являє собою суму часів окремих виконаних операторів. Програму, написану на мові високого рівня, можна перетворити прямим ( хоча і не простим) шляхом в програму на машинному коді заданої ЕОМ. Це в принципі дає метод оцінки часу виконання вказаної програми, але такий підхід орієнтований на конкретну ЕОМ і не дає загальної залежності часу обчислення від розмірів задачі. В області аналізу та побудови алгоритмів прийнято виражати час виконання, як і будь-яку іншу міру ефективності, з точністю до мультиплікативної константи. Це, зазвичай, робиться шляхом підрахунку лише певних ключових операцій, виконаних алгоритмом (що легко здійснити, аналізуючи версію цього алгоритму, записану на мові високого рівня). Такий підхід абсолютно правомірний при визначені нижніх оцінок часу виконання, оскільки невраховані операції можуть лише збільшити їх; однак при роботі з верхніми оцінками ми повинні впевнитись у тому, що вклад вибраних ключових операцій в сумі відрізняється не більше, ніж в константу раз від вкладу всіх операцій, виконаних алгоритмом.
Час, який витрачається алгоритмом, як функція розміру задачі, називається часовою складністю цього алгоритму. T(n). Асимптотику поведінки цієї функції при збільшенні розміру задачі називають асимптотичною часовою складністю, а для її позначення використовують нотацію Ландау (велике O). Аналогічно, можна виділити просторову складність та асимптотичну просторову складність.
Саме асимптотична складність визначає розмір задач, які алгоритм здатен обробити. Наприклад, якщо алгоритм обробляє вхідні дані розміром n за час cn², де c - деяка стала, то кажуть, що часова складність такого алгоритму O(n²).
Просторова та часова складності як функції від розмірів задачі є дві фундаментальні оцінки ефективності при аналізі алгоритмів.
Аналіз середньої асимптотичної часової складності можна поділити на два типи: аналітичний та статистичний. Аналітичний метод дає точніші результати, але складний у використанні на практиці. Натомість статистичний метод дозволяє швидше здійснювати аналіз складних задач.
В основах аналізу алгоритмів
до одного класу відносять всі функції,
чий порядок росту однаковий з точністю
до постійного множника. Ці класи, їх
назви, а також деякі пояснення та
приклади, наведені в таблиці 1 у
відповідності до зростання їхнього
порядку росту. Функції, які зростають
повільніше, наведені першими.
В таблиці прийнято, що n
∞,
с - константа.
Таблиця 1. Основні асимптотичні класи ефективності
Часова складність |
Назва класу |
Коментар |
Приклади |
O(1) |
Константний |
Сталий час роботи не залежно від розміру задачі |
Індексація масиву |
O(log log n) |
Log log n |
Дуже повільне зростання необхідного часу |
Очікуваний час роботи інтерполюючого пошуку n елементів |
O(log n) |
Логарифмічний |
Логарифмічне зростання — под-воєння розміру задачі збільшує час роботи на сталу величину |
Обчислення xn, двійковий пошук в масиві з n елементів |
O(n) |
Лінійний |
Лінійне зростання — подвоєння розміру задачі подвоїть і необхідний час |
Додавання / віднімання чисел з n цифр; лінійний пошук в масиві з n елементів |
O(n log n) |
Лінеаритмічний (або n-log-n) |
Лінеаритмічне зростання — подвоєння розміру задачі збільшить необхідний час трохи більше ніж вдвічі |
Сортування злиттям, швидке сортування |
O(n²) |
Квадратичний |
Квадратичне зростання — подвоєння розміру задачі вчетверо збільшує необхідний час |
Прості методи сортування |
O(n³) |
Кубічний |
Кубічне зростання — подвоєння розміру задачі збільшує необхідний час у вісім разів |
Звичайне множення матриць |
O(nс) |
Поліноміальний |
Поліноміальне зростання — подвоєння розміру задачі збільшує необхідний час в 2с раз |
Задача комівояжера |
O(cn) |
Експоненціальний |
Експоненціальне зростання — збільшення розміру задачі на 1 призводить до c-кратного збіль-шення необхідного часу; подво-єння розміру задачі підносить необхідний час у квадрат |
Алгоритми пошуку повним перебором |
O(n!) |
Факторіальний |
Факторіальне зростання — збільшення розміру задачі на 1 збільшує необхідний час в n+1 раз |
Обробка всіх перестано-вок деякої множини, що складається з n елементів |