- •Лекція 1. Структури даних. Основні визначення та поняття
- •1.1. Термінологія
- •1.2. Типи даних
- •1.3. Рівні організації даних
- •1.4. Представлення даних
- •1.5. Класифікація структур даних
- •1.6. Основні операції над структурами даних
- •1.7. Документування даних
- •Лекція 2. Алгоритми. Складність алгоритмів.
- •2.1. Зображення алгоритмів
- •2.2. Складність алгоритмів
- •2.3. Класи алгоритмів
- •2.4. Документація алгоритмів
- •Лекція 3. Методи сортування .
- •3.1. Задача сортування
- •3.2.Метод простої вибірки.
- •3.3. Метод бульбашки.
- •3.4.Швидкий метод сортування
- •Лекція 4 методи сортування (продовження)
- •4.5. Сортування включенням
- •4.6. Сортування розподілом
- •4.7. Сортування злиттям або об’єднанням
- •4.8. Сортування підрахунком
- •Лекція 5 нелінійні структури даних
- •5.1. Дерева
- •5.1.1. Бінарні дерева
- •5.1.2. Алгоритм обходу дерева
- •5.1.3. Зображення в пам‘яті комп‘ютера графоподібних структур
- •Лекція 6 методи сортування на деревах
- •6.1. Сортування на деревах
- •6.1.2. Пірамідальне сортування.
- •Питання до першого модуля
- •Тема 1. Основні визначення та поняття. Термінологія. Класифікація структур даних. Основні операції над структурами даних.
- •Тема 2. Поняття алоритму. Зображення алгоритмів. Алгоритмічна складність. Поліноміальна та неполіноміальна складність алгоритмів..
- •Тема 3-4. Алгоритми сортування
- •Тема 5-6. Дерева. Основні визначення та поняття. Бінарні дерева. Зображення в пам‘яті еом графоподібних структур. Алгоритми обходу дерев.Висхідні, нисхідні, змішані алгоритми обходу дерев.
- •Лекція 7. Лінійні структури даних. Стеки, черги і деки.
- •7.1. Стеки
- •7.1.1. Реалізація стеку на базі масиву
- •7.2. Черги
- •7.2.1. Використання черги в програмуванні
- •7.2.2. Реалізація черги на базі масиву
- •7.3. Деки
- •Лекція 8. Лінійні структури даних.
- •8.1. Лінійні списки . Основні визначення та поняття
- •8.2. Однонаправлені списки
- •8.3. Двонаправлені списки
- •8.4. Циклічні списки
- •Лекція 9. Масиви, множини, кортежі
- •9.1. Масиви
- •9.2. Множини I кортежі
- •9.2.1. Реалізація множини
- •9.3. Зберігання множин і масивів
- •9.4. Зберігання розріджених матриць
- •Лекція 10. Нелінійні структури даних
- •10.1. Таблиці
- •10.1.1. Зображення таблиць
- •Лекція 11. Нелінійні структури даних
- •11.1. Спискові структури
- •11.1.1. Ієрархічні списки
- •11.1.2. Організація спискових структур
- •11.2. Сіткові структури
- •Лекція 12 пошук даних.
- •12.1. Послідовний пошук
- •12.2. Двійковий пошук
- •12.2.1. Дерева порівнянь на векторній пам‘яті.
- •12.3. Прямий пошук стрічки
- •12.4. Алгоритм Кнута, Моріса і Прата пошуку в стрічці.
- •12.5. Алгоритм Бойера - Мура пошуку в стрічці
- •12.6. Алгоритми з поверненням
- •Лекція 13 пошук у таблицях
- •13.1. Пошук у таблицях з обчислюваними адресами
- •13.2. Пошук у таблицях з прямим доступом
- •13.3. Пошук у Хеш-таблицях
- •Питання до другого модуля
- •Тема 9 Лінійні списки. Основні визначення та поняття. Однонаправлені списки. Двонаправлені списки. Циклічні списки. Організація списків.
- •Тема 10 Масиви. Множини I кортежі. Зберігання множин і масивів. Зберігання розріджених матриць. Операції з масивами, множинами та кортежами
4.7. Сортування злиттям або об’єднанням
Методи цього класу працюють за таким принципом: невідсортовану вхідну множину довільно розбивають на підмножини М1,..., Мp. Потім ці підмножини сортують окремо одним з відомих методів сортування і об’єднують в одну відсортовану множину .
Продемонструємо цю схему на двох множинах, оскільки багаторазове злиття можна здійснювати багаторазовим виконанням попарного злиття.
Нехай маємо дві відсортовані множини X і У; потрібно об’єднати їх у множину Z , яка також повинна бути відсортованою. У ролі Z1 приймаємо min (x1, y1) якщоZ1 = x1є X, тоді Z2 = min(x2, y1 ) і т.д.
Для запису алгоритму використовуємо таке позначення: і - індекс для множини X , j - індекс для множини Y , k – індекс для множини Z, i=1..n; j=1..m; k=1..(n+m).
Для зручності розмістимо в кінці кожної множини фіктивні елементи: xn+1= max, ym+1 =max.
Алгоритм C
Дано X={ x1 ,…, xn }; Y={ y1 ,…, ym }.
C1. Ініціалізація індексів i=1, j=1, k=1;
C2. Виконувати C3, C4 доки k<n+m.
С3 [Якщо xi < yi то [ zk = xi; i=i+1] інакше [ zk=yi, j=j+1]
C4. k=k+1]
C5. Кінець. Вихід.
В квадратних дужках записані дії які повторюються. Кількість порівнянь, яку необхідно виконати в алгоритмі С для злиття двох множин, дорівнює |x|+|y|=n+m.
Вся процедура злиття разом вимагає не більше ніж n порівнянь для n елементів i потрібно буде виконати log2 n переходів із однієї множини у другу. Тобтоалгоритм С вимагає п log2 n порівнянь.
Час роботи алгоритму злиття T(n) для n елементів задовольняє рекурентному співвідношенню: T(n) = 2∙T(∙n/2) + O(n), де T(∙n/2) - час на впорядкування половинимасиву, O(n) - час на злиття цих половинок. Враховуючи, що T(1) = O(1), розв’язком співвідношення є: T(n) = O(n∙log(n)).
4.8. Сортування підрахунком
Сортування підрахунком (англійською «Counting Sort») — алгоритм впорядкування, що застосовується при малій кількості різних елементів (ключів) у масиві даних. Час його роботи лінійно залежить як від загальної кількості елементів у масиві, так і від кількості різних елементів.
Ідея алгоритму полягає в наступному: спочатку підрахувати скільки разів кожен елемент (ключ) зустрічається в вихідному масиві. Спираючись на ці дані можна одразу вирахувати на якому місці має стояти кожен елемент, а потім за один прохід поставити всі елементи на свої місця.
В алгоритмі присутні тільки прості цикли довжини N (довжина масиву), та один цикл довжини K (величина діапазону). Отже, обчислювальна складність роботиалгоритму становить O(N + K).
В алгоритмі використовується додатковий масив. Тому алгоритм потребує E(K) додаткової пам’яті.
В такій реалізації алгоритм є стабільним. Саме ця його властивість дозволяє використовувати його як частину інших алгоритмів сортування (наприклад, сортування за розрядами). Використання даного алгоритму є доцільним тільки у випадку малих K.
Лекція 5 нелінійні структури даних
5.1. Дерева
Деревоподібні і взагалі графові структури мають дуже широке застосування. Найчастіше деревоподібні структури використовуються у наступних випадках:
а) при трансляції арифметичних виразів;
б) при формуванні таблиць символів у трансляторах;
в) у задачах синтаксичного аналізу;
г) при трансляції таблиць розв‘язків.
При роботі з деревами дуже часто використовуються рекурсивні алгоритми, тобто алгоритми, які можуть викликати самі себе. При виклику алгоритму йому передається в якості параметра вказівник на вершину дерева, яка розглядається як корінь піддерева, що росте із цієї вершини. Якщо вершина термінальна, тобто в неї немає синів, то алгоритм просто застосовується до даної вершини. Якщо ж у вершини є сини, то він рекурсивно викликається для кожного із синів. Загальні графові структури застосовують при зображенні розріджених матриць, у машинній графіці, при пошуку інформації і в інших складних задачах. Прикладом графоподібної структури є ієрархічна циклічна структура, що має рівні, аналогічно дереву або орієнтованому графу, але елементи на всякому рівні можуть бути циклічно зв'язані, як, наприклад, у ієрархічних списках. У структурах даних найчастіше використовується табличний або матричний спосіб задання графа.
Кореневим деревом називають орієнтований граф, у якого:
1) є одна особлива вершина, в яку не заходить жодне ребро і яку називають коренем дерева;
2) у всі інші вершини заходить рівно одне ребро, а виходить скільки завгодно;
3) немає циклів.
Існує ще так зване рекурсивне визначення дерева, згідно з яким дерево трактується як скінченна множина вершин Т, кожна з яких (крім кореня) належить до однієї з підмножин Т1,..., Тm ; m=>0, Тi ÇТj =0, і≠j. Підмножина Ті називається піддеревом даної вершини. Число піддерев даної вершини називають степеню цієї вершини. Вершину з нульовою степеню називають листком. Всі інші вершини називаються внутрішніми.
Рівнем або рангом вершини по відношенню до дерева називають довжину шляху від кореня до цієї вершини плюс одиниця.
Довжина шляху - це кількість дуг, які треба пройти від кореня для досягнення даної вершини.
Висота дерева дорівнює кількості рівнів у дереві.
Говорять, що кожний корінь є батьком коренів своїх піддерев. Останні є синами свого батька і братами між собою.
Дерево називають n -арним, якщо кожний його вузол має не більше n потомків. На рис.5.1 зображено 3-арне дерево.
Інший приклад деревоподібної структури дають алгебраїчні формули. На рис. 5.2 зображено дерево, що відповідає арифметичному виразу a-b(с/d +e/f) . Зв‘язок між формулами і деревами дуже важливий для побудови трансляторів арифметичних виразів.
Рис. 5.1. Приклад зображення 3-арного дерева
Рис.5.2.Приклад зображення формули у вигляді дерева
