- •Основні положення теорії алгоритмів та її застосування
- •Введення до теорії алгоритмів
- •Загальні риси алгоритмів
- •Машина Поста
- •Машина т’юринга
- •Основи лямбда-числення та функціонального програмування
- •Теза Черча-т’юринга про алгоритмічну розв’язність задачі
- •Проблема розв’язності (зависання)
- •Алгоритмічно нерозв’язні задачі
- •Проблема відсутності загального методу вирішення задачі
- •Проблема інформаційної невизначеності задачі
- •Проблема логічної нерозв’язності задачі
- •Побудова машини т’юринга для обчислення деяких простих функцій
- •Введення до оцінки складності алгоритмів
- •Визначення порядку складності алгоритму
- •Оптимізація алгоритмів
- •Структури даних в алгоритмічній мові програмування
- •Визначення алгоритмічної мови програмування
- •Базові елементи сучасної мови програмування: типи даних; екземпляри даних; вирази; оператори; функції; класи.
- •Поняття типу даних
- •Прості типи: числові; символьні; логічні.
- •Тип даних рядок
- •Структуровані типи даних: масиви, записи, множини
- •Типи даних за значенням і за посиланням
- •Сумісність типів та перетворення між типами даних
- •Екземпляри даних: змінні, константи
- •Видимість даних
- •Управління ходом виконання та структурування програм в алгоритмічній мові програмування
- •Вирази, операнди та операції
- •Основні операції: арифметичні; логічні; бульові; з використанням рядків
- •Поняття оператора
- •Прості оператори: присвоювання; виклику функції
- •Оператори управління ходом виконання: розгалуження; вибору; цикли; переходу
- •Структурування програм: функції та класи
- •Параметри функцій: вхідні, результуючі.
- •Рекурсивні функції
- •Файли: текстові, бінарні
- •Алгоритми чисельних методів, апроксимації функцій, інтегрування та вирішення рівнянь з одним невідомим
- •Чисельні методи
- •Особливості вирішення задач чисельними методами, точність та коректність рішень
- •Апроксимації функцій: лінійна інтерполяція; інтерполяційний многочлен Ньютона.
- •Чисельне інтегрування: метод трапецій; метод Сімпсона; метод Сімпсона з оцінкою погрішності.
- •Вирішення рівнянь з одним невідомим: метод простих ітерацій; метод Ньютона; метод парабол.
- •Алгоритми вирішення системи лінійних рівнянь, пошуку екстремуму функції
- •Вирішення системи лінійних рівнянь методом Гауса
- •Пошук екстремуму функцій одної змінної: метод золотого перетину; метод парабол.
- •Пошук екстремуму функцій багатьох змінних: метод координатного спуску; метод найскорішого спуску.
- •Алгоритми обробки масивів
- •Визначення масивів
- •Операції над масивами
- •Упорядкування масивів: сортування вибором; сортування вставкою; бульбашкове сортування; сортування методом Шелла; метод швидкого сортування.
- •Вибір методів сортування
- •Пошук в упорядкованих масивах методом половинного поділу, інтерполяційним методом
- •Застосування індексів для пошуку у невпорядкованих даних
- •Алгоритми обробки даних на основі списків та дерев
- •Визначення списку
- •Види списків: незалежні списки, однозв’язані списки; двозв’язані списки; кільцеві списки; упорядковані списки
- •Основні операції над списками: включення елементу до списку; видалення елементу; перехід між елементами; ітератор для списку
- •Упорядкування та пошук в списках
- •Похідні структури даних: черга, стек, дек
- •Визначення дерева
- •Впорядковані дерева
- •Бінарні дерева
- •Основні операції з бінарними деревами: включення елементу; видалення елементу; обхід дерева
- •Балансування дерева
- •Алгоритми обробки текстових даних на основі регулярних виразів
- •Введення до теорії кінцевих автоматів
- •Графічне представлення кінцевих автоматів
- •Використання кінцевого автомату: синтаксичний аналіз.
- •Реалізація синтаксичного аналізу файлу з розділяючими комами
- •Детерміновані та недетерміновані кінцеві автомати
- •Регулярні вирази
- •Форма Бекуса-Наура для запису регулярних виразів
- •Синтаксичний аналіз регулярних виразів
- •Компіляція регулярних виразів
- •Інструменти для спрощення роботи з регулярними виразами
- •Зіставлення рядків з регулярними виразами.
- •Алгоритми систем числення
- •Введення до систем числення
- •Двійкова система числення
- •Шістнадцяткова система числення
- •Системи числення з нетрадиційними основами
- •Перетворення між різними системами числення
- •Арифметика чисел з плаваючою комою
- •Точність операцій з плаваючою комою
- •Арифметика великих чисел
- •Алгоритми криптографії та хешування
- •Значення випадкових чисел у програмуванні
- •Алгоритми генерації рівномірно розподілених псевдовипадкових чисел
- •Перевірка якості випадкових чисел
- •Кодування з виправленням помилок
- •Стиснення даних
- •Стиснення даних зі словником
- •Алгоритм стиснення даних Лемпела-Зіва
- •Введення до криптографії
- •Елементи теорії порівнянь
- •Алгоритми цифрового підпису
- •Введення до хешування
- •Функції хешування
- •Проста функція хешування рядків
- •Шифрування за допомогою випадкових чисел
- •Створення таємного ключа по Діффі-Хеллману
- •Система rsa
- •Функції хешування з використанням рандомізації
- •Вирішення конфліктів за допомогою лінійного зондування
- •Псевдовипадкове зондування
- •Подвійне хешування
Загальні риси алгоритмів
Дискретність. Алгоритм – процес послідовної побудови об’єктів, який відбувається у дискретному часі таким чином, що в початковий момент задається вихідний набір об’єктів, а в кожен наступний момент часу згідно з певним законом (програмою) отримується новий набір об’єктів. Таким чином, виконання кожного алгоритму відбувається покроково і кожен крок обов’язково закінчується.
Детермінованість (визначеність) – в кожен момент часу наступний крок роботи однозначно визначається станом системи, таким чином, алгоритм видає одну і ту ж відповідь для одних і тих же вихідних даних. Проте існують ймовірності алгоритми, в яких результат залежить від значення випадкового числа.
Зрозумілість – алгоритм формулюється мовою, яка зрозуміла виконавцеві, тобто в записі алгоритму присутні лише ті команди, які входять в систему команд виконавця.
Завершеність – при коректно введених вихідних даних алгоритм має закінчувати роботу і видавати результат за кінцеву кількість кроків.
Масовість – алгоритм має використовуватися для різних вихідних даних.
Алгоритми можуть бути рекурсивними, ітеративними, паралельними.
В залежності від вихідних даних алгоритми можуть бути застосовними чи незастосовними до них.
Машина Поста
Машина Поста – розроблена у 1936 році математиком Емілєм Постом абстрактна машина, яка формально визначає алгоритм.
Машина Поста складається з необмеженої в обидва боки стрічки, розділеної на гнізда, послідовно пронумеровані цілими числами, як позитивними, так і негативними. У кожнім гнізді стрічки стоїть ознака того, що в гнізді записана мітка або гніздо порожнє. Стан стрічки — це дані, які гнізда зайняті, а які порожні.
Крім стрічки є головка читання/запису, яка уміє рухатися вперед, назад і стояти на місці; уміє читати вміст, стирати й записувати мітку; управляється програмою, у яку можуть входити в будь-якій комбінації й будь-якій кількості шість команд:
вправо;
уліво;
поставити мітку;
стерти мітку;
передача керування на один номер команди в програмі, якщо в поточнім гнізді є мітка; якщо мітки ні, те передача керування на інший номер команди;
припинення роботи.
Машина т’юринга
Формальні визначення алгоритму з'явилися в тридцятих-сорокових роках 20 століття. Одним із перших було визначення англійського математика Алан Тюринга, який в 1936 році описав схему деякої гіпотетичної (абстрактної) машини і запропонував називати алгоритмами те, що вміє робити така машина. При цьому визначенні, якщо щось не може бути зроблено машиною Тюринга, це вже не алгоритм.
Інакше кажучи, Тюринг формалізував правила виконання дій за допомогою опису роботи деякої конструкції.
Маши́на Тю́ринга — математичне поняття, введене для формального уточнення інтуітивного поняття алгоритму. Названа на честь англійського математика Алана Тюринга, який і запропонував це поняття в 1936. Аналогічну конструкцію машини згодом і незалежно від Тюринга ввів американський математик Еміль Пост.
Формальні визначення алгоритму з'явилися в тридцятих-сорокових роках 20 століття. Одним із перших було визначення англійського математика Алан Тюринга, який в 1936 році описав схему деякої гіпотетичної (абстрактної) машини і запропонував називати алгоритмами те, що вміє робити така машина. При цьому визначенні, якщо щось не може бути зроблено машиною Тюринга, це вже не алгоритм. Інакше кажучи, Тюринг формалізував правила виконання дій за допомогою опису роботи деякої конструкції.
У кожної машини Тюринга є стрічка, потенційно нескінчена в обидві сторони. Є скінчена множина символів стрічки S0, …, Sn, що називається алфавітом машини. У кожний момент часу кожна комірка може бути зайнята не більш ніж одним символом. Машина має деяку скінчену множину внутрішніх станів q0, q1, …, qn. У кожний даний момент часу машина знаходиться в тільки одному із цих станів.
Нарешті, є голівка, яка у кожний даний момент часу знаходиться на одній із комірок стрічки. Машина діє не безупинно а лише в дискретні моменти часу. Якщо в якійсь момент t голівка сприймає комірку (тобто знаходиться на комірці), що містить символ Si, і машина знаходиться у внутрішньому стані qj, то дія машини визначена, і однією із чотирьох дій:
голівка стирає символ S, і записує в тій же комірці новий символ Sk,
голівка пересувається в сусідню ліву комірку,
голівка пересувається в сусідню праву комірку,
машина зупиняється.
У випадках (1)-(3) машина переходить у новий внутрішній стан qr, і готова знову до дії в такий момент t + 1. Будемо припускати, що символ S0 представляє порожню комірку, і отже, голівка завжди сприймає деякий символ.
Перші три з можливих дій машини можуть бути описані відповідно такими упорядкованими четвірками, які ми надалі будемо називати командами:
Тут перші два символа — це відповідно внутрішні стани машини і сприйнятий символ, наступні три визначають дію машини (запис голівкою символу Sk, або переміщення голівки на одну комірку вліво, або переміщення голівки на одну комірку вправо) та новий стан машини. Якщо стрічка вкладена в машину Тюринга, голівка машини встановлена на одну із комірок стрічки і машина приведена в один із своїх внутрішніх станів, то машина починає оперувати на стрічці: її голівка пише і стирає символи і пересувається з однієї комірки в іншу. Якщо при цьому машина колись зупиняється, то стрічка, яка знаходиться в ній в цей момент, називається результатом застосування машини до даної стрічки.
Незважаючи на свій простий устрій, машина Тюринга може виконувати складні перетворення слів. Спочатку, коли стрічка містить вхідне слово, автомат знаходиться проти деякої з комірок і у якомусь стані. У залежності від вибору початкової комірки, утворяться різні результати роботи машини Тюринга. У процесі своєї роботи машина Тюринга буде ніби перестрибувати з однієї комірки програми на іншу, відповідно до інформації на стрічці і вказівками в командах програми, поки не дійде до команди, яка переведе автомат у кінцевий стан.
Розглянемо приклад простої машини Т’юринга.
Допустимо, ми маємо унарну систему числення:
Для якої описана наступна машина Т’юринга:
Пояснення: перша цифра (не виділена) зліва від стрілки означає стан, у якому машина знаходиться, а справа – стан, у який вона має перейти.
Виділена цифра зліва від стрілки – символ на стрічці, який в даний момент часу зчитує пристрій. Вона заміняє цей символ виділеною цифрою справа від стрілки.
R – означає, що пристрій має переміститися вздовж стрічки вправо, а L – вліво, STOP – зупинитися.
Навіщо потрібна дана машина?
Запустимо машину на наступній стрічці (початковий стан «0» і починає виконуватися з крайньої лівої позиції стрічки):
(Представлене на стрічці число представляє собою десяткове число «чотири»).
Розглянемо покрокове виконання машини:
Машина зчитує «0», оскільки вона знаходиться у стані «0», то виконується наступна інструкція: , тобто машина записує на стрічку «0», переходить у стан «0» і переходить по стрічці вправо.
…
Машина зчитує «1», оскільки вона знаходиться у стані «0», то виконується наступна інструкція: , тобто машина записує на стрічку «1», переходить у стан «1» і переходить по стрічці вправо.
Машина зчитує «1», оскільки вона знаходиться у стані «1», то виконується наступна інструкція: , тобто машина записує на стрічку «1» переходить у стан «1» і переходить по стрічці вправо.
…
Машина зчитує «0», оскільки вона знаходиться у стані «1», то виконується наступна інструкція: , тобто машина записує на стрічку «1», переходить у стан «0» і зупиняється.
Який буде результат на стрічці?
Можливості машини Т’юринга
Описуючи різноманітні алгоритми для машин Т’юринга і стверджуючи реалізованість усіляких композицій алгоритмів, Т’юринг переконливо показав розмаїтість можливостей запропонованої їм конструкції, що дозволило йому виступити з такою тезою:
Всякий алгоритм може бути реалізований відповідною машиною Тюринга.
Це основна гіпотеза теорії алгоритмів у формі Т’юринга. Одночасно ця теза є формальним визначенням алгоритму. Завдяки їй можна доводити існування або неіснування алгоритмів, створюючи відповідні машини Т’юринга або доводячи неможливість їхньої побудови. Завдяки цьому з'являється загальний підхід до пошуку алгоритмічних рішень.
Якщо пошук рішення наштовхується на перешкоду, то можна використовувати цю перешкоду для доведення неможливості рішення, спираючись на основну гіпотезу теорії алгоритмів. Якщо ж при доказі неможливості виникає своя перешкода, то вона може допомогти просунутися в пошуку рішення, хоча б частково усунувши стару перешкоду. Так, по черзі намагаючись довести то існування, то відсутність рішення, можна поступово наблизитися до розуміння суті поставленної задачі.
Довести тезу Тюринга не можна, тому що в його формулюванні не визначене поняття всякий алгоритм, тобто ліва частина тотожністі. Його можна тільки обґрунтувати, представляючи різноманітні відомі алгоритми у вигляді машин Тюринга. Додаткове обґрунтування цієї тези складається в тому, що пізніше було запропоновано ще декілька загальних визначень поняття алгоритму і щораз вдавалося довести, що, хоча нові алгоритмічні схеми і виглядають інакше, вони в дійсності еквівалентні машинам Тюринга:
усе, що реалізовано в однієї з цих конструкцій, можна зробити й в інших
Ці твердження доводяться строго, тому що в них мова йде вже про тотожність формальних схем.
