Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Strukturi_danikh_ta_algoritmi_-_konspekt_lektsi...doc
Скачиваний:
33
Добавлен:
23.11.2019
Размер:
870.4 Кб
Скачать

5.2.Операції з вузлами і зв’язками

Мережі не завжди містять вузол, який займає таке особливе положення, як корінь в дереві. В незв’язній мережі може не існувати способу обійти всі вузли через зв’язки, почавши з одного конкретного вузла.

Тому алгоритми, які працюють з мережами, звичайно містять повний список усіх вузлів в мережі. Алгоритм також може зберігати повний список всіх зв’язків. За допомогою цих списків можна легко виконати будь-які дії над усіма вузлами або зв’язками в мережі.

5.2.1.Обхід мережі

Обхід мережі виконується аналогічно обходу дерева. Можна обходити мережу, використовуючи або обхід в глибину, або обхід в ширину. Обхід в ширину звичайно схожий на прямий обхід дерева, хоча для мереж можна визначити також зворотний і навіть симетричний обхід.

Алгоритм для виконання прямого обходу бінарного дерева формулюється так:

  1. Звернутися до вузла.

  2. Виконати рекурсивний прямий обхід лівого дерева.

  3. Виконати рекурсивний прямий обхід правого дерева.

В дереві між зв’язаними між собою вузлами існує відношення батько – нащадок. Оскільки алгоритм починається з кореневого вузла і завжди виконується зверху вниз, він не звертається двічі ні до одного вузла.

У мережі вузли не обов’язково мають бути зв’язані в напрямку зверху вниз. Якщо спробувати застосувати до мережі алгоритм прямого обходу, може виникнути нескінченний цикл.

Щоб уникнути цього, алгоритм повинен позначати вузол після звернення до нього, при цьому при пошуку в сусідніх вузлах, перегляд відбувається тільки до вузлів, які ще не були помічені. Після того, як алгоритм завершить роботу, всі вузли в мережі будуть помічені (якщо мережа є зв’язною). Алгоритм прямого обходу мережі формулюється так:

  1. Помітити вузол.

  2. Звернутися до вузла.

  3. Виконати рекурсивний обхід не помічених сусідніх вузлів.

Оскільки такий алгоритм обходу не допускає звернення до жодного вузла двічі, то список обходу зв’язків не містить циклів і утворює дерево.

Якщо мережа є зв’язною, то дерево обходу міститиме всі вузли мережі. Оскільки це дерево охоплює всі вузли мережі, то воно називається стовбурним деревом. Можна використовувати схожий підхід з поміткою вузлів для перетворення обходу дерева в ширину в мережний алгоритм. Алгоритм обходу дерева починається з поміщення кореневого вузла в чергу. Потім перший вузол вилучається з черги, відбувається звернення до нього, а в кінець черги поміщаються його дочірні вузли. Цей процес повторюється до тих пір, поки черга не стає пустою.

В алгоритмі обходу мережі потрібно спочатку переконатися, що вузол не перевірявся раніше або він вже не знаходиться в черзі. Для цього помічають кожний вузол, який поміщається в чергу. Мережна версія цього алгоритму має так вигляд:

  1. Помітити перший вузол (який буде коренем стовбурного дерева) і додати його в кінець черги.

  2. Повторювати наступні кроки до тих пір, поки черга не стає пустою:

  3. Видалити з черги вузол і звернутися до нього.

  4. Для кожного з непомічених сусідніх вузлів, помітити його і додати в кінець черги.

5.2.2.Найменші стовбурні дерева

Якщо була задана мережа з ціною зв’язків, то найменшим стовбурним деревом називається стовбурне дерево, в якому сумарна ціна всіх зв’язків в дереві буде найменшою. Найменше стовбурне дерево можна використовувати, щоб зв’язати всі вузли в мережі шляхом з якнайменшою ціною.

Наприклад, нехай потрібно розробити телефонну мережу, яка повинна з’єднати шість міст. Можна прокласти магістральний кабель між усіма парами міст, але це буде невиправдано дорого. Меншу вартість матиме рішення, при якому міста будуть сполучені зв’язками, які містяться в найменшому стовбурному дереві. Зауважимо, що мережа може мати декілька найменших стовбурних дерев.

Існує простий алгоритм пошуку найменшого стовбурного дерева для мережі:

  1. Поміщають в стовбурне дерево будь-який вузол.

  2. Знаходять зв’язок з найменшою ціною, який сполучає вузол в дереві з вузлом, який ще не був поміщений в дерево.

  3. Додають цей зв’язок і відповідний вузол в дерево.

  4. Повторювати кроки 2, 3 до тих пір, поки всі вузли не опиняться в дереві.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]