- •1.Побудова і аналіз алгоритмів
- •1.1.Формалізація алгоритмів.
- •1.2.Покрокове проектування алгоритмів.
- •1.3.Характеристики алгоритму
- •1.4.Складність алгоритму
- •1.5.Ефективність алгоритмів
- •1.6.Правила аналізу складності алгоритмів.
- •2.Алгоритми сортування
- •2.1.Задача сортування
- •2.2.Сортування вибіркою
- •2.2.1.Сортування простою вибіркою
- •2.2.2.Обмінне сортування простою вибіркою
- •2.2.3.Бульбашкове сортування
- •2.2.4.Сортування Шелла
- •2.3.Сортування включенням
- •2.3.1.Сортування простим включенням
- •2.3.2.Бульбашкове сортування включенням
- •2.3.3.Турнірне сортування
- •2.3.4.Сортування впорядкованим бінарним деревом
- •2.3.5.Сортування частково впорядкованим деревом
- •2.4.Сортування розподілом
- •2.4.1.Порозрядне цифрове сортування
- •2.4.2.Швидке сортування Хоара
- •2.5.Сортування злиттям
- •2.5.1.Сортування попарним злиттям
- •2.6.Рандомізація
- •3.Алгоритми пошуку
- •3.1.Послідовний (лінійний) пошук
- •3.2.Бінарний пошук
- •3.3.Метод інтерполяції
- •3.4.Метод „золотого перерізу”
- •3.5.Алгоритми пошуку послідовностей
- •3.5.1.Прямий алгоритм пошуку
- •3.5.2.Алгоритм Кнута, Моріса, Пратта
- •3.5.3.Алгоритм Боуєра та Мура
- •4.Методи швидкого доступу до даних
- •4.1.Хешування даних
- •4.1.1.Методи розв’язання колізій
- •4.1.2.Переповнення таблиці і повторне хешування
- •4.1.3.Оцінка якості хеш-функції
- •4.2.Організація даних для прискорення пошуку за вторинними ключами
- •4.2.1.Інвертовані індекси
- •4.2.2.Бітові карти
- •5.Мережеві алгоритми
- •5.1.Представлення мереж
- •5.2.Операції з вузлами і зв’язками
- •5.2.1.Обхід мережі
- •5.2.2.Найменші стовбурні дерева
- •5.3.Найкоротший маршрут
- •5.3.1.Інші задачі пошуку найкоротшого маршруту
- •5.3.1.1.Двох-точковий найкоротший маршрут
- •5.3.1.2.Обчислення найкоротшого маршруту для всіх пар
- •5.3.1.3.Штрафи за повороти
- •5.3.2.Застосування методу пошуку найкоротшого маршруту
- •5.3.2.1.Розбиття на райони
- •5.3.2.2.Складання плану робіт
- •5.3.2.3.Планування колективної роботи
- •5.4.Максимальний потік
- •5.4.1.Застосування максимальних потоків
- •5.4.1.1.Непересічні шляхи
- •5.4.1.2.Розподіл робіт
- •6.Методи розробки алгоритмів
- •6.1.Метод частинних цілей
- •6.2.Динамічне програмування
- •6.3.Метод сходження
- •6.4.Дерева розв’язків
- •6.4.1.Мінімаксний пошук
- •6.4.2.Покращення пошуку в дереві гри
- •6.4.3.Метод відпрацювання назад
- •6.5.Програмування з поверненнями назад
- •6.5.1.Метод спроб та помилок
- •6.5.2.Реалізація пошуку з поверненням
- •6.5.3.Альфа-бета відсікання
- •6.5.4.Метод гілок і границь
- •6.6.Евристичні алгоритми
- •6.7.Імовірнісні алгоритми
- •6.8.Генетичні алгоритми
- •6.8.1.Розв’язок діофантового рівняння.
- •6.8.2.Програмна реалізація
5.2.Операції з вузлами і зв’язками
Мережі не завжди містять вузол, який займає таке особливе положення, як корінь в дереві. В незв’язній мережі може не існувати способу обійти всі вузли через зв’язки, почавши з одного конкретного вузла.
Тому алгоритми, які працюють з мережами, звичайно містять повний список усіх вузлів в мережі. Алгоритм також може зберігати повний список всіх зв’язків. За допомогою цих списків можна легко виконати будь-які дії над усіма вузлами або зв’язками в мережі.
5.2.1.Обхід мережі
Обхід мережі виконується аналогічно обходу дерева. Можна обходити мережу, використовуючи або обхід в глибину, або обхід в ширину. Обхід в ширину звичайно схожий на прямий обхід дерева, хоча для мереж можна визначити також зворотний і навіть симетричний обхід.
Алгоритм для виконання прямого обходу бінарного дерева формулюється так:
Звернутися до вузла.
Виконати рекурсивний прямий обхід лівого дерева.
Виконати рекурсивний прямий обхід правого дерева.
В дереві між зв’язаними між собою вузлами існує відношення батько – нащадок. Оскільки алгоритм починається з кореневого вузла і завжди виконується зверху вниз, він не звертається двічі ні до одного вузла.
У мережі вузли не обов’язково мають бути зв’язані в напрямку зверху вниз. Якщо спробувати застосувати до мережі алгоритм прямого обходу, може виникнути нескінченний цикл.
Щоб уникнути цього, алгоритм повинен позначати вузол після звернення до нього, при цьому при пошуку в сусідніх вузлах, перегляд відбувається тільки до вузлів, які ще не були помічені. Після того, як алгоритм завершить роботу, всі вузли в мережі будуть помічені (якщо мережа є зв’язною). Алгоритм прямого обходу мережі формулюється так:
Помітити вузол.
Звернутися до вузла.
Виконати рекурсивний обхід не помічених сусідніх вузлів.
Оскільки такий алгоритм обходу не допускає звернення до жодного вузла двічі, то список обходу зв’язків не містить циклів і утворює дерево.
Якщо мережа є зв’язною, то дерево обходу міститиме всі вузли мережі. Оскільки це дерево охоплює всі вузли мережі, то воно називається стовбурним деревом. Можна використовувати схожий підхід з поміткою вузлів для перетворення обходу дерева в ширину в мережний алгоритм. Алгоритм обходу дерева починається з поміщення кореневого вузла в чергу. Потім перший вузол вилучається з черги, відбувається звернення до нього, а в кінець черги поміщаються його дочірні вузли. Цей процес повторюється до тих пір, поки черга не стає пустою.
В алгоритмі обходу мережі потрібно спочатку переконатися, що вузол не перевірявся раніше або він вже не знаходиться в черзі. Для цього помічають кожний вузол, який поміщається в чергу. Мережна версія цього алгоритму має так вигляд:
Помітити перший вузол (який буде коренем стовбурного дерева) і додати його в кінець черги.
Повторювати наступні кроки до тих пір, поки черга не стає пустою:
Видалити з черги вузол і звернутися до нього.
Для кожного з непомічених сусідніх вузлів, помітити його і додати в кінець черги.
5.2.2.Найменші стовбурні дерева
Якщо була задана мережа з ціною зв’язків, то найменшим стовбурним деревом називається стовбурне дерево, в якому сумарна ціна всіх зв’язків в дереві буде найменшою. Найменше стовбурне дерево можна використовувати, щоб зв’язати всі вузли в мережі шляхом з якнайменшою ціною.
Наприклад, нехай потрібно розробити телефонну мережу, яка повинна з’єднати шість міст. Можна прокласти магістральний кабель між усіма парами міст, але це буде невиправдано дорого. Меншу вартість матиме рішення, при якому міста будуть сполучені зв’язками, які містяться в найменшому стовбурному дереві. Зауважимо, що мережа може мати декілька найменших стовбурних дерев.
Існує простий алгоритм пошуку найменшого стовбурного дерева для мережі:
Поміщають в стовбурне дерево будь-який вузол.
Знаходять зв’язок з найменшою ціною, який сполучає вузол в дереві з вузлом, який ще не був поміщений в дерево.
Додають цей зв’язок і відповідний вузол в дерево.
Повторювати кроки 2, 3 до тих пір, поки всі вузли не опиняться в дереві.