НОВІ ІНФОРМАЦІЙНІ І ТЕЛЕКОМУНІКАЦІЙНІ ТЕХНОЛОГІЇ
УДК 681.3
С.Д. ПОГОРІЛИЙ, Ю.В. БОЙКО, Р.В. БІЛОУС
ФОРМУВАННЯ ТА АНАЛІЗ ПАРАЛЕЛЬНИХ СХЕМ АЛГОРИТМУ ДЕЙКСТРИ
Abstract: Formalization of Deykstri's algorithm using mathematical means of the modified systems of algorithmic algebras. Strategies for creating a parallel algorithm are proposed and parallel regular charts of algorithm for different structures are received.
Key words: routing, Deykstri's algorithm, parallel regular chart of algorithm, scheme's equivalent transformations, paralleling, process.
Анотація: Виконано формалізацію алгоритму Дейкстри з використанням математичного апарату модифікованих систем алгоритмічних алгебр. Запропоновано стратегії розпаралелювання та одержано паралельні регулярні схеми алгоритму для різних архітектур обчислювальних систем.
Ключові слова: маршрутизація, алгоритм Дейкстри, паралельна регулярна схема алгоритму, еквівалентні перетворення схем, розпаралелювання, процес.
Аннотация: Выполнена формализация алгоритма Дейкстры с использованием математического аппарата модифицированных систем алгоритмических алгебр. Предложены стратегии распараллеливания и получены параллельные регулярные схемы алгоритма для различных архитектур вычислительных систем.
Ключевые слова: маршрутизация, алгоритм Дейкстры, параллельная регулярная схема алгоритма, эквивалентные преобразования схем, распараллеливание, процесс.
Маршрутизація (routing) є однією із класичних функціональних задач мереж, ефективність розв'язання якої визначає продуктивність мережі в цілому. Необхідність значного підвищення швидкодії комп'ютерних мереж, зменшення часу реакції висуває задачу створення нових протоколів маршрутизації на основі продуктивних алгоритмів. У сучасних мережах використовуються такі протоколи маршрутизації стеку TCP/IP, як OSPF (грунтується на алгоритмі Дейкстри) та RIP (грунтується на алгоритмі Беллмана-Форда). Через швидкий розвиток галузі мережевих технологій розмірності оброблюваних графів зростають, тому виникає необхідність покращання часових характеристик сучасних алгоритмів маршрутизації.
Одним із способів зменшення часу виконання є розпаралелювання алгоритму або його частин з метою подальшої реалізації на паралельній архітектурі. Перетворити існуючий алгоритм на паралельний можна за допомогою досвіду, інтуїції або математичного апарату еквівалентних перетворень. В роботі розглянуто формування регулярних схем алгоритмів (РСА) та отримання паралельних регулярних схем алгоритмів (ПРСА) для алгоритму Дейкстри і обґрунтування результатів за допомогою апарату еквівалентних перетворень, для виконання яких застосовано математичний апарат модифікованих систем алгоритмічних алгебр (САА-М) В.М. Глушкова.
В задачі про найкоротші шляхи задається зважений орієнтований граф G = (V,E, w) ,
де V — множина вершин графа G ;
Розглянемо задачу пошуку найкоротшого шляху з однієї вершини [1, 2], в якій для заданого графа О = (V,Е,ю) потрібно знайти найкоротший шлях, що починається у визначеній вихідній
1. Вступ
Е — множина його ребер;
(О . Е ® Я - вагова функція ребер графа О .
© Погорілий С.Д., Бойко Ю.В., Білоус Р.В., 2008
ІБвИ 1028-9763. Математичні машини і системи, 2008, № 4
вершині г є V і закінчується в кожній з вершин Vє V. Зазначимо деякі алгоритми, що вирішують ці задачі.
Алгоритм Беллмана-Форда [1, 2] дозволяє вирішити задачу про найкоротший шлях із однієї вершини в загальному випадку, коли вага кожного з ребер може бути від'ємною. Для заданого зваженого орієнтованого графа алгоритм Беллмана-Форда повертає логічне значення, що вказує на те, чи присутній у графі цикл з від'ємною вагою, досяжний з витоку. Якщо такий цикл існує, в алгоритмі вказується, що рішення не існує. Якщо ж таких циклів немає, алгоритм видає найкоротші шляхи та їх вагу.
2. Алгоритм Дейкстри [1, 2] вирішує задачу пошуку найкоротшого шляху із однієї вершини у зваженому орієнтованому графі в тому випадку, коли ваги ребер невід'ємні.
Введемо позначення:
г — опорна вершина;
Ь — множина вершин графа, для яких обчислено найкоротший шлях від опорної вершини г;
п — кількість вершин графа;
V - поточна вершина графа.
Схема послідовного алгоритму Дейкстри може бути представлена у вигляді [1, 2].
Алгоритм 1.
1. Процедура □і]к8іїа_8іпдІе_8оигсе_8Иогіе8І:_РаШ (V, Е,О, г).
2. Ь :={г}.
3. Для всіх вершин V є (V — Ь).
4. Якщо ((г, V) існує) то := о\г, V].
5. Якщо ((г , V ) не існує) то 5^] := ¥ .
6. Поки (Ь Ф V) виконувати.
7. Знайти вершину и , таку, що s\u] := тіп{5^]^є (V — Ь)}.
8. Ь := Ь и {и} .
9. Для усіх вершин Vє (V — Ь).
10. ^] := тіп{£\у],s\u] + О\и, V]}.
Алгоритм використовує множину Ь , що містить вершини графа, для яких найкоротший шлях від вихідної вершини г уже знайдено. Він також використовує чергу з пріоритетами Q = Ь/V та атрибутом 5\1..п] (де п — кількість вершин графа О), в якому для кожної вершини Vє V зберігається поточне значення найкоротшого шляху.
У ході кожної нової ітерації алгоритму до множини Ь додається нова вершина и , така, що s\u] = тіп{і\у]|Vє (V — Ь)}. Після додавання вершини всі значення масиву з\у] оновлюються,
якщо сума відстані до вершини u та ваги ребра з «бахроми» менша, ніж поточна відстань до вершини. Алгоритм закінчує роботу, коли L =V .
Час виконання алгоритму Дейкстри залежить від реалізації черги з пріоритетами [1]. Спочатку розглянемо випадок, коли черга з пріоритетами підтримується за рахунок того, що всі
вершини пронумеровані від 1 до |V|. Атрибут s[v] просто поміщається як елемент масиву з
індексом v.
Кожна операція додавання вершини до множини L та операція переходу до наступної вершини займає час O(1) , а кожна операція пошуку мінімуму (s[u] = min{s[v]|v є (V — L)}) O(V) (оскільки в ній виконується пошук по всьому масиву); в результаті повний час роботи алгоритму дорівнює O(V 2 + E) = O(V2).
Слід зазначити, що у випадку ненасиченого графа G черга з пріоритетами задається у вигляді двійкового дерева. Тоді операція пошуку s[u] = min{s[v]|vє (V — L)} займає O(lgV), а
таких операцій відбувається |V|, тобто сумарна складність алгоритму складає O((V + E)lg V) . Ця складність еквівалентна O(ElgV) , якщо всі вершини графа G є досяжними з опорної вершини r .
3. РСА Дейкстри
Виконаємо формалізацію послідовного алгоритму Дейкстри. Розглянемо зважений
граф G = (V,E,W) , де W — вагова матриця суміжності графа G .
Введемо додаткові позначення:
next(v) - перехід до наступної за порядком вершини графа;
first — перша вершина у списку вершин графа;
last — остання вершина у списку.
Ініціалізація алгоритму відбувається в два етапи:
- спочатку задається початкове значення множини L викликом функції Init(L).
Функція Init(L) виконує L :={r};
- задаються початкові значення елементів масиву s[v] викликом функції Init (s[v]). Зазначена функція Init(s[v]) для всіх вершин vє (V — L) виконує s[v]:=w[r,v], якщо
ребро (r, v) існує, або s[v]:=¥ , якщо ребро (r, v) не існує.
Використовуючи схему послідовного алгоритму, описану вище (Алгоритм 1), побудуємо регулярну схему алгоритму, попередньо увівши деякі позначення:
Позначення для предикатів:
a = (v Ф last) ; p = (v є (V — L)) ;
Y = (s[v] < min);
5 = (L Ф V);
m = (s[v] < s[u] + w[u, v]).
схеми
Позначення для операторів:
A = Init (L);
B = Init (s[v]);
С = (v := first) ;
D = next(v);
E = (min := s[u]);
F = (u := v);
G = (L := L U {u});
H = (s[v] := s[u] + w[u, v]).
Пошук вершини u , такої, що s[u]:= min{s[v]|vє (V — L)}, можна представити у вигляді
(С)*{((^)*(Е)))*(D}.
а Ру
Внутрішній покроковий цикл останньої схеми можна представити у вигляді
(С )*{(( H ))*ф}. а р т
Тоді схема алгоритму Дейкстри може бути записана у такому вигляді:
A *B*{ C*{ ((F *E))*D}*C *{ ( (H))*D}}.
8 а Ру aрm
Введемо позначення: P/g = S та p/m = f.
Тоді схема (1) матиме вигляд
A * B *{ C *{ ( F * E )* D}* C *{( H )* D}} .
8 as af
Одержане співвідношення (2) є послідовною РСА Дейкстри.
(1)
(2)
4. Концепції розпаралелювання
Користуючись класифікацією Фліна [5, 7], виділяють 4 класи обчислювальних систем. В класі МІМй будемо розрізнювати:
• обчислювальні системи зі слабким зв'язком між процесорами, до яких відносять системи із розподіленою пам'яттю (кластерні архітектури);
• обчислювальні системи із сильним зв'язком (системи зі спільною пам'яттю).
Далі розглянуто обидві архітектури обчислювальних систем класу МІМй.
Алгоритм Дейкстри є ітераційним [3]. Кожна ітерація додає нову вершину до множини L. Оскільки значення ^[у] для вершини v може змінитись після кожної ітерації, то за одну ітерацію
неможливо включити більше ніж одну вершину до множини Ь. Це означає, що зовнішня а — ітерація не підлягає розпаралелюванню.
Нехай р — кількість процесів, а п — кількість вершин графа G . Множина V ділиться на р
рівно потужних підмножин. Нехай V — підмножина вершин, що пов'язана з процесом Р (де і = 0,1,...,р — 1). Кожна підмножина V' містить п/р вершин, і обробка кожної з них проводиться різними процесами.
5. Системи з розподіленою пам’яттю
Кожен процес Р' зберігає частину масиву 5, що відноситься до Vі (тобто процес Рі зберігає 5[у], такі, що Vє Vі). На рис. 1 зображено таке розбиття:
1—1 1—1 І —
І р І І р І І р
Рис. 1. Розбиття масиву 5 для систем із розподіленою пам'яттю Кожен процес P обраховує s[u] = min{s[v]|vє (V — L)IV} під час кожної а —ітерації. Загальний мінімум одержується з усіх st[u] за допомогою операції зведення даних з усіх процесів в один (all-to-one reduction) і зберігається в процесі Pq . Тепер процес Pq містить нову вершину u , що буде включена до множини L . Процес Pq посилає u усім процесам, використовуючи операцію розсилання даних (one-to-all broadcast). Процес р , що відповідає вершині u, позначає її як вершину, що належить до L. Тоді кожен процес обраховує нові значення s[v] для відповідних вершин.
Процес, що відповідає за вершину v, повинен «знати» вагу ребра w(u, v). Отже, кожен процес р повинен зберігати стовпці вагової матриці суміжності графа, які відповідають підмножині його вершин Vj. Це відповідає розбиттю матриці на блоки. Об'єм пам'яті, необхідний для
збереження одного блока для кожного процесу, обчислюється як O(n2/р). Рис. 2 ілюструє розбиття даних між процесами:
1 п 1 1 п 1 1 п 1 1 п 1
1 р 1 1 р 1 1 р 1 1 р 1
Процеси о
і к <■ * і ь ■і ь
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □
П □ □ П п □ п □ □ п □ п п □ □ □ |1
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □
М І \
р-і
Рис. 2. Розбиття матриці суміжності графа для систем із розподіленою пам’яттю У такий спосіб обчислювальні затрати для розв'язання задачі розподіляються між усіма р процесами. Але в цьому випадку з'являються додаткові накладні витрати, пов'язані з обміном даними між процесами при кожній ітерації циклу задачі.
6. Системи зі спільною пам’яттю
Як і для випадку систем з розподіленою пам'яттю, кожен окремий процес Рі обраховує s\u] = тіп{5\у]|Vє (V — Ь)IV} під час кожної ітерації циклу та обраховує нові значення ^[у] для відповідних вершин.
Рис. 3. Розбиття даних для систем зі спільною пам'яттю
Пошук загального мінімуму в масиві ^[у] у цьому випадку відбувається за допомогою об'єктів синхронізації, що залежать від конкретної програмної реалізації алгоритму. Розбиття за даними (масиву ^[у] та матриці суміжності графа) та за контролем над «спільними» змінними схематично зображено на рис. 3.
У такому випадку зникають накладні витрати на пересилання даних між процесами. Але додатковий час роботи програми витрачається на синхронізацію процесів та контроль над «спільними» змінними. «Спільними» будемо називати ті ресурси (дані), контроль над якими здійснюється паралельно усіма процесами одночасно. Ці ресурси відповідно потребують додаткового контролю коректності звертань та синхронізації процесів.
7. Формування паралельних схем алгоритму
Системи з розподіленою пам’яттю. Сформулюємо ПРСА Дейкстри за описаним вище підходом, користуючись апаратом еквівалентних трансформацій у відповідній алгебрі [4, 11].
Користуючись методом розпаралелювання за даними, що описаний вище, розглянемо співвідношення (2).
Використаємо формулу ( А) = аЛ і позначимо фільтри. При цьому виконання алгоритму
де a = (vi ф lasti), lasti = first + (n/p)* i, p - кількість процесів.
Це дає змогу сформувати паралельні гілки алгоритму, користуючись наведеними вище концепціями розбиття даних.
Тоді схема (3) матиме вигляд
Оскільки умова циклу - кон'юнкція, то формулу (4) можна представити у вигляді паралельної схеми:
а
для гілок з істинними умовами продовжується, а для інших обривається:
A * B *{ C *{(s(F * E))* D}* G * C *{(fH )* D}}.
(З)
Предикат а може бути записаний у вигляді кон'юнкції в такому вигляді:
a= aj л a2 л .. л a p ,
A * B *{ C *{(s(F * E)) * D}* G * C * { (fH)* D}}.
(4)
Введемо додаткові позначення:
K = (fH)*D .
• • •
A * B *{ C *{(s(F * E))* D}* G * C*#{ K}v { K}v ...v { K}#}.
(5)
p
Символами «#...#» позначається частина, оператори якої виконуються паралельно, а
символами « v » - оператори асинхронної диз’юнкції паралельних гілок алгоритму.
Зрозуміло, що в цій схемі значення lasti та vt є локальними для кожної гілки виконання.
Скористаємось розподільчою властивістю паралельного виконання гілок алгоритму. Таке перетворення дозволяє сформувати незалежні паралельні гілки виконання алгоритму і таким чином зменшити накладні витрати на синхронізацію даних.
• •
Використавши рівність A*#B v C# =# A * B v A * C# , одержимо:
A * B *{ C *{(s(F * E))* D}* G*# C * { K}V C * { K}V ...V C * { K}#}. (6)
da a1 a2 ap
тут C = (vi := firsti) , firsti = (n/p) * (i - 1) .
Позначимо = C * { K}, тоді (6) можна подати у вигляді
А * В *{ С *{(е(Р * Е))* П}* 0*#МХ V М2 V ...V Мр }#}. (7)
З а
Скориставшись таким же принципом, можна розподілити пошук найменшого шляху серед вершин V І V є (V - Ь) .
Але в цьому випадку слід ввести додатковий оператор.
Позначимо Q — оператор пошуку найкоротшого шляху серед результатів пошуку дочірніх процесів та розсилання результату всім дочірнім процесам.
Введемо позначення: N = С * { (Г(Е *Е)*П} .
а
Тоді схему (7) можна записати так:
А * В *{#N VЫ2 V... VЫр ^ * 0*#МХ VМ2 V... VМр #} . (8)
З
Схема (8) являє собою ПРСА Дейкстри, представленою в САА-М, для систем із розподіленою пам'яттю.
Системи зі спільною пам’яттю. На першому кроці скористаємось аналогічним методом
розпаралелення за даними для обчислення нових значень поточного найкоротшого шляху при
кожній ітерації, що було використано для систем з розподіленою пам'яттю.
Використаємо формулу (7). Розглянемо тепер послідовність операторів пошуку найменшого шляху серед вершин VІVє (V — Ь):
С *{№ *Е))*П} . (9)
а
Оскільки наведена послідовність операторів працює з даними, що є «спільними» для усіх паралельних гілок алгоритму, необхідно ввести додаткові оператори синхронізації:
L(Lock) - оператор, що блокує доступ до простору «спільних» змінних для усіх
паралельних гілок, окрім поточної. Якщо ж даний ресурс вже заблоковано, то оператор очікує його звільнення;
U (Unlock) - оператор, що знімає блокування простору «спільних» змінних .
З урахуванням наведених вище позначень формулу (9) можна записати у вигляді
C *{(s(L * F * E * U ))* D} .
a
Тоді ПРСА для систем зі спільною пам’яттю матиме вигляд
• • •
A * B *{ C *{(s{L * F * E *U))* D}* G*#M1 v M2 v ...v Mp }#}. (10)
d a
Введемо позначення:
S = C * { a(L *F *E *U)*D}.
a
Аналогічно, як і у схемі для систем з розподіленою пам’яттю, схему (10) подамо у вигляді
A *B *{#S1 vS2 v...vSp #*G*#M1 vM2 v...vMp #}. d
У такий спосіб одержано 2 схеми для дослідження та реалізації алгоритму Дейкстри для різних MIMD архітектур обчислювальної системи.
S. Оцінка паралельних схем алгоритму
Для аналізу паралельних схем алгоритму введемо деякі функціонали для позначення ефективності та підвищення швидкодії їх реалізацій [В, 11].
W(p) - число елементарних операцій, що виконують p процесів. Ця величина відноситься до обчислювальних затрат.
T(p) — час виконання програми на p - процесорній системі; зрозуміло, що T(1) = W(1) та T(p) < W (p) .
T(1)
S (p) — підвищення швидкодії алгоритму S (p) = E(p) — ефективність алгоритму E (p)
T(p) T (1)
рТ ( р)
Оцінка функції складності алгоритму дозволяє визначити, як швидко зростають затрати ресурсів на виконання алгоритму при зростанні об'єму даних. В асимптотичному аналізі алгоритмів використовуються позначення, прийняті в математичному асимптотичному аналізі.
Системи з розподіленою пам’яттю. Обрахунок даних одним процесом, що включає знаходження
мінімуму та обрахунок нових значень s[v] під час кожної ітерації, займає O(n2/p) часу. Зв'язок між процесорами, що відбувається при кожній ітерації, займає час, необхідний для виконання двох операцій: all-to- one reduction та one-to-all broadcast. Затрати на ці операції залежать від конкретної реалізації паралельної обчислювальної установки. Для p — процесорної MP (Massage Passing) -
архітектури ці затрати визначаються як O(n(ts + tt)logp), де ts (startup time) - час, необхідний
для обробки повідомлення процесами, що посилають та отримують його. Він включає час на підготовку повідомлення (додавання заголовку, корекція помилок) та час на його маршрутизацію. Ця затримка формується лише раз при передачі одного повідомлення.
tt (transfer time) - час, необхідний для передачі одиниці інформації («слова») через канал
обміну.
Отже для такої паралельної схеми алгоритму сумарний час його роботи складає Tp, що визначається за формулою
( 2 Л 11
- + O(n(ts + tt )log p) .
Tp = O
кг У
Тобто підвищення швидкодії та ефективність паралельного алгоритму в порівнянні з послідовним складають відповідно
X = °("2)
O
( 2 Л n
V p У
E
+ O(n(ts + tt )log p) 1
1 + 0(р^5 + ^ )Іо§ р І п)
Системи зі спільною пам’яттю. Як і у випадку з системами з розподіленою пам'яттю, обробка даних одним процесом, що включає знаходження мінімуму та обрахунок нових значень 5[у] під час
кожної ітерації, займає 0(п2/р) часу. Оскільки дані розділяють спільну пам'ять, додаткові затрати часу Т8 займає лише оператор синхронізації процесів. Час на його виконання залежить від конкретної реалізації обчислювальної установки. Отже
Tp = O
( 2 Л n
+ O(nTs (n p)) .
V ^
У найпростішому випадку виключне звертання до простору «спільних» змінних відбувається за рахунок певного об'єкта синхронізації, звертання до якого відбувається усіма процесами при кожній ітерації циклу. Таким чином, сумарні затрати на синхронізацію можна обчислити як 0(п ■ р) .
Отже для такої паралельної схеми алгоритму сумарний час роботи визначається за формулою
тр = о
+ 0(п ■ р).
V ^ у
Підвищення швидкодії та ефективність паралельного алгоритму в порівнянні з послідовним складають відповідно
1
0(п 2)
о
Е =
V р У
1 + 0( р 1 / п)
+ 0(п ■ р)
Зобразимо схематично залежності швидкодії від кількості обчислювальних вузлів та розмірності вхідних даних для систем з розподіленою пам'яттю (рис. 4) та систем зі спільною пам'яттю (рис. 5).
в(п,р) .ч ч\';ч<л і .
Рис. 4. Підвищення швидкодії для систем Рис. 5. Підвищення швидкодії для систем
з розподіленою пам'яттю зі спільною пам'яттю
З графіків видно, що швидкодія алгоритму зростає зі збільшенням кількості процесорів для обох архітектур. Слід зазначити, що з отриманих графіків випливає доцільність використання спільної пам'яті для графів малої розмірності при невеликій кількості процесорів, тоді як модель розподіленої пам'яті виявляється значно ефективнішою для невеликих масивів оброблюваних даних, коли кількість вузлів зростає. Для графів великої розмірності обидва підходи однаково ефективні, що пояснюється відсутністю будь-яких обмежень в теоретичних моделях, які були використані.
9. Висновки
1. У статті виконано формалізацію послідовного алгоритму Дейкстри з використанням
математичного апарату САА-М і отримано його РСА .
2. Запропоновано концепції розпаралелювання алгоритму для двох різних архітектур
обчислювальних систем: розподілених систем та систем зі спільною пам'яттю.
3. Отримано ПРСА за допомогою еквівалентних трансформацій в САА-М.
4. Користуючись асимптотичним аналізом алгоритмів, оцінено ефективність та швидкодію ПРСА Дейкстри.
5. Отримані ПРСА є підґрунтям для створення мережевих маршрутизаторів нового покоління.
1. Седжвик Р. Фундаментальные алгоритмы на С++. Алгоритмы на графах / Пер. с англ. - СПб.: ООО «ДиаСофтЮП», 2002. - 496 с.
2. Кормен Т. и др. Алгоритмы: построение и анализ / Т. Кормен, Ч. Лейзерсон, Р. Ривест. - М.: Центр непрер. математического образования, 2000. - 960 с.
3. Ananth Grama, Anshul Gupta, George Karypis, Vipin Kumar «Introduction to Parallel Computing» Addison Wesley 2003 ISBN- 0-201-64865-2. - 856 p.
4. Погорілий С.Д., Калита Д.М. Оптимізація алгоритмів маршрутизації з використанням систем алгоритмічних алгебр // УСиМ. - 2000. - № 4. - С. 20 - 30.
5. Богачёв К.Ю. Основы параллельного программирования. - М.: БИНОМ. Лаборатория знаний, 2003. - 342 с.
6. Многоуровневое структурное проектирование программ. Теоретические основы, инструментарий / Е.Л. Ющенко, Г.Е. Цейтлин, В.П. Г рицай и др. - М.: Финансы и статистика, 1989. - 342 с.
7. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - Санкт-Петербург: БХВ-Петербург, 2002. -608 с.
8. Parhami, Behrooz Introduction to Parallel Processing: Algorithms and Architectures. - Kluwer Academic Publishers, 2002.
9. Parallel and Distributed Programming Using C++ Cameron Hughes, Tracey Hughes Addison Wesley 2003 ISBN: 013-101376-9. - 720 p.
10. Погорілий С.Д. та інш. Про підвищення швидкодії алгоритмів формування мінімального вкриваю чого дерева / С.Д. Погорілий, О.О. Камардіна, Ю.С. Кордаш // Математичні машини і системи. - 2005. - № 4. - С. 30
- 38.
11. Погорілий С.Д. Програмне конструювання. - К.: ВПЦ “Київський університет”, 2005. - 438 с.
Стаття надійшла до редакції27.03.2008