You are on page 1of 27

Алгоритми та структури даних

Лекція 1
Вступ. Поняття алгоритму.
Прості методи сортування.
Аналіз алгоритмів.

доц. Лавренюк А.М.


Список основної літератури
⚫ Кормен Т. Х., Лейзерсон Ч. И., Ривест Р.Л., Штайн К.
Алгоритмы: построение и анализ.
⚫ Седжвик Р. Фундаментальные алгоритмы на С++. Части 1-4.
Анализ/Структуры данных/Сортировка/Поиск.
⚫ Седжвик Р. Фундаментальные алгоритмы на С++. Ч 5.
Алгоритмы на графах.
⚫ Кнут Д.Э. Искусство программирования, том 1. Основные
алгоритмы.
⚫ Кнут Д.Э. Искусство программирования, том 2. Получисленные
методы.
⚫ Кнут Д.Э. Искусство программирования, том 3. Сортировка и
поиск.
⚫ Вирт Н. Алгоритмы + структуры данных = программы.
⚫ Вирт Н. Алгоритмы и структуры данных.
⚫ Мальцев А.И. Алгоритмы и рекурсивные функции.
Список додаткової літератури

⚫ Ахо А.В., Хопкрофт Д.Э., Ульман Д.Д. Структуры данных и


алгоритмы.
⚫ Гудман С., Хидитниеми С. Введение в разработку и анализ
алгоритмов.
⚫ Турский В. Методология программирования.
⚫ …
Поняття алгоритму
Алгоритм (algorithm) — це формально описана
обчислювальна процедура, яка отримує вхідні дані (input),
що називаються входом алгоритму або його аргументом, і
видає результат обчислень на вихід (output).

Таким чином, алгоритм являє собою набір інструкцій, які описують


порядок дій, що перетворюють вхідні величини на вихідні.

Алгоритми будують для розв’язання тих чи інших обчислювальних


задач (computational problems). У постановці задачі у загальних
рисах задається взаємодія між входом і виходом. В алгоритмі
описується конкретна обчислювальна процедура, за допомогою
якої вдається домогтися виконання зазначених взаємодій.
Поняття алгоритму
Наприклад, відсортувати послідовності чисел в неспадному
порядку.
Задача сортування (sorting problem) формально визначається
наступним чином.
Вхід: послідовність з n чисел (а1, a2, ..., аn).
Вихід: перестановка (зміна порядку) (a1’, a2’, …, an’) вхідної
послідовності таким чином, що для її членів виконується
співвідношення a1’ ≤ a2’ ≤ … ≤ an’.

Наприклад, якщо на вхід подається послідовність


(31, 41, 59, 26, 41, 58),
то результат алгоритму сортування повинен бути таким:
(26, 31, 41, 41, 58, 59).
Поняття алгоритму
Алгоритм вважається коректним (correct), якщо для
будь-якого допустимого входу він закінчує роботу і
видає результат, який задовольняє вимогам задачі.
В цьому випадку говорять, алгоритм розв'язує
дану обчислювальну задачу. Якщо алгоритм
некоректний, то для деяких входів він може взагалі
не завершити свою роботу або видати неправильну
відповідь.
Алгоритм може бути задано українською або
англійською мовою, у вигляді комп'ютерної
програми або навіть в машинних кодах – важливо
лише, щоб процедура обчислень була чітко
описана.
Поняття алгоритму

Властивості алгоритмів
⚫ скінченність: алгоритм є скінченним об'єктом, що є
необхідною умовою його механічної реалізованості,
алгоритм має завжди завершуватись після
виконання скінченної кількості кроків;
⚫ масовість: початкові дані для алгоритму можна
вибирати із певної (можливо, нескінченної)
множини даних; це означає, що алгоритм
призначений не для однієї конкретної задачі, а для
класу однотипних задач;
⚫ дискретність: розчленованість процесу виконання
алгоритму на окремі кроки; це означає, що
алгоритмічний процес здійснюється в дискретному
часі;
Поняття алгоритму

Властивості алгоритмів
⚫ елементарність: кожен крок алгоритму має бути
простим, елементарним, можливість виконання
якого людиною або машиною не викликає сумнівів;
⚫ детермінованість: однозначність процесу
виконання алгоритму; це означає, що при заданих
початкових даних кожне дане, отримане на
певному (не початковому) кроці, однозначно
визначається даними, отриманими на попередніх
кроках;
⚫ результативність: алгоритм має засоби, які
дозволяють відбирати із даних, отриманих на
певному кроці виконання, результативні дані, після
чого алгоритм зупиниться.
Сортування вставками
Insertion sort

Рис. Виконання алгоритму Insertion_sort над масивом


А=<5,2,4,6,1,3>
Сортування вставками

Елементи в чорних рамках — посортована частина списку. Метод


порівнює наступний елемент непосортованої частини (червона
рамка) з послідовними елементами посортованої та вставляє у
потрібне місце.
Сортування вставками
Insertion-Sort (A)
1 for j ← 2 to length [A]
2 do key ← A[j]
3 //додати A[j] до відсортованої частини A[1..j-1].
4 i ← j-1
5 while i>0 and A [i]>key
6 do A[i+1] ← A [i]
7 i ← i-1
8 A[i+1] ← key
Ділянка А[1. . j-1] містить вже відсортовані елементи, а А[j+1. .n] — ще не
переглянуті. У циклі for індекс j пробігає масив зліва направо. Беремо
елемент A [j] (рядок 2 алгоритму) і пересуваємо ті елементи, що йдуть перед
ним і більші за нього по величині (починаючи з (j-1)-го), вправо, звільняючи
місце для взятого елементу (рядки 4-7). У рядку 8 елемент A[j] поміщається в
звільнене місце.
Аналіз алгоритмів

Сортування вставками: аналіз


Час сортування вставками залежить від розміру
сортованого масиву: чим більший масив, тим
більше може знадобитися часу. Зазвичай вивчають
залежності часу роботи від розміру входу. (Втім,
для алгоритму сортування вставками важливий не
лише розмір масиву, але й порядок його елементів:
якщо масив майже впорядкований, то часу
потрібно менше.)
Аналіз алгоритмів
Сортування вставками: аналіз
Часом роботи (running time) алгоритму називаємо кількість
елементарних кроків, які він виконує. Вважатимемо, що один
рядок псевдокоду вимагає не більше фіксованої кількості
операцій. Розрізнятимемо також виклик (call) процедури (на
який припадає фіксована кількість операцій) і її виконання
(execution), яке може бути довгим.
Позначимо біля кожного рядка його вартість (кількість
операцій) і кількість разів, яку цей рядок виконується. Для
кожного j від 2 до n (тут n = length[A] — розмір масиву)
підрахуємо, скільки разів буде виконаний рядок 5, і позначимо
це число через tj . (Відмітимо, що рядки усередині циклу
виконуються на один раз менше, ніж перевірка, оскільки
остання перевірка виводить з циклу.)
Аналіз алгоритмів
Insertion-Sort (A) вартість кількість разів
1 for j ← 2 to length [A] с1 n

2 do key ← A[j] с2 n-1

3 //додати A[j] до відсортованої частини A[1..j-1]. 0 n-1

4 i ← j -1 с4 n-1

5 while i>0 and A [i]>key с5 ∑nj=2 tj

6 do A[i+1] ← A [i] с6 ∑nj=2 (tj -1)

7 i ← i -1 с7 ∑nj=2 (tj -1)

8 A[i+1] ← key с8 n-1


Аналіз алгоритмів

Рядок вартості c, повторений т разів, дає внесок cm у загальну кількість


операцій. Склавши внески всіх рядків, отримаємо:

T ( n ) = c1n +c2 ( n − 1) +c4 ( n − 1) +c5  t j +c6  (t j − 1) +c7  (t j − 1) +c8 ( n − 1)


n n n

j=2 j=2 j=2

Для процедури Insertion-Sort найбільш сприятливий випадок, коли масив


вже відсортований. Тоді цикл в рядку 5 завершується вже після
першої перевірки (оскільки А [i] ≤ key при i = j - 1), так що всі tj рівні
1, і загальний час є

T ( n ) = c1n+c2 ( n − 1) +c4 (n − 1) +c5 (n − 1) +c8 (n − 1) = (c1 +c2 +c4 +c5 +c8 ) n − (c2 +c4 +c5 +c8 )

T ( n ) = an +b - лінійна функція від n


Аналіз алгоритмів
Якщо ж масив розташований в зворотному (такому, що убуває)
порядку, час роботи процедури буде максимальним: кожен
елемент A[j] доведеться порівняти зі всіма елементами
А[1], ..., A[j - 1]. При цьому tj = j. Оскільки
n
n ( n + 1) n
n ( n − 1)

j=2
j=
2
−1 
j=2
( j − 1) =
2
отримуємо, що у найгіршому випадку час роботи процедури дорівнює

 n ( n +1)   n ( n − 1)   n ( n − 1) 
T ( n ) = c1n + c2 ( n − 1) + c4 ( n − 1) + c5  − 1 + c6   + c7  +
 2   2   2 
c c c   c c c 
+c8 ( n − 1) =  5 + 6 + 7  n 2 +  c1 + c2 + c4 + 5 − 6 − 7 + c8  n − ( c2 + c4 + c5 + c8 )
2 2 2  2 2 2 

T ( n ) = an 2 +bn + c - Квадратична функція від n


Аналіз алгоритмів
Порядок зростання
Час роботи процедури Insertion-Sort у найгіршому випадку має
порядок зростання (rate of growth, order of growth) n².

T(n) = Θ(n²)

Алгоритм з меншим порядком зростання часу роботи зазвичай


кращий: якщо один алгоритм має час роботи ( n )
2

а інший — ( n 3 ) , то перший ефективніший (принаймні для


достатньо довгих входів).
Сортування методом вибору
Даний метод сортування передбачає наступні дії:

⚫ Масив переглядається перший раз, знаходиться


мінімальний елемент цього масиву, який міняється
місцями з першим елементом.

⚫ Другий раз масив переглядається, починаючи з


другого елементу. Знову знаходиться мінімальний
елемент, який міняється місцями з другим елементом
масиву.

⚫ Даний процес виконується до тих пір, поки не буде


поставлено на місце N-1 елемент.
Сортування методом вибору
Дано масив з п’яти елементів :

1.Шукаємо мінімальний елемент й обмінюємо його з елементом, який


знаходиться на першому місці .В даному випадку міняємо місцями
елементи 11 та 64. Результат:

2. Повторюємо процес із другої позиції нашого масиву,тобто з елемента 25,


і знайдений елемент 12 обмінюємо з другим елементом масиву. Результат:

3.Повторюємо дії,аналогічні п.1.,п.2, та отримуємо повністю впорядкований


масив:
Сортування методом вибору
Фактично ми ділимо масив на дві частини:
перша (ліва) — повністю відсортована
(елементи знаходяться вже в своїй кінцевій
позиції), а друга (права) — ні

Час роботи алгоритму сортування вибором:

T(n) = Θ(n²)
Початковий масив 44 55 12 42 94 18 06 67

06 55 12 42 94 18 44 67

06 12 55 42 94 18 44 67

06 12 18 42 94 55 44 67

06 12 18 42 94 55 44 67

06 12 18 42 44 55 94 67

06 12 18 42 44 55 94 67

06 12 18 42 44 55 67 94
Метод бульбашкового сортування

Метод "бульбашкового сортування" ґрунтується


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

Розглянемо масив чисел

51428

За допомогою даного алгоритму, відсортуємо


його від найменшого до найбільшого елементу.
На кожному кроці елементи, виділені жирним
шрифтом, будуть порівнюватись.
Метод бульбашкового сортування
Перший прохід:
( 5 1 4 2 8 ) -> ( 1 5 4 2 8 ) Перші два елементи порів. і міняються місцями.
( 1 5 4 2 8 ) -> ( 1 4 5 2 8 ) міняються місцями 5 і 4
( 1 4 5 2 8 ) -> ( 1 4 2 5 8 ) міняються місцями 5 і 2
( 1 4 2 5 8 ) -> ( 1 4 2 5 8 ) 5 і 8 залишаються на своїх місцях
Другий прохід:
( 1 4 2 5 8 ) -> ( 1 4 2 5 8 )
( 1 4 2 5 8 ) -> ( 1 2 4 5 8 )
( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
Тепер масив повністю відсортований, однак алгоритм цього ще не знає.
Йому потрібен ще один "пустий" прохід, під час якого він не поміняє
місцями жодного елементу.
Третій прохід:
( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
( 1 2 4 5 8 ) -> ( 1 2 4 5 8 ) Масив відсортовано, і алгоритм може
припинити свою роботу.
Метод бульбашкового сортування
В результаті першого проходу найбільше число буде
поставлене в кінець масиву.
У другому проході такі операції виконуються над
елементами з першого до (N-1)-ого, у третьому - від
першого до (N-2)-ого і т.д.
Метод бульбашкового сортування

Впорядкування масиву буде закінчено, якщо


при проході масиву не виконається жодної
перестановки елементів масиву.
Факт перестановки фіксується за допомогою
деякої змінної, яка на початку має значення 0 і
набуває значення 1 тоді, коли виконається
перестановка в якій-небудь парі.
Час роботи алгоритму сортування вибором:
T(n) = Θ(n²)
БАЖАЮ УСПІХІВ!!!

You might also like