
- •Розрахункова робота
- •«Проблемно – орієнтоване програмування»
- •«Програмування червоно – чорних дерев»
- •1. Огляд літератури
- •1.1 Довідкові матеріали по мові с
- •1.2 Програмування дерев пошуку
- •1.3 Балансування червоно – чорних дерев
- •1.4 Аналіз інших методів організації баз даних
- •2. Формулювання задачі
- •3. Алгоритми розв’язування задачі
- •3.1 Загальний алгоритм написання програми
- •3.2 Алгоритми основних функцій
- •3.2.1 Алгоритм пошуку вузла
- •3.2.2 Алгоритм додавання вузла
- •3.2.3 Алгоритм видалення вузла
- •3.3 Алгоритм вирішення задачі балансування
- •3.3.1 Алгоритм балансування при додаванні вузла
- •3.3.2 Алгоритм балансування при видаленні вузла
- •4. Програмні реалізації алгоритму
- •4.1 Загальні характеристики програми
- •4.2 Призначення програми
- •4.3 Вхідна інформація
- •4.4 Результуюча інформація
- •4.5 Структура програми
- •4.6 Таблиця ідентифікаторів програми
- •4.7 Середовище реалізації програми
- •4.8 Технологія виконання та від лагодження програми
- •5. Інструкція користувачеві програми
- •6. Контрольні приклади та аналіз їх реалізації
- •Висновок
- •Література
- •Додатки (код програми)
Міністерство освіти і науки, молоді та спорту України
Національний університет «Львівська політехніка»
Кафедра АСУ
Розрахункова робота
з дисципліни:
«Проблемно – орієнтоване програмування»
на тему:
«Програмування червоно – чорних дерев»
Виконав:
студент групи КН-21
Роман В.І.
Прийняв:
доцент кафедри АСУ
Шпак З.Я.
Львів – 2013
Зміст
Вступ………………………………………………………………………………………. 4
Загальна теорія………………………………………………………………... 4
Ефективність пошуку у деревах……………………………………………... 4
Основні означення і структура дерева………………………………………. 4
Збалансовані дерева…………………………………………………………... 4
Червоно – чорні дерева……………………………………………………….. 5
Програмування дерев…………………………………………………………. 5
Актуальність і сфери застосування дерев пошуку………………………….. 5
Засоби для програмування дерев…………………………………………….. 5
Цілі і мета…………………………………………………………………….... 5
1. Огляд літератури ……………………………………………………………………… 6
Довідкові матеріали по мові С……………………………………………….. 6
Програмування дерев пошуку………………………………………………... 6
Балансування червоно – чорних дерев………………………………………. 6
Аналіз інших методів організації баз даних……………………………….... 6
2. Формулювання задачі………………………………………………………………….. 6
3. Алгоритми розв’язування задачі……………………………………………………… 7
3.1 Загальний алгоритм написання програми…………………………………... 7
3.2 Алгоритми основних функцій……………………………………………….. 7
3.2.1 Алгоритм пошуку вузла……………………………………………. 7
3.2.2 Алгоритм додавання вузла………………………………………… 8
3.2.3 Алгоритм видалення вузла………………………………………… 8
3.3 Алгоритм вирішення задачі балансування…………………………………. 9
3.3.1 Алгоритм балансування при додаванні вузла……………………. 9
3.3.2 Алгоритм балансування при видаленні вузла……………………. 10
4. Програмні реалізації алгоритму……………………………………………………… 12
4.1 Загальні характеристики програми…………………………………………. 12
4.2 Призначення програми………………………………………………………. 13
4.3 Вхідна інформація……………………………………………………………. 13
4.4 Результуюча інформація……………………………………………………... 13
4.5 Структура програми………………………………………………………….. 13
4.6 Таблиця ідентифікаторів програми………………………………………….. 16
4.7 Середовище реалізації програми…………………………………………….. 16
4.8 Технологія виконання та від лагодження програми………………………....16
5. Інструкція користувачеві програми…………………………………………………... 16
6. Контрольні приклади та аналіз їх реалізації…………………………………………. 17
Висновки………………………………………………………………………………….. 18
Література……………………………………………………………………………….... 19
Додатки (код програми)………………………………………………………………….. 20
Вступ
Загальна теорія. У теорії графів, дерево – це зв’язний нециклічний граф. Зв’язність означає, що шляхи існують між всіма вершинами (для дерев вершини називають вузлами, англ. node). Не циклічність означає те, що у дереві неможливо знайти циклічний шлях, а отже між парами вершин можна утворити лише один шлях.
У даному контексті мова йтиме про бінарні (двійкові) впорядковані дерева. У бінарних дерев вузли мають до двох нащадків. Якщо бінарне дерево впорядковане, тоді ключ правого нащадка завжди більший від ключа батьківського вузла, а лівий, відповідно, менший. Ключ – це певне значення, яке прив’язане до свого вузла і ідентифікує його серед інших вузлів. При цьому до вузлів можна прив’язувати групи даних і за ключем вузла здійснювати пошук вузла з шуканими даними. Таку концепцію дерев називають деревами бінарного пошуку. По іншому дерево можна визначити як: багатовимірну ієрархічну організацію даних.
Ефективність пошуку у деревах. Бінарні дерева пошуку (вони мають усі вище згадані властивості) своєю структурою забезпечують швидкий пошук даних. Це виявляється тим, що для того щоб знайти певний вузол, потрібно пройтися по k вузлах, де k=log2n, n – кількість усіх вузлів дерева, що, наприклад, для 1000 елементів дорівнюватиме 9-10 пройдених елементів. Якщо порівняти з проходженням по масиву даних, що займе його повне проходження, концепція бінарних дерев пошуку значно пришвидшує пошук даних. Це при тій умові, що вузол знаходиться у кінці, або не існує, у цих випадках потрібно здійснити повний прохід по одному з шляхів дерева, або по всьому масиву, у випадку що дані у середині структури даних, ефективність бінарних дерев пошуку у порівнянні з іншими концепціями пошуку (наприклад масивах) не змінюється. Це при умові, що дерево збалансоване, про це описано нижче.
Основні означення і структура дерева. Загальна структура дерева виглядає так: є перший елемент, від якого починається пошук – корінь дерева, він може мати до двох нащадків, які розподілені за законом впорядкованості, відповідно при пошуку вузла з ключем, при виборі шляху на правого чи лівого нащадка, ми відкидаємо усі вузли іншого нащадка, що відкидає перевірку половини вузлів, аналогічно і наступні дії. Довільний, не кореневий, вузол дерева утворює теж дерево, яке називається під деревом, або віткою. Кінцеві вузли дерева, які не мають нащадків називаються листками дерева. Максимальний і мінімальний шлях від кореня до листків називають максимальною і мінімальною висотою дерева.
Збалансовані дерева. Вище був вжитий термін збалансоване дерево. Збалансоване дерево – це таке дерево, у якому різниця між максимальною і мінімальною висотою дерева не перевищує одиниці. У концепції дерев пошуку використовуються саме збалансовані дерева, оскільки, наприклад, може утворитися дерево, де кожен вузол буде мати одного нащадка, що перетворить дерево в список, пошук у якому втратить переваги пошуку у дереві і за часовою складність наблизиться до пошуку у масиві, чи звичайному списку. Процес балансування дерев є дуже важливим і дуже складним, для його спрощення використовують спеціальні дерева, такі як: AVL і червоно – чорні дерева.
Червоно – чорні дерева. Це такі дерева, у яких кожен вузол може бути червоного, або чорного кольору. При цьому кожен шлях у дереві повинен мати однакову кількість чорних вершин, корінь і листки завжди повинні бути чорного кольору, а червоні вершини не можуть мати червоних нащадків. Така концепція забезпечує, що максимальна висота може бути не більшою ніж у двічі від мінімальної висоти.
Програмування дерев. У мові С, для програмування дерева роблять наступні дії: створюють структуру вузла, у якій містяться адреси нащадків і адреса структури даних, у якій обов’язково повинен бути ключ; структуру даних заповняють потрібними даними, які має містити вузол; створюють вказівник, який буде містити адресу кореня; структури кожного вузла і даних вузла створюють у динамічній пам’яті і зв’язують нащадків з батьківським вузлом через адреси, якщо нащадка не існує, вказівнику з його адресою присвоюють вказівник NULL. Ця концепція оперує з адресами у динамічній пам’яті, що дає можливість легко змінювати зв’язки, видаляти, чи додавати новий елемент і забезпечує мінімізацію нераціонального використання пам’яті.
Актуальність і сфери застосування дерев пошуку. Виходячи з вище названих властивостей дерев двійкового пошуку робиться висновок, що така структура організації даних є дуже ефективною при пошуку даних у великих масивах з даними. Тому при організації баз даних чи статичних даних у інших прикладних програмах використовують концепцію побудови пам’яті основану на бінарних деревах пошуку, тому ця тема являється актуальною. Також, оскільки важливим і найважчим компонентом у бінарних деревах пошуку являється їх балансування, проблема балансування, концепції балансування різних видів дерев, створення ефективних алгоритмів балансування, являється теж актуально проблемою, яка супроводжує використання дерев у базах даних.
Засоби для програмування дерев. Для виконання завдання розрахункової роботи, випливаючи з особливостей програмування дерев, буде достатньо використання чистої мови С з стандартними бібліотеками: <stdio.h> для потокового введення і виведення даних з клавіатури і на пристрій екрану, з метою створення інтерфейсу програми з користувачем, а також для потокової роботи з диском з метою збереження і зчитування створених дерев; <conio.h> для використання функції getch(), з метою створення затримки; <stdlib.h>, для виділення і використання динамічної пам’яті за допомогою функцій malloc(), calloc(), realoc(), free(); <string.h> для обробки текстових рядків при потребі; і додаткова бібліотека <locale.h> забезпечення для можливості виведення кирилиці на екран, з метою забезпечення зрозумілого інтерфейсу з користувачем. Також для виконання завдання потрібно середовище, яке підтримує стандарт С89 і вище названі бібліотеки (або С99 для полегшення програмування). Було вибране середовище Microsoft Visual C++ 2010.
Цілі і мета. Метою даної роботи являється створення шаблонної програми (не прив’язаної до конкретних даних), з мінімальним інтерфейсом, буде здатна: створювати бази даних організовані бінарними деревами пошуку; опрацьовувати дані у деревах (додавання, віднімання елементів, чи груп елементів, пошук елементів); відображати елементи дерева, забезпечити можливість проходу користувачем по дереву; створення декількох дерев при одному запуску програми, обпрацювання груп дерев; робота з диском, збереження дерев, зчитування даних з диску і організування їх у дерева; червоно – чорне балансування створених програмою дерев.