
- •Основні положення теорії алгоритмів та її застосування
- •Введення до теорії алгоритмів
- •Загальні риси алгоритмів
- •Машина Поста
- •Машина т’юринга
- •Основи лямбда-числення та функціонального програмування
- •Теза Черча-т’юринга про алгоритмічну розв’язність задачі
- •Проблема розв’язності (зависання)
- •Алгоритмічно нерозв’язні задачі
- •Проблема відсутності загального методу вирішення задачі
- •Проблема інформаційної невизначеності задачі
- •Проблема логічної нерозв’язності задачі
- •Побудова машини т’юринга для обчислення деяких простих функцій
- •Введення до оцінки складності алгоритмів
- •Визначення порядку складності алгоритму
- •Оптимізація алгоритмів
- •Структури даних в алгоритмічній мові програмування
- •Визначення алгоритмічної мови програмування
- •Базові елементи сучасної мови програмування: типи даних; екземпляри даних; вирази; оператори; функції; класи.
- •Поняття типу даних
- •Прості типи: числові; символьні; логічні.
- •Тип даних рядок
- •Структуровані типи даних: масиви, записи, множини
- •Типи даних за значенням і за посиланням
- •Сумісність типів та перетворення між типами даних
- •Екземпляри даних: змінні, константи
- •Видимість даних
- •Управління ходом виконання та структурування програм в алгоритмічній мові програмування
- •Вирази, операнди та операції
- •Основні операції: арифметичні; логічні; бульові; з використанням рядків
- •Поняття оператора
- •Прості оператори: присвоювання; виклику функції
- •Оператори управління ходом виконання: розгалуження; вибору; цикли; переходу
- •Структурування програм: функції та класи
- •Параметри функцій: вхідні, результуючі.
- •Рекурсивні функції
- •Файли: текстові, бінарні
- •Алгоритми чисельних методів, апроксимації функцій, інтегрування та вирішення рівнянь з одним невідомим
- •Чисельні методи
- •Особливості вирішення задач чисельними методами, точність та коректність рішень
- •Апроксимації функцій: лінійна інтерполяція; інтерполяційний многочлен Ньютона.
- •Чисельне інтегрування: метод трапецій; метод Сімпсона; метод Сімпсона з оцінкою погрішності.
- •Вирішення рівнянь з одним невідомим: метод простих ітерацій; метод Ньютона; метод парабол.
- •Алгоритми вирішення системи лінійних рівнянь, пошуку екстремуму функції
- •Вирішення системи лінійних рівнянь методом Гауса
- •Пошук екстремуму функцій одної змінної: метод золотого перетину; метод парабол.
- •Пошук екстремуму функцій багатьох змінних: метод координатного спуску; метод найскорішого спуску.
- •Алгоритми обробки масивів
- •Визначення масивів
- •Операції над масивами
- •Упорядкування масивів: сортування вибором; сортування вставкою; бульбашкове сортування; сортування методом Шелла; метод швидкого сортування.
- •Вибір методів сортування
- •Пошук в упорядкованих масивах методом половинного поділу, інтерполяційним методом
- •Застосування індексів для пошуку у невпорядкованих даних
- •Алгоритми обробки даних на основі списків та дерев
- •Визначення списку
- •Види списків: незалежні списки, однозв’язані списки; двозв’язані списки; кільцеві списки; упорядковані списки
- •Основні операції над списками: включення елементу до списку; видалення елементу; перехід між елементами; ітератор для списку
- •Упорядкування та пошук в списках
- •Похідні структури даних: черга, стек, дек
- •Визначення дерева
- •Впорядковані дерева
- •Бінарні дерева
- •Основні операції з бінарними деревами: включення елементу; видалення елементу; обхід дерева
- •Балансування дерева
- •Алгоритми обробки текстових даних на основі регулярних виразів
- •Введення до теорії кінцевих автоматів
- •Графічне представлення кінцевих автоматів
- •Використання кінцевого автомату: синтаксичний аналіз.
- •Реалізація синтаксичного аналізу файлу з розділяючими комами
- •Детерміновані та недетерміновані кінцеві автомати
- •Регулярні вирази
- •Форма Бекуса-Наура для запису регулярних виразів
- •Синтаксичний аналіз регулярних виразів
- •Компіляція регулярних виразів
- •Інструменти для спрощення роботи з регулярними виразами
- •Зіставлення рядків з регулярними виразами.
- •Алгоритми систем числення
- •Введення до систем числення
- •Двійкова система числення
- •Шістнадцяткова система числення
- •Системи числення з нетрадиційними основами
- •Перетворення між різними системами числення
- •Арифметика чисел з плаваючою комою
- •Точність операцій з плаваючою комою
- •Арифметика великих чисел
- •Алгоритми криптографії та хешування
- •Значення випадкових чисел у програмуванні
- •Алгоритми генерації рівномірно розподілених псевдовипадкових чисел
- •Перевірка якості випадкових чисел
- •Кодування з виправленням помилок
- •Стиснення даних
- •Стиснення даних зі словником
- •Алгоритм стиснення даних Лемпела-Зіва
- •Введення до криптографії
- •Елементи теорії порівнянь
- •Шифрування за допомогою випадкових чисел
- •Створення таємного ключа по Діффі-Хеллману
- •Система rsa
- •Алгоритми цифрового підпису
- •Введення до хешування
- •Функції хешування
- •Проста функція хешування рядків
- •Функції хешування з використанням рандомізації
- •Вирішення конфліктів за допомогою лінійного зондування
- •Псевдовипадкове зондування
- •Подвійне хешування
Вибір методів сортування
Вибір підходящого алгоритму сортування залежить від декількох умов:
Кількість операцій (складність алгоритму)
Доступність пам’яті (у тому числі для реалізації рекурсії)
Вимоги до стійкості алгоритму
Швидкість доступу на запис/читання даних
Характер даних
і т.д.
У загальному випадку – якщо не підходить алгоритм швидкого сортування Хоара, відомий як найшвидший серед алгоритмів сортування загального призначення, то слід обрати інший алгоритм, враховуючи існуючі обмеження.
Пошук в упорядкованих масивах методом половинного поділу, інтерполяційним методом
Пошук – операція, яка дуже часто здійснюється при роботі з інформацією
У процесі пошуку (вибірки) необхідно знайти один чи декілька елементів, які задовольняють певним вимогам (значенню одного чи декількох ключів)
Під час реалізації пошуку необхідно сприймати до уваги наступне:
для пошуку дуже важливою є швидкість його виконання, алгоритми пошуку мають масштабуватися відповідно до росту обсягів даних;
в окремих випадках доступ до самих даних у процесі виконання пошуку може бути ускладнений(наприклад, недопустимо повільний), тому власне процедура пошуку має здійснюватися у спеціальних допоміжних даних (індексах);
у багатьох випадках пошук здійснюється частіше, ніж додавання нових даних, тому у процесі додавання даних можна здійснювати операції, які полегшують пошук (підтримка індексу);
іноді пошук має здійснюватися за неповним співпаданням з ключем;
іноді результатів пошуку може бути настільки багато, що необхідно знаходити способи впорядкування результатів за значимістю.
Послідовний пошук за допомогою повного перебору елементів
Послідовний пошук за допомогою повного перебору елементів – найпростіша реалізація пошуку, однак вона є і найповільнішою.
В окремих ситуаціях подібна реалізація пошуку є неможливою чи недоцільною.
Підходить для відносно невеликих обсягів даних, які зберігаються в оперативній пам’яті
Приклад реалізації послідовного пошуку повним перебором елементів масиву
class Program
{
struct Student
{
public string Name;
public string Group;
}
static Student[] studArr;
static void InitArray()
{
studArr = new Student[3];
studArr[0] = new Student() {Name = "Іванов", Group = "ЕК-01"};
studArr[1] = new Student() { Name = "Петров", Group = "ЕК-02" };
studArr[2] = new Student() { Name = "Сидоров", Group = "ЕК-03" };
}
static int Find(string Name)
{
for (int i = 0; i < studArr.Length; i++)
{
if (studArr[i].Name == Name)
{
return i;
}
}
return -1;
}
Приклад реалізації послідовного пошуку повним перебором елементів (продовж.)
static void Main(string[] args)
{
InitArray();
Console.WriteLine("Введіть прізвише студента для пошуку");
string NameToFind = Console.ReadLine();
int StudIdx = Find(NameToFind);
if (StudIdx != -1)
{
Console.WriteLine("Студента знайдено: індекс у масиві - {0}, група - {1}", StudIdx, studArr[StudIdx].Group);
}
else
{
Console.WriteLine("Студента не знайдено");
}
Console.ReadLine();
}
}
Пошук шляхом перебору сортованих послідовностей елементів
Послідовний пошук повним перебором елементів у сортованих списках спрощується за рахунок того, що елементи у них впорядковані, і якщо ми здійснюємо пошук у списку, відсортованому у порядку зростання елементів, і зустрічаємо елемент зі значенням ключа більшим, ніж шукаємо, то пошук можна припинити, оскільки елемент знайти вже не вдасться
Відповідно модифікуємо метод Find попереднього прикладу:
4. Двійковий пошук
Якщо пошук необхідно здійснювати у відсортованій послідовності елементів, то значно кращим, ніж послідовний перебір є використання двійкового пошуку
Двійковий пошук суттєво скорочує кількість операцій, які необхідно виконати у процесі пошуку, однак можливий лише для таких структур даних, у яких можливий довільний доступ (наприклад, масиви), однак неприйнятний до структур даних із послідовним доступом (наприклад, зв’язані списки)
Приклад реалізації бінарного пошуку
Приклад реалізації бінарного пошуку (продовж.)
Інтерполяційний пошук
Якщо елементи у впорядкованій послідовності розподілені відносно рівномірно (особливо характерно для великих обсягів даних), то пошук можна істотно пришвидшити завдяки тому, щоб прогнозувати позицію елемента даних
Прогноз можна зробити, виходячи із значення елемента, кількості елементів у діапазоні та значень першого і останнього елемента послідовності
Пошук, оснований на такому підході, має назву інтерполяційного, його можливості і обмеження використання дуже близькі до бінарного, однак на великих наборах даних він може працювати значно швидше
Особливо помітні переваги інтерполяційного пошуку при роботі з даними, розміщеними на повільних носіях даних
Приклад реалізації інтерполяційного пошуку
Слідкуючий пошук
В певних випадках необхідно здійснити пошук декількох елементів у послідовності. Для того, щоб пришвидчити пошук можна скористатися алгоритмами слідкуючого пошуку (hunt search), які дозволяють скористуватись даними попереднього пошуку для здійснення нового пошуку
В найпростішій реалізації слідкуючого пошуку необхідно порівняти елемент, який шукався останнім, із наступним і відповідним чином розпочати новий пошук до чи після нього
В залежності від алгоритму, який використовується, слідкуючий пошук може бути бінарним чи інтерполяційним
7. Реалізація оптимізованого пошуку у впорядкованих текстових даних
Найпростіший прийнятний у більшості випадків варіант для текстових даних – бінарний пошук
Використання інтерполяційного пошуку ускладнено у зв’язку з тим, що у ньому використовуються розрахунки, основані на значеннях елементів, що напряму з текстовими даними зробити неможливо.
Проте інтерполяційний пошук можна реалізувати також і з текстовими даними, однак для цього необхідно використати спеціальні алгоритми, за допомогою яких текстові рядки можна закодувати і отримати числа придатні для розрахунків. Алгоритм кодування має бути таким, щоб отримані числа не були занадто великими для розрахунків, однак відповідали порядку сортування текстових даних