Портал освітньо-інформаційних послуг «Студентська консультація»

  
Телефон +3 8(066) 185-39-18
Телефон +3 8(093) 202-63-01
 (066) 185-39-18
Вконтакте Студентська консультація
 portalstudcon@gmail.com

<script>

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){

  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),

  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)

  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

 

  ga('create', 'UA-53007750-1', 'auto');

  ga('send', 'pageview');

 

</script>

Алгоритми і структури даних

Тип роботи: 
Методичні вказівки
К-сть сторінок: 
36
Мова: 
Українська
Оцінка: 
МЕТОДИЧНІ ВКАЗІВКИ
до виконання лабораторних робіт
з курсу «Алгоритми і структури даних»
для студентів, які навчаються за спеціальністю
121 «Інженерія програмного забезпечення»
 
ЗМІСТ
 
ВСТУП 
Загальні рекомендації щодо виконання лабораторних робіт 
Лабораторна робота 1. Базові структури даних 
1.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 1 
1.2. Завдання до лабораторної роботи 1
1.3. Варіанти завдань до лабораторної роботи 1 
Лабораторна робота 2. Базові структури даних. Хеш-таблиці
2.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 2 
2.2. Завдання до лабораторної роботи 2
2.3. Варіанти завдань до лабораторної роботи 2 
Лабораторна робота 3. Базові структури даних: червоно-чорні дерева 
3.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 3 
3.2. Завдання до лабораторної роботи 3 
3.3. Варіанти завдань до лабораторної роботи 3
Лабораторна робота 4. Алгоритми сортування
4.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 4 
4.2. Завдання до лабораторної роботи 4 
4.3. Варіанти завдань до лабораторної роботи 4
Лабораторна робота 5. Комбінаторні алгоритми 
5.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 5 
5.2. Завдання до лабораторної роботи 5
5.3. Варіанти завдань до лабораторної роботи 5 
Лабораторна робота 6. Фундаментальні алгоритми на графах і деревах 
6.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 6 
6.2. Завдання до лабораторної роботи 6
6.3 Варіанти завдань до лабораторної роботи 6 
Лабораторна робота 7. Геометричні алгоритми
7.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 7 
7.2. Завдання до лабораторної роботи 7 
7.3. Варіанти завдань до лабораторної роботи 7
Лабораторна робота 8. Математичні основи теорії алгоритмів 
8.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 8 
8.2. Завдання до лабораторної роботи 8
Лабораторна робота 9. Рекурсія 
9.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 9 
9.2. Завдання до лабораторної роботи 9
9.3. Варіанти завдань до лабораторної роботи 9
Лабораторна робота 10. Динамічне програмування
10.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 10 
10.2. Завдання до лабораторної роботи 10 
10.3. Варіанти завдань до лабораторної роботи 10
Лабораторна робота 11. Жадібні алгоритми
11.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 11 
11.2. Завдання до лабораторної роботи 10
11.3. Варіанти завдань до лабораторної роботи 10
Список літератури 
 
ВСТУП
 
Методичні вказівки до виконання лабораторних робіт з курсу «Алгорит-ми та структури даних» є частиною загального методичного забезпечення кур-су «Алгоритми та структури даних», який викладається для студентів спе-ціальності 121 «Інженерія програмного забезпечення» в 2-му семестрі.
Мета виконання лабораторних робіт – закріплення та поглиблення тео-ретичних знань, отриманих при вивченні лекційної частини курсу, набуття стійких практичних навичок організації та використання динамічних структур даних для розв’язання задач при створенні програмного забезпечення, вивчен-ня найбільш поширених алгоритмів розв’язання задач з використанням склад-них структур даних.
Методичні вказівки містять завдання для 11-ти лабораторних робіт та необхідний для їх виконання теоретичний матеріал, а також варіанти завдань до кожної роботи.
ЗАГАЛЬНІ РЕКОМЕНДАЦІЇ ЩОДО ВИКОНАННЯ ЛАБОРАТОРНИХ РОБІТ
На початку навчального семестру кожний студент академічної групи отримує від викладача завдання на виконання лабораторних робіт.
За результатом виконання кожної лабораторної роботи студент формує звіт відповідно до вимог НТУ «ХПІ» щодо оформлення навчальної докумен-тації.
Здача лабораторних робіт відбувається протягом усього навчального се-местру відповідно до графіка їх проведення. Строк здачі комплексу лаборато-рних робіт – до останнього тижня семестру.
План проведення лабораторних робіт подано в таблиці 1.1.
 
Таблиця 1.1 – План проведення лабораторних робіт
 
Лабораторна робота 1. БАЗОВІ СТРУКТУРИ ДАНИХ
 
Мета роботи: познайомитися з базовими структурами даних (список, черга, стек) та отримати навички програмування алгоритмів, що їх обробля-ють.
 
1.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 1
 
Стеки і черги – це динамічні множини, в яких елемент видаляється з множини операцією Delete, яка не задається довільно, а визначається структу-рою множини. Саме зі стеку (stack) можна видалити тільки той елемент, який був у нього доданий останнім: стек працює за принципом «останнім прий-шов – першим пішов» (last-in, first-out – LIFO). З черги (queue), навпаки, мож-на видалити тільки той елемент, який знаходився в черзі довше за всіх: працює принцип «першим прийшов – першим пішов» (first-in, first-out – FIFO).
У зв’язаному списку (або просто списку; linked list) елементи лінійно впорядковані, але порядок визначається не номерами, як у масиві, а вказівни-ками, що входять до складу елементів списку. Списки є зручним способом ре-алізації динамічних множин.
Якщо кожен, хто стоїть у черзі, запам’ятає, хто за ним стоїть, після чого всі безладно розсядуться, то вийде однобічно зв’язаний список; якщо він за-пам’ятає ще й того, хто попереду, буде двобічно зв’язаний список.
Іншими словами, елемент двобічно зв’язаного списку (doubly linked list) – це запис, що містить три поля: key (ключ) і два вказівники next (наступ-ний) і prev (попередній). Крім цього, елементи списку можуть містити додат-кові дані.
У різних ситуаціях використовуються різні види списків. В односторон-ньому незв’язаному (singly linked) списку відсутні поля prev. У впорядковано-му (sorted) списку елементи розташовані в порядку зростання ключів таким чином, що у голови списку ключ найменший, а у хвоста списку – найбільший, на відміну від неврегульованого (unsorted) списку. У кільцевому списку (circular list) поле prev голови списку вказує на хвіст списку, а поле next хвоста списку вказує на голову списку.
 
1.2. Завдання до лабораторної роботи 1
 
Розробити програму, яка читає з клавіатури послідовність цілих чисел ( ), жодне з яких не повторюється, зберігає їх до структури да-них (згідно з завданням) та видає на екран такі характеристики:
 кількість елементів;
 середнє арифметичне збережених елементів;
 мінімальний та максимальний елемент;
 четвертий елемент послідовності;
 елемент, що йде перед мінімальним елементом.
Наголосимо, що всі характеристики потрібно визначити із заповненої структури даних. Дозволено використовувати лише ті операції, що притаманні заданій структурі, наприклад, заборонено отримувати доступ до елемента із довільною позицією у черзі, яку реалізовано на базі масиву.
Використовувати готові реалізації структур даних (наприклад, STL) за-боронено.
 
1.3. Варіанти завдань до лабораторної роботи 1
 
Для виконання завдання до лабораторної роботи потрібно використати такі структури даних:
Варіант 1: черга.
Варіант 2: стек.
Варіант 3: однобічно зв’язаний список.
Варіант 4: двобічно зв’язаний список.
Варіант 5: кільцевий список.
Варіант 6: масив із довільним доступом.
 
Лабораторна робота 2. БАЗОВІ СТРУКТУРИ ДАНИХ. ХЕШ-ТАБЛИЦІ
 
Мета роботи: познайомитися з хеш-функціями і хеш-таблицями та отримати навички програмування алгоритмів, що їх обробляють.
 
2.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 2
 
Часто виникає потреба використання динамічної множини, що підтри-мує тільки «словникові операції» додавання, пошуку і видалення елемента. У цьому випадку часто застосовують так зване хешування; відповідна структура даних називається хеш-таблицею. У гіршому випадку пошук у хеш-таблиці може займати стільки ж часу, скільки пошук у списку , але на практиці хешування вельми ефективне.
Тоді як при прямій адресації елементу з ключем відводиться позиція номер , при хешуванні цей елемент записується в позицію номер в хеш-таблиці (hashtable) , де – деяка функція, звана хеш-функцією (hash function).
Хороша хеш-функція повинна (наближено) задовольняти припущенням рівномірного хешування: для чергового ключа всі хеш-значень повинні бути рівноймовірні.
Тривіальне хешування полягає у використанні хеш-функції, що повертає власний аргумент.
Побудова хеш-функції методом ділення із залишком (division method) полягає в тому, що ключу ставиться у відповідність залишок від ділення на , де – число можливих хеш-значень: .
Наприклад, якщо розмір хеш-таблиці і ключ дорівнює , то хеш-значення дорівнює .
Хороші результати зазвичай виходять, якщо вибрати за просте число, яке є далеким від ступенів двійки.
Побудова хеш-функції методом множення (multiplication method) полягає в такому.
Нехай кількість хеш-значень дорівнює . Зафіксуємо константу в ін-тервалі і покладемо , де – дрібна час-тина .
Перевага методу множення полягає в тому, що якість хеш-функції мало залежить від вибору . Зазвичай за вибирають ступінь двійки, оскільки в більшості комп’ютерів множення на таке реалізується як зсув слова.
Хешування Пірсона (Pearson hashing) – алгоритм, запропонований Піте-ром Пірсоном для процесорів з 8-бітними регістрами, завданням якого є швид-ке обчислення хеш-коду для рядка довільної довжини. На вході функція отри-мує слово , що складається з символів, кожен розміром 1 байт, і повертає значення в діапазоні від до . Значення хеш-коду залежить від кожного символу вхідного слова.
Алгоритм, який отримує на вхід рядок і використовує таблицю перес-тановок можна описати таким кодом мовою Python:
def hash_pearson(w):
h = 0
for c in w:
index = h ^ ord(c)
h = T[index]
return h
 
2.2. Завдання до лабораторної роботи 2
 
Розробити програму, яка читає з клавіатури цілі числа , пар (при цьому ключ – ціле, дійсне число або рядок залежно від варіанта завдання; значення – рядок; усі рядки розміром до символів, жодний з яких не повторюється) та ще ключів. Всі рядки розділяються пропуском або новим рядком. Програма зберігає пар рядків до хеш-таблиці та видає на екран значення, що відповідають переліченим клю-чам.
Приклад входу для ключів-рядків:
Використовувати готові реалізації структур даних (наприклад, STL) за-боронено, але можна використати реалізацію рядків (наприклад, std::string в C++).
 
2.3. Варіанти завдань до лабораторної роботи 2
 
Варіант 1: ключ – ціле число; тривіальне хешування.
Варіант 2: ключ – ціле число; хешування за допомогою ділення.
Варіант 3: ключ – ціле число; мультиплікативне хешування.
Варіант 4: ключ – дійсне число; мультиплікативне хешування.
Варіант 5: ключ – рядок; хешування за остачею суми символів.
Варіант 6: ключ – рядок; хешування Пірсона.
 
Лабораторна робота 3. БАЗОВІ СТРУКТУРИ ДАНИХ: ЧЕРВОНО-ЧОРНІ ДЕРЕВА
 
Мета роботи: ознайомитися з червоно-чорними деревами та отримати навички програмування алгоритмів, що їх обробляють.
 
3.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 3
 
Дерева як засіб реалізації словників ефективні, якщо їх висота мала, але мала висота не гарантується, і в гіршому випадку дерева не більш ефективні, ніж списки. Червоно-чорні дерева – це один з типів збалансованих дерев пошуку, в яких передбачені операції балансування гарантують, що висота дерева не пере-вищить
Червоно-чорне дерево (red-black tree) – це двійкове дерево пошуку, вершини якого розділені на червоні (red) і чорні (black). Таким чином, кожна вер-шина зберігає один додатковий біт – її колір.
При цьому повинні виконуватися певні вимоги, які гарантують, що глибина будь-яких двох листків дерева відрізняється не більше, ніж у два рази, тому дере-во можна назвати збалансованим (balanced).
Кожна вершина червоно-чорного дерева має поля color (колір), key (ключ), left (лівий нащадок), right (правий нащадок) і p (предок). Якщо у вершини відсут-ній нащадок або предок, відповідне поле містить значення nil. Для зручності ми будемо вважати, що значення nil, які зберігаються в полях left і right, є посилан-нями на додаткові (фіктивні) листки дерева. При такому заповненні дерева кожна стара вершина, що містить ключ, має двох нащадків.
Двійкове дерево пошуку називається червоно-чорним деревом, якщо воно має такі властивості (будемо називати їх RB-властивостями, red-black properties):
1) кожна вершина або червона, або чорна;
2) кожен листок (nil) – чорний;
3) якщо вершина червона, обидва її нащадки – чорні;
4) всі шляхи, що йдуть вниз від кореня дерева до його листків, містять однакову кількість чорних вершин.
Операції Tree-Insert і Tree-Delete виконуються на червоно-чорному дере-ві за час але вони змінюють дерево, і результат може не відповідати RB-властивостям. Щоб відновити ці властивості, треба перефарбувати деякі вершини і змінити структуру дерева.
Детально процес повороту та модифікації червоно-чорного дерева опи-сано у лекційному курсі.
 
3.2. Завдання до лабораторної роботи 3
 
Розробити програму, яка читає з клавіатури:
5) числа , при цьому
6) послідовність ключів (цілих, дійсних чисел або рядків (до сим-волів) залежно від варіанта завдання);
7) послідовність ключів.
Програма зберігає першу послідовність до червоно-чорного дерева.
Кожного разу, коли до дерева додається новий елемент, потрібно вивес-ти статистику (згідно з варіантом завдання):
1. Мінімальний елемент та його колір.
2. Максимальний елемент та його колір.
Після побудови дерева для кожного елемента другої послідовності по-трібно вивести результати наступних операцій над деревом (згідно з варіантом завдання):
1. Чи є елемент у дереві та його колір?
2. та його колір.
3. та його колір.
Використовувати готові реалізації структур даних (наприклад, STL) забо-ронено, але можна використати реалізацію рядків (наприклад, std::string у C++).
 
3.3. Варіанти завдань до лабораторної роботи 3
 
Варіант 1: мінімальний елемент та його колір; чи є елемент у дереві та його колір?
Варіант 2: мінімальний елемент та його колір; та його ко-лір.
Варіант 3: мінімальний елемент та його колір; та його колір.
Варіант 4: максимальний елемент та його колір; чи є елемент у дереві та його колір.
Варіант 5: максимальний елемент та його колір; та його колір.
Варіант 6: максимальний елемент та його колір; та йо-го колір.
 
Лабораторна робота 4. АЛГОРИТМИ СОРТУВАННЯ
 
Мета роботи: познайомитися з алгоритмами сортування та бінарним пошуком.
 
4.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 4
 
Багато алгоритмів використовують сортування як проміжний крок. Є ба-гато різних алгоритмів сортування; в конкретній ситуації вибір алгоритму сор-тування залежить від довжини послідовності, яку необхідно відсортувати, та від того, якою мірою вона вже відсортована, а також від типу наявної пам’яті.
Сортування бульбашкою (bubble sort) складається з повторюваних проходів по сортованому масиву. За кожен прохід елементи послідовно порів-нюються попарно, і якщо порядок у парі неправильний, виконується обмін елементів. Проходи по масиву повторюються раз або доти, поки на чер-говому проході не з’ясується, що обміни більше не потрібні, що означає – ма-сив відсортований. При кожному проході алгоритму по внутрішньому циклу черговий найбільший елемент масиву ставиться на своє місце в кінці масиву поруч з попереднім найбільшим елементом, а найменший елемент переміща-ється на одну позицію до початку масиву («плине» до потрібної позиції, як бу-льбашка у воді, звідси і назва алгоритму).
Сортування включенням (insertion sort) зручне для сортування ко-ротких послідовностей. Саме в такий спосіб зазвичай сортують карти: трима-ючи в лівій руці вже впорядковані карти і взявши правою рукою чергову кар-ту, ми вставляємо її в потрібне місце, порівнюючи з наявними і йдучи справа наліво.
Швидке сортування основане на принципі «розділяй і володарюй». Сортування ділянки відбувається так:
1. Елементи масиву переставляються так, щоб будь-який з елементів був не більший будь-якого з елементів , де – деяке число в інтервалі. Цю операцію ми будемо називати поді-лом (partition).
2. Процедура сортування рекурсивно викликається для масивів і .
3. Після цього масив відсортований .
Сортування злиттям основане на принципі «розділяй і володарюй». Спочатку ми розбиваємо масив на дві половини меншого розміру. Потім ми сортуємо кожну з половин окремо. Після цього нам залишається з’єднати два впорядкованих масиви половинного розміру в один. Рекурсивне розбиття за-дачі на менші відбувається доти, поки розмір масиву не дійде до одиниці (будь-який масив довжини можна вважати впорядкованим).
Нетривіальною частиною є з’єднання двох упорядкованих масивів в один. Воно виконується за допомогою допоміжної процедури . Параметрами цієї процедури є масив і числа , що вказують на межі об’єднуваних ділянок. Процедура передбачає, що та що ділянки і вже відсортовані, і зливає (merges) їх до однієї ділянки 
Сортування купою (пірамідальне сортування) базується на ви-користанні сортувального дерева (бінарної купи). Сортувальне дерево – це та-ке двійкове дерево, у якого виконані такі умови.
1. Кожен листок має глибину або , або , де – максимальна гли-бина дерева.
2. Значення в будь вершини не менше (інший варіант – не більше) від значення її нащадків.
Зручна структура даних для сортувального дерева – такий масив , що – елемент в корені, а нащадки елемента є і .
Алгоритм сортування буде складатися з двох основних кроків:
1. Побудова сортувального дерева, такого, щоб кожний нащадок був меншим за предка. Цей крок вимагає операцій.
2. Видалення елементів з кореня по одному за раз і перебудова дерева. Тобто на першому кроці обмінюємо і , перетворюємо в сортувальне дерево. Потім переставляємо і , перетворюємо в сортувальне дерево. Процес продовжується доти, поки в сортувальному дереві не залишиться один еле-мент. Тоді – упорядкована послідовність. Цей крок ви-магає операцій.
Алгоритм сортування підрахунком можна застосувати, якщо ко-жен з елементів сортованої послідовності – ціле позитивне число у відомому діапазоні (що не перевершує заздалегідь відомого ). Якщо , то алго-ритм сортування підрахунком працює за час .
Ідея цього алгоритму полягає в тому, щоб для кожного елемента зазда-легідь підрахувати, скільки елементів вхідної послідовності менше , після чо-го записати безпосередньо у вихідний масив відповідно за цим числом (як-що, скажімо, 17 елементів вхідного масиву менше , то у вихідному масиві повинен бути записаний за номером 18). Якщо в послідовності, яку необхідно відсортувати, є однакові числа, то цю схему необхідно модифікувати, щоб не записати кілька чисел на одне місце.
 
4.2. Завдання до лабораторної роботи 4
 
Розробити програму, яка читає з клавіатури:
1) числа
2) послідовність ключів (цілих або дійсних чисел залежно від варіанту завдання);
3) послідовність ключів.
Програма зберігає першу послідовність до масиву та виконує сортуван-ня. Потім програма виводить відсортовану послідовність на екран та виконує бінарний пошук кожного елемента другої послідовності : для кожного по-відомити, чи є він у першій послідовності, а якщо є, то на якому місці.
 
4.3. Варіанти завдань до лабораторної роботи 4
 
Варіант 1: сортування бульбашкою.
Варіант 2: сортування включенням.
Варіант 3: швидке сортування.
Варіант 4: сортування злиттям.
Варіант 5: сортування купою.
Варіант 6: сортування підрахунком (для цілих чисел).
 
Лабораторна робота 5. КОМБІНАТОРНІ АЛГОРИТМИ
 
Мета роботи: познайомитися з генераторами випадкових чисел та ме-тодами перевірки випадковості.
 
5.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 5
 
Лінійний конгруентний метод застосовується в простих випадках і не має криптографічної стійкості.
Лінійний конгруентний метод полягає в обчисленні членів лінійної ре-курентної послідовності за модулем деякого натурального числа , що задається такою формулою:
де і – деякі коефіцієнти, цілі числа.
Отримана послідовність залежить від вибору стартового числа, і при різ-них його значеннях виходять різні послідовності випадкових чисел. Разом з тим багато властивостей цієї послідовності визначаються вибором коефіцієн-тів у формулі і не залежать від вибору стартового числа.
Особливості розподілу випадкових чисел, що генеруються лінійним кон-груентним алгоритмом, роблять неможливим їх використання в статистичних алгоритмах, що вимагають високого ступеня захищеності.
Один з найбільш поширених датчиків Фібоначчі оснований на наступній формулі:
де – дійсні числа з діапазону ;
– цілі позитивні числа, які називаються лагами.
При реалізації через цілі числа досить формули (при цьому будуть відбуватися арифметичні переповнення). Для роботи датчика Фібоначчі потрібно знати попередніх згенерованих випадкових чи-сел, які можуть бути згенеровані простим конгруентним датчиком.
Лаги і – «магічні» і їх не слід вибирати довільно. Рекомендуються наступні значення лагів:
Статистичні тести видають числову характеристику послідовності і дозволяють однозначно сказати, чи пройдено тест. Розглянемо кілька тестів пакета NIST.
Частотний побітовий тест полягає у визначенні співвідношення між нулями і одиницями у всій двійковій послідовності. Мета – з’ясувати, чи дійсно число нулів і одиниць у послідовності приблизно однакові, як це можна було б припустити у випадку істинно випадкової бінарної послідовності. Тест оцінює, наскільки близька частка одиниць до . Таким чином, число нулів і одиниць має бути приблизно однаковим. Якщо обчислене в ході тесту значен-ня ймовірності , то дана двійкова послідовність не є істинно випадко-вою. В іншому випадку послідовність має випадковий характер. Потрібно від-значити, що всі наступні тести проводяться за умови, що пройдено даний тест.
Тест на послідовність однакових бітів полягає в підрахунку по-вного числа рядів у вихідній послідовності, де під словом «ряд» мають на увазі безперервну підпослідовність однакових бітів. Ряд довжиною біт складаєть-ся з абсолютно ідентичних бітів, починається і закінчується з біта, що міс-тить протилежне значення. Мета даного тесту – зробити висновок про те, чи дійсно кількість рядів, що складаються з одиниць і нулів з різними довжинами, відповідає їх кількості у довільній послідовності. Зокрема, визначається швид-ко чи повільно чергуються одиниці і нулі у вихідній послідовності. Якщо об-числене в ході тесту значення ймовірності , то дана двійкова послідо-вність не є істинно випадковою. В іншому випадку вона має випадковий ха-рактер.
Тест на найдовшу послідовність одиниць полягає у визначенні найдовшого ряду одиниць всередині блока довжиною біт. Мета – з’ясувати,
чи дійсно довжина такого ряду відповідає очікуванням довжини найдовшого ряду одиниць у випадку абсолютно довільної послідовності. Якщо обчислене в результаті виконання тесту значення ймовірності , то вихідна послі-довність не є випадковою. В іншому випадку робиться висновок про її випад-ковість. Слід зауважити, що з припущення про приблизно однакову частоту появи одиниць і нулів (тест №1) випливає, що точно такі ж результати даного тесту будуть отримані при розгляді самого довгого ряду нулів. Тому вимірю-вання можна проводити тільки з одиницями.
 
5.2. Завдання до лабораторної роботи 5
 
Розробити програму, яка читає з клавіатури число та параметри генератора випадкових чисел і виводить на екран послідовність з згенерованих чисел. Програма зберігає до файлу графічну характеристику по-слідовності згідно з завданням та виводить на екран результат одного з тестів NIST (згідно з варіантом завдання).
Варіанти генераторів випадкових чисел:
1) лінійний конгруентний метод;
2) метод Фібоначчі із затримуванням.
Варіанти графічних характеристик:
1) гістограма розподілу елементів послідовності;
2) розподіл на площині (елементи попарно обробляються як координати точок (x, y));
3) автокореляція (користувач задає зсув для копії послідовності).
Варіанти тестів NIST:
1) частотний побітовий тест;
2) тест на послідовність однакових бітів;
3) тест на найдовшу послідовність одиниць.
 
5.3. Варіанти завдань до лабораторної роботи 5
 
В таблиці 5.1 наведені варіанти завдань до даної лабораторної роботи.
 
Таблиця 5.1 – Варіанти завдань до лабораторної роботи
 
Лабораторна робота 6. ФУНДАМЕНТАЛЬНІ АЛГОРИТМИ НА ГРАФАХ І ДЕРЕВАХ
 
Мета роботи: ознайомитися зі способами подання графів та отримати навички програмування алгоритмів, що їх обробляють.
 
6.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 6
 
Структури даних та алгоритми, які потрібно використати, розглянуто в лекційному курсі, а також в запропонованій літературі.
 
6.2. Завдання до лабораторної роботи 6
 
Розробити програму, яка читає з клавіатури:
1) числа – кількість вершин та ребер графа;
2) послідовність M пар цілих чисел – ребра графа.
Програма зберігає граф та виконує над ним алгоритм згідно з варіантом.
Варіанти подання графів:
1. Матриця суміжності.
2. Список суміжності.
Варіанти алгоритмів:
1. Пошук в ширину. На екран потрібно вивести вершини в порядку об-ходу. Для кожної вказати час прибуття та предка в дереві обходу.
2. Пошук у глибину. На екран потрібно вивести вершини в порядку об-ходу. Для кожної вказати час початку розгляду, кінця розгляду та предка у де-реві обходу.
1. Топологічне сортування. На екран потрібно вивести ті ж дані, що і для пошуку в глибину, а також результат сортування.
2. Визначити, чи є заданий граф деревом або лісом.
3. Побудувати кістяк дерева алгоритмом Прима.
4. Побудувати кістяк дерева алгоритмом Крускала.
6.3 Варіанти завдань до лабораторної роботи 6
В таблиці 6.1 наведені варіанти завдань до даної лабораторної роботи.
 
Таблиця 6.1 – Варіанти завдань до лабораторної роботи 6
 
Лабораторна робота 7. ГЕОМЕТРИЧНІ АЛГОРИТМИ
 
Мета роботи: познайомитися із основними геометричними алгоритма-ми.
 
7.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 7
 
Основний засіб багатьох геометричних алгоритмів – поняття векторного добутку.
Нехай дано вектори і . Нас цікавлять тільки вектори, що лежать в одній площині, тому під векторним добутком можна розуміти площу паралелограма (з урахуванням знака), утвореного точками , .
Для обчислень більш зручне визначення векторного добутку як визнач-ника матриці .
Якщо позитивне, то найкоротший поворот відносно , що поєднує його з , відбувається проти годинникової стрілки, а якщо негативне, то за нею.
Алгоритми побудови опуклої оболонки розглянуте у лекційному курсі, а також у запропонованій літературі.
 
7.2. Завдання до лабораторної роботи 7
 
Розробити програму, яка читає з клавіатури число та пар дійсних чисел-координат точок на площині. Програма виконує один з алгоритмів згідно з варіантом.
 
7.3. Варіанти завдань до лабораторної роботи 7
 
Варіант 1. Точки належать ламаній. Потрібно для кожної нової ланки вказати, направо чи наліво здійснено поворот.
Варіант 2. Точки належать ламаній. Потрібно для кожної нової ланки вказати, чи перетинає вона будь-яку з попередніх.
Варіант 3. Точки є координатами багатокутника в порядку обходу. Ви-вести площину багатокутника та повідомити, за годинниковою стрілкою чи проти годинникової стрілки здійснено обхід.
Варіант 4. Побудувати опуклу оболонку наданих точок алгоритмом Грехема.
Варіант 5. Побудувати опуклу оболонку наданих точок алгоритмом Джарвіса.
 
Лабораторна робота 8. МАТЕМАТИЧНІ ОСНОВИ ТЕОРІЇ АЛГОРИТМІВ
 
Мета роботи: навчитися визначати складність алгоритмів.
 
8.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 8
 
Аналізуючи алгоритм, можна намагатися знайти точне число виконува-них ним дій. Але в більшості випадків достатньо оцінити асимптотику зрос-тання часу роботи алгоритму при прямуванні величини розмірності вхідних даних до нескінченності:
 
8.2. Завдання до лабораторної роботи 8
 
Для кожного реалізованого алгоритму з попередніх робіт визначити складність. Для цього для кожного рядка алгоритму потрібно вказати кількість разів, що він виконується, залежно від розмірності вхідних даних. Результат записати у вигляді -позначення.
Для алгоритмів робіт «Базові структури даних» та «Фундаментальні ал-горитми на графах і деревах» визначити, чи є обрані структури даних оптима-льними, а якщо ні – запропонувати такі, що призводять до зменшення часу ро-боти алгоритму.
 
Лабораторна робота 9. РЕКУРСІЯ
 
Мета роботи: навчитися оцінювати складність рекурсивних алгоритмів.
 
9.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 9
 
Методи, які потрібно використати, розглянуто в лекційному курсі, а та-кож у запропонованій літературі.
Наведемо базову теорему про рекурентні співвідношення.
Нехай та – константи, – функція та – рекурентно визначена для невід’ємних цілих чисел функція:
де ми інтерпретуємо як або .
Тоді має такі асимптотичні оцінки:
1) якщо для деякої константи , тоді функція має вигляд: ;
2) якщо , тоді ;
3) якщо для деякої константи та якщо для деякої константи і всіх достатньо великих , тоді .
 
9.2. Завдання до лабораторної роботи 9
 
Для алгоритму, складність якого описано виданою згідно з варіантом ре-курентною функцією вигляду , визначити складність йо-го виконання, використовуючи такі методи:
1) метод підстановки;
2) перетворення до суми;
3) базова теорема про рекурентні співвідношення;
4) моделювання за допомогою програми (отримати значення для різних та підібрати формулу).
Отримані результати порівняти.
 
9.3. Варіанти завдань до лабораторної роботи 9
 
Варіант 1: .
Варіант 2: .
Варіант 3: .
Варіант 4: .
Варіант 5: .
Варіант 6: .
 
Лабораторна робота 10. ДИНАМІЧНЕ ПРОГРАМУВАННЯ
 
Мета роботи: навчитися використовувати динамічне програмування та оцінювати його складність.
 
10.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 10
 
Структури даних та алгоритми, які потрібно використати, розглянуто в лекційному курсі, а також у запропонованій літературі.
 
10.2. Завдання до лабораторної роботи 10
 
Розробити програму, яка читає з клавіатури вхідні дані та розв’язує зада-чу методом динамічного програмування. Визначити складність алгоритму.
 
10.3. Варіанти завдань до лабораторної роботи 10
 
Варіант 1. Пошук маршруту на прямокутному полі таким чином, щоб сума чисел у клітинках, через які він проходить, була максимальною. Рух по-чинається із клітинки верхнього лівого кута та завершується у правому ниж-ньому. Кожний крок виконується на одну позицію праворуч або вниз.
Вхідні дані: натуральні числа та послідовність натуральних чисел – прямокутне поле рядок за рядком.
Вихідні дані: таблиця динамічного програмування ( = максимальна сума маршруту до клітинки ); прямокутне поле із маршрутом, що відміче-но зірочками, та сума чисел у клітинках маршруту.
Варіант 2. Пошук найбільшої спільної підпослідовності.
Вхідні дані: натуральні числа та дві послідовно-сті та натуральних чисел довжиною та відповідно.
Вихідні дані: динамічна таблиця ( = довжина НСП для префіксів та ) та НСП для та .
Варіант 3. Пошук оптимального способу множення матриць.
Вхідні дані: натуральне число – кількість матриць, натуральні числа – розмірності матриць (матриця має розмірність ).
Вихідні дані: таблиця динамічного програмування ( = найменша кількість множень для обчислення добутку матриць ) та оп-тимальна розстановка дужок у виразі .
 
Лабораторна робота 11. ЖАДІБНІ АЛГОРИТМИ
 
Мета роботи: навчитися використовувати жадібні алгоритми та оціню-вати їхню складність.
 
11.1. Теоретичний матеріал, необхідний для виконання лабораторної роботи 11
 
Структури даних та алгоритми, які потрібно використати, розглянуто в лекційному курсі, а також у запропонованій літературі.
 
11.2. Завдання до лабораторної роботи 10
 
Розробити програму, яка читає з клавіатури вхідні дані та розв’язує зада-чу жадібним алгоритмом. Визначити складність алгоритму.
 
11.3. Варіанти завдань до лабораторної роботи 10
 
Варіант 1. Розв’язати задачу про вибір найбільшої кількості заявок для аудиторії. Вхідні дані: кількість заявок , пар натуральних чисел – початок та кінець заявок . Вихідні дані: заявки, відсортовані за зростанням часу закінчення, та номери заявок, які потрібно обрати.
Варіант 2. Стиснути послідовність нулів та одиниць алгоритмом Хаф-фмана. Вхідні дані: натуральні числа та послідовність груп по нулів та одиниць. Вихідні дані: перелік кодів, які потрібно використати для кожної групи, та стиснута послідовність.
Варіант 3. Розв’язати неперервну задачу про рюкзак. Вхідні дані: нату-ральні числа – кількість видів товару та місткість рюкзака, послідовність пар – вартість та вага товару номер i. Вихідні дані: набір дійсних чисел, які вказують, скільки кожного това-ру потрібно покласти до рюкзака, щоб сумарна вартість була максимальною.
 
СПИСОК ЛІТЕРАТУРИ
 
  1. Вирт Н. Алгоритмы и структуры данных. Новая версия для Оберона / Н. Вирт. М. : ДМК Пресс, 2010. 272 с.
  2. Ахо А.В. Структуры данных и алгоритмы / А.В. Ахо, Д.Э. Хопкрофт, Д.Д. Ульман. – М. : Вильямс, 2003.  384 с.
  3. Кормен Т. Алгоритмы: построение и анализ / Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн; пер. с англ. под ред. А. Шеня. – 3-е изд. – М. : ООО «И. Д. Вильямс», 2013. – 1398 с.
  4. Игошин В.И. Математическая логика и теория алгоритмов : учеб. по-соб. для студ. высш. учеб. заведен. / В.И. Игошин. – 2-е изд., стер. – М. : Изда-тельский центр «Академия», 2008. – 448 с.
  5. Игошин В.И. Задачи и упражнения по математической логике и тео-рии алгоритмов / В.И. Игошин. – 3-е изд., стер. – М. : Издательский центр «Академия», 2007. – 304 с.
  6. Романовский И.В. Вычислительная математика и структура алгоритмов / И.В. Романовский. – М. : МГУ, 2006. – 112 с.
  7. Cormen T.H. Introduction to Algorithms / T.H. Cormen, C. E. Leiserson, R.L. Rivest, C. Stein. – 3rd ed. – Cambridge : MIT Press and McGraw-Hill, 2009 – 1292 p.
  8. Wirth. N. Algorithms + Data Structures = Programs / N. Wirth. – Prentice-Hall, 1976. – 183 p.
  9. Aho A.V. Data Structures and Algorithms / A.V. Aho, J.E. Hopcroft, J.D. Ullman. – Addison-Wesley, 1983. – 384 p.
 
 
Фото Капча