Розглянемо спочатку задачу 1). Відомо, що для найшвид-шого пошуку краще мати справу з упорядкованою інфор-мацією. Тож надалі вважатимемо, що інформація в масиві S упорядкована за ключей х. Тепер пошук потрібної дуги х наба-гато спрощується, оскільки для цього можна застосувати бі-нарний пошук.
Однак цей пошук можна ще вдосконалити. Створимо допо-міжний одновимірний масив А з кількістю елементів, що дорів-нює кількості вершин мережі m. Елементами цього масиву А[х] будуть номери першого розміщення всіх дуг (х, у), що виходять із вершини х, у масиві S (мал. 53).
144
|
x = G |
|
N |
X |
!/ |
d |
||
|
|
|
|
1 |
1 |
3 |
3 |
|
|
X |
А(х) |
|
|
2 |
1 |
7 |
2 |
|
1 |
1 |
3 |
1 |
6 |
5 |
||
|
|
|
||||||
|
2 |
0 |
|
4 |
3 |
4 |
4 |
|
|
3 |
4 |
5 |
3 |
6 |
1 |
||
|
4 |
6 |
6 |
4 |
5 |
2 |
||
|
5 |
7 |
7 |
5 |
9 |
1 |
||
|
6 |
8 |
8 |
6 |
4 |
2 |
||
|
|
|||||||
|
7 |
12 |
9 |
6 |
8 |
3 |
||
|
8 |
14 |
10 |
6 |
5 |
5 |
||
|
9 |
15 |
|
|
11 |
6 |
9 |
2 |
|
|
|||||||
|
|
|
|
|
12 |
7 |
8 |
3 |
|
|
|
13 |
7 |
6 |
1 |
||
|
|
14 |
8 |
9 |
1 |
|||
|
|
15 |
9 |
5 |
3 |
|||
|
|
|
|
|||||
Мал. 53
Побудувати масив А можна за допомогою такого алгоритму:
1) перше входження значения i вершини х у масив S занесе- мо вА[і];
2) поки не завершено перегляд масиву S, перейдемо до п. 1. Реалізація запропонованого алгоритму у вигляді тексту
Pascal-програми може виглядати так:
for j := 1 to m do
a[j]:=0; i:=1;
while i <= n do begin
k := s[i].x a[k] := i;
while (i <= n) and (s[i].x = k) do inc (i); end;
A тепер оцінимо побудований масив A. Оскільки він містить інформацію про перше входження кожної вершини х у впо-рядкований масив дуг S, що описуе всю мережу, то можна гово-рити про те, що він і є функцією переходів для всіх вершин X. А це є неодмінним атрибутом скінченного автомата і дає мож-ливість швидкого пошуку потрібної інформації.
На малюнку 53 показано, як можна здійснити пошук усіх дуг із вершини х -= 6 за допомогою масиву А. Інформація про по-
145
чаток розміщення в масиві А групи всіх дуг, що виходять із вершини х, міститься в елементі А[х]. Діалог про визначення всіх дуг, які виходять із вершини х, можна організувати за до-помогою такого фрагмента тексту Pascal-програми:
write ('Задайте номер вихідної вершини х:'); readln (к); i:=a[k]; if а[к] = О then
writeln ('У такої вершини вихідні дуги відсутні') else
repeat
writeln ('x = ', s[i].x, 'y= ', s[i].y, ' d = ', s[i].d); inc(i) until(s[i].xok)or(i = n);
Аналогічно можна розв'язати i задачу 2). Але, відсортував-ши масив S по у, втратимо можливість ефективно розв'язувати задачу 1).
Запропонуємо інший вихід. Створимо два допоміжні маси-ви: В[у] і С[у] (мал. 54).

Масив В[у] (1 < у < т) буде побудований так само, як і масив А[х]. Кожний елемент х у масиві В є першим входженнях
146
дуги (у, х) у масив S. Реалізація алгоритму його побудови може виглядати так:
forj := 1 torn do
b[j]:=0; for i := 1 to n do
if b[s[i].y] = 0
then b[s[i].yl :=i;
Масив С побудований інакше. Кількість його елементів збі-гається з кількістю дуг у мережі п. Його елементи вказують на послідовність читання дуг (у, х) у масиві S, що відповідає зрос-танню по у (мал. 54). Можна сказати, що масив С побудований за тим самим принципом, що й таблиця FAT у системній облас-ті дискового простору будь-якого зовнішнього носія комп'юте-ра: значения кожного елемента масиву С збігається з порядко-вим номером масиву S, де в полі у міститься наступив значения, що збігається з шуканим.
Іншими словами, згідно з малюнком 54 масив С(у) ство-рюеться так: кожей його елемент вказуе на наступний номер рядка в S, де знаходиться така сама дуга (у, і). Алгоритм побудови масиву С описаної структури мовою Pascal, що використо-вує масив В, буде таким:
for i := 1 to n do
с[і]:=0; for k := 1 to m do begin i:=b[k]; if b[k] <> 0 then
while i <= n do begin j:=i; repeat | inc(i);
until (s[i].y = k) or (i > n); if i <= n then c[j] := i; end; end;
При такій організації масивів В(у) і С(у) проблема пошуку всіх входів у х зводиться до вибору адреси В(у), а потім послі-довних адрес з С(у):
write ('Задайте номер вхідної вершини у:'); readln (k); i:=b[k]; if c[i] = 0 then
147
writeln ('У такої вершини вхідні дуги відсутні') else begin repeat
writeln ('y = ', s[i].y,' x = ', s[i].x,' d = ', s[i].d); i:=c[i]; until (i > n) or (c[i] = 0); writeln ('y = ', s[i].y,' x = ', s[i].x,' d = ', s[i].d); end;
Допоміжні масиви В, С (так само як і А) є функціями переходу для визначення станів під час пошуку всіх дуг, які виходять із задано!' вершини у. Тому ще раз підкреслимо, що наведений алгоритм пошуку в мережі можна віднести до класу скінчен-них автоматів.
Масиви А, В, С ще називають довідниками, а їх сукупність -довідкою для S.
Оцінювати цей метод треба окремо для пошуку виходів з х та для пошуку входов у х. Оскільки сортування вхідного масиву S та побудова масивів А, В і С виконується для заданої мережі лише один раз, то для визначення оцінки ефективності пошуково-го алгоритму час, необхідний для цього, враховувати не будемо.
Пошук виходів для задано! вершини х не залежить від кіль-кості вершин самої мережі т, оскільки адреса її першого входу у масив S визначається як а[х]. Далі відбувається пошук за ви-значеною адресою в масиві S довжиною п. Тому оцінка цієїчас-тини пошукового алгоритму буде О(л).
Пошук входів для задано! вершини х також здійснюється в масиві перших входів усіх вершин у поле у масиву S аналогіч-но, як і для виходів: b[y]. А далі відбувається адресний пошук ycix інших входів у х за допомогою масиву С, довжина якого становить п елементів. Тому оцінка і цієї частини попгукового алгоритму буде також О(п).
/ Запитання для самоконтролю
Що називається мережею?
Наведіть приклади задач, які можна представити як пошук у мережи
Зобразіть приклади, наведені у пункті 2, у вигляді схем.
Зобразіть приклади, наведені у пункті 2, у вигляді таблиць.
Які дві задачі найчастішє пов'язують із мережею?
Яке призначення масиву А(х)?
Чому побудову масиву А(х) можна назвати побудовою функції переходу?
Опишггь алгоритм побудови масиву А(х).
Наведіть текст Pascal-програми, що відповідає алгоритму побудови масиву А(х).
148
Як
здійснюється
пошук
потрібної
інформації за
допомогою
масиву
А(х)?
Зобразіть схематично пошук потрібної інформації за допомогою масиву А(х).
Яке призначення масивів В(у) і С(у)?
Чому побудову масивів В(у) і С(у) можна назвати побудовою функцій переходу?
Опишіть алгоритм побудови масиву В(у).
Наведіть текст Pascal-програми, що відповідає алгоритму побудови масиву В(у).
Опишіть алгоритм побудови масиву С(у).
Наведіть текст Pascal-програми, що відповідає алгоритму побудови масиву С(у).
Як здійснюється пошук потрібної інформації за допомогою ма-сивів В{у) І С{у)?
Зобразіть схематично пошук потрібноі інформації за допомогою масивів В(у) І С(у).
Якою є оцінка ефективності роботи алгоритму пошуку в мережі?
Завдання
Розробити діалогову меню-орієнтовану програму роботи алгоритму пошуку в мережі, що є прикладом скінченного автомата.
Протестувати програму, складену згідно із завданням 1, для вершини, значения якої присутнє в полі х масиву S.
Протестувати програму, складену згідно із завданням 1, для вершини, значения якої відсутнє в полі х масиву S.
Протестувати програму, складену згідно із завданням 1, для вершини, значения якої присутнє в полі у масиву S.
Протестувати програму, складену згідно із завданням 1, для вершини, значения якої відсутнє в полі у масиву S.
Довести за допомогою підрахунку кількості переглядів масиву S, що алгоритм пошуку мережі, реалізований у завдан-ні 1, є лінійним.
Зробити письмовий аналіз виконання завдань 2—6.
149
Розділ V
0110 I
1 I !10Л
МЕТОДИ СОРТУВАННЯ
0 0 1 1 О I 10 10
10 0 1 01 10 1110' D 00 0 110 1
■
О 00 10
OCHOBHI ПОНЯТТЯ МЕТ0Д1В СОРТУВАННЯ
Класичним формулюванням задачі сортування (упорядку-вання) масиву є таке.
Нехай задано деякий масив значеиь а,, а2, ..., ал. Його необ-хідно перетворити так, щоб виконувалося співвідношення:
Аналогічною є і задача сортування заданого масиву за спаданиям.
Одним з основних питань сортування елементів масивів є економія пам'яті, тобто переставлення елементів у масиві в межах самого масиву.
Є декілька класифікацій методів сортування. Перша з них -це за методикою сортування. Друга - за кількістю виконува-них операцій при виконанні самих алгоритмів.
За першою ознакою методи сортування поділяються на:
сортування за допомогою вибору (by selection);
сортування за допомогою обмінів (by exchange);
сортування за допомогою включения (by insersion).
За другою ознакою всі методи сортування можна поділити на:
прямі;
покращені;
удосконалені Надалі будемо розглядати методи сортування у такій послі-
довності: прямі, покращені, удосконалені. А в кожному з цих підрозділів будемо наводити методп, які відносяться до ме-тодів сортування за допомогою включения, вибору й обміну відповідно.
Цей алгоритм найчастіше розглядається в курсі «Основ ал-горитмізації та програмування» як класичний.
150
Нагадаємо
його. Якщо спробувати навести
порядок у карт-ках,
на
яких
написані деякі числа,
то, напевно, дійдемо
такого
висновку.
Спочатку треба
знайти
мінімальний елемент у
всьо-му
заданому
масиві
і поміняти його місцями з елементом,
який
поки що стоїть на
першому
місці. Це треба
зробити,
бо саме на
цьому
місці повинен
стояти
знайдений мінімальний елемент. Тепер
уже
перший елемент знаходиться
на
своему місці,
і мож-на його
закрити,
не
розглядаючи
далі. Масив, який маємо від-сортувати,
фактично зменшився на
один елемент (перший). 3 новим масивом
виконаємо
ті самі ді'і: знайдемо в
ньому
міні-мальний елемент
і
поміняємо його місцями з першим
відкри-тим
елементом
(насправді
він є другим
елементом у заданому масиві).
Так
будемо продовжувати доти, доки на
останньому кроці
не
залишаться два останні
елементи.
Якщо необхідно,
поміняємо і їх місцями. На
цьому сортування завершено.
Розглянутий алгоритм можна представити в такій словесній формі:
розглядаємо масив від елемента з номером 1 до елемента з номером п;
у масиві, який розглядається, вибираємо елемент з най-меншим значениям;
визначений у п. 2 елемент міняємо місцями з першим елементом масиву, який розглядається;
зменшуємо розмірність масиву, що розглядається, переметивши його початок на наступний елемент;
пункти 2-4 виконуемо для всіх елементів масиву від 1 до (л - 1).
Розглянемо масив 44, 55, 12, 42, 94, 18, 06, 67 і застосуємо до нього описаний алгоритм, подавши його у вигляді такої таб-лиці (табл. 15).
Таблица 15
І
|
1 |
44 |
55 |
12 |
42 |
94 |
18 |
06 |
67 |
|
2 |
06 |
55 |
12 |
42 |
94 |
18 |
44 |
67 |
|
3 |
06 |
12 |
55 |
42 |
94 |
18 |
44 |
67 |
|
4 |
06 |
12 |
18 |
42 |
94 |
55 |
44 |
67 |
|
5 |
06 |
12 |
18 |
42 |
94 |
00 |
44 |
67 |
|
6 |
06 |
12 |
18 |
42 |
44 |
55 |
94 |
67 |
|
7 |
06 |
12 |
18 |
42 |
44 |
55 |
94 |
67 |
|
8 |
06 |
12 |
18 |
42 |
44 |
55 |
67 |
94 |