- •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.Програмна реалізація
1.2.Покрокове проектування алгоритмів.
Оскільки для вирішення вихідної задачі застосовують деяку математичну модель, то тим самим можна формалізувати алгоритм вирішення в термінах цієї моделі. У початкових версіях алгоритму часто застосовуються узагальнені оператори, які потім перевизначаться у вигляді більш дрібних, чітко визначених інструкцій. Але для перетворення неформальних алгоритмів у комп’ютерні програми необхідно пройти через декілька етапів формалізації (цей процес називають покроковою деталізацією), поки не отримають програму, яка повністю складається з формальних операторів мови програмування.
В основу процесу проектування програми з розбиттям її на достатню кількість дрібних кроків можна покласти наступну послідовність дій:
Вихідним станом процесу проектування є більш-менш точне формулювання мети алгоритму, або конкретніше – результату, який повинен бути отриманий при його виконанні. Формулювання проводиться на природній мові.
Проводиться збір фактів, які стосуються будь-яких характеристик алгоритму, і робиться спроба їх представлення засобами мови.
Створюється образна модель процесу, який відбувається, використовуються графічні та інші способи представлення, образні „картинки”, які дозволяють краще зрозуміти виконання алгоритму в динаміці.
В образній моделі виділяється найбільш суттєва частина, для якої підбирається найбільш точне словесне формулювання.
Проводиться визначення змінних, які необхідні для формального представлення даного кроку алгоритму.
Вибирається одна з конструкцій – проста послідовність дій, умовна конструкція або циклу. Складні частини вибраної формальної конструкції (умова, заголовок циклу) залишаються в словесному формулюванні.
Для інших неформалізованих частин алгоритму, які залишились у словесному формулюванні – перерахована послідовність дій повторюється.
Зовнішня сторона такого процесу проектування програми полягає в тому, що одне словесне формулювання алгоритму замінюється на одну з трьох можливих конструкцій мови, елементи якої продовжують залишатися в неформальному, словесному формулюванні. Проте, це зовнішня сторона процесу. Насправді, кожне словесне формулювання алгоритму містить важливий перехід, який виконується в голові програміста і не може бути формалізованим – перехід від мети (результату) роботи програми до послідовності дій, які приводять до потрібного результату. Тобто алгоритм вже формулюється, але тільки з використанням образного мислення і природної мови.
Схематично узагальнений процес програмування можна представити наступною схемою.
На першому етапі створюється модель вихідної задачі, для чого застосовуються відповідні математичні моделі. На цьому етапі для знаходження рішення також будується неформальний алгоритм.
На наступному етапі алгоритм записується на псевдомові – композиції конструкцій мови програмування і менш формальних і узагальнених операторів на простій мові. Продовженням цього етапу є заміна неформальних операторів послідовністю більш детальних і формальних операторів. З цієї точки зору програма на псевдомові повинна бути достатньо детальною, так як в ній фіксуються (визначаються) різні типи даних, над якими виконуються оператори. Потім створюються абстрактні типи даних для кожного зафіксованого типу даних (за винятком елементарних типів даних, таких як цілі й дійсні числа або символьні стрічки) шляхом завдання імен функцій для кожного оператора, який працює з даними абстрактного типа, і заміни їх (операторів) викликом відповідних функцій.
Третій етап процесу – програмування – забезпечує реалізацію кожного абстрактного типа даних і створення функцій для виконання різних операторів над даними цих типів. На цьому етапі також замінюються всі неформальні оператори псевдомови на код мови програмування. Результатом цього етапу повинна бути виконувана програма. Після її наладки отримують працюючу програму.