- •2.1 Мета роботи
- •2.2 Методичні вказівки з організації самостійної роботи студентів
- •Завдання:
- •Використання команди "cut"
- •5.1 Методичні вказівки до самостійної роботи і виконання роботи
- •Дерева – як типи даних
- •Обхід дерева
- •Створення дерева
- •Бінарні пошукові дерева
- •Сортування на основі дерева
- •61166 Харків, просп. Науки, 14.
Сортування на основі дерева
Після того, як дерево побудовано, можна легко переставити всі його елементи в алфавітному порядку. Алгоритм для цього – варіант пошуку спочатку вглиб:
1. Якщо дерево вільне, то нічого не робити.
2. Інакше переставити всі елементи лівого піддерева, потім поточний елемент, а потім все елементи правого піддерева.
Або в Пролозі:
retrieve_all (empty). /* Нічого не робить */
retrieve_all (tree (Item, Left, Right)): -
retrieve_all (Left),
do_something_to (Item),
retrieve_all (Right).
Сортування значень, що йдуть одне за одним, можна виконати, вставляючи їх у дерево, а потім переставляючи їх по черзі. Для N значень це займе час, пропорційний NlogN, оскільки вставка і перестановка займають час, пропорційний logN, при тому, що і те і інше має виконуватися N разів. Це найшвидший алгоритм сортування відомий на сьогодні.
Приклад: Програма Lab5_3.PRO використовує описаний спосіб для розташування за алфавітом необхідних символьних значень.
Зауваження 1: У цьому прикладі використовуються деякі стандартні предикати Прологу для зчитування з клавіатури. Предикат readint цілі, а readchar – символічні значення.
Зауваження 2: У програмі lab5_3_1.pro – та ж програма, але з викорис-танням вікон, меню і поелементним виводом дерева. До того ж, у цьому прикладі стандартний предикат exit зупиняє обчислення.
/* Lab5_3.pro */
domains
chartree = tree(char, chartree, chartree); end
predicates
nondeterm do(chartree)
action(char,chartree,chartree)
create_tree(chartree,chartree)
insert(char,chartree,chartree)
write_tree(chartree)
nondeterm repeat
clauses
do(Tree):-
repeat,nl,
write("*******************************************************"),nl,
write("Enter 1 to update tree\n"),
write("Enter 2 to show tree\n"),
write("Enter 7 to exit\n"),
write("*******************************************************"),nl,
write("Enter number - "),
readchar(X),nl,
action(X, Tree, NewTree),
do(NewTree).
action('1',Tree,NewTree):-
write("Enter characters or # to end: "),
create_Tree(Tree, NewTree).
action('2',Tree,Tree):-
write_Tree(Tree),
write("\nPress a key to continue"),
readchar(_),nl.
action('7', _, end):-
exit.
create_Tree(Tree, NewTree):-
readchar(C),
C<>'#',!,
write(C, " "),
insert(C, Tree, TempTree),
create_Tree(TempTree, NewTree).
create_Tree(Tree, Tree).
insert(New,end,tree(New,end,end)):-!.
insert(New,tree(Element,Left,Right),tree(Element,NewLeft,Right)):-
New<Element,!,
insert(New,Left,NewLeft).
insert(New,tree(Element,Left,Right),tree(Element,Left,NewRight)):-
insert(New,Right,NewRight).
write_Tree(end).
write_Tree(tree(Item,Left,Right)):-
write_Tree(Left),
write(Item, " "),
write_Tree(Right).
repeat.
repeat:-repeat.
goal
write("*************** Character tree sort *******************"),nl,
do(end).
Завантажте та запустіть програму Lab5_3.PRO і спостерігайте, як Пролог виконає сортування символьної послідовності на основі дерева.
5.2 Контрольні запитання і завдання
1. Знайти максимальний елемент дерева.
2. Обчислити глибину дерева.
3. Зчитати елементи заданого дерева в список:
а) під час обходу «вглиб»;
б) *під час обходу «вшир»;
4. Пошук шляху від кореня до заданого елемента:
а) у вигляді послідовності елементів;
б) у вигляді списку.
5*. Обхід дерева «вшир» і вивід шляху у вигляді послідовності елементів.
6*. Відображення дерева у звичайній формі. Наприклад, щоб дерево
tree ("Катя",
tree ("Мишко",
tree ("Вова", empty, empty),
tree ("Ліда", empty, empty)),
tree ("Люда",
tree ("Зіна", empty, empty),
tree ("Петрик", empty, empty)))
Порахувати кількість вершин дерева.
Порахувати кількість листових вершин дерева.
Порахувати кількість вершин дерева, значення яких лежать у діапазоні який можна задати власноруч.
Визначити, чи є дерево Т1 під деревом дерева Т.
Вивести найдовшу гілку дерева у вигляді послідовності вершин або списку вершин.
Визначити відношення sum_tree(Tree_of_integer, Sum), виконане, якщо число Sum дорівнює добутку цілих чисел, що є вершинами дерева Tree_of_integer.
Визначити, чи є дерево Т упорядкованим деревом цілих чисел, тобто для будь-якого вузла має виконуватися умова: x ≤ y ≤ z.
Навчальне видання
МЕТОДИЧНІ ВКАЗІВКИ
до лабораторних робіт з дисципліни
«СПЕЦІАЛЬНІ МОВИ ПРОГРАМУВАННЯ»
для студентів денної форми навчання
напряму 6.040302 – «Інформатика»
Упорядник КУЗЬОМІН Олександр Якович
Відповідальний випусковий Є.П. Путятін
Редактор О.В. Янова
Комп’ютерна верстка Г.М. Голоднікова
План 2015 (друге півріччя), поз. 23.
Підп. до друку 02.07.15. Формат 60х84 1/16. Спосіб друку – ризографія.
Умов. друк. арк. 4,2. Облік вид. арк. 3,8. Тираж 20 прим.
Зам. № 1-23. Ціна договірна.
ХНУРЕ. 61166 Харків, просп. Науки, 14.
Віддруковано в редакційно-видавничому відділі ХНУРЕ
