You are on page 1of 38

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

ЛЕКЦІЯ 1

Вступна лекція

Валенда Н.А.
Кафедра Програмної інженерії,
факультет КН, ХНУРЕ

1
Зміст лекції:

• Цілі та завдання курсу


• Основні поняття та визначення
• Вимоги до алгоритму
• Способи подання алгоритму
• Структури даних
• Аналіз алгоритмів

2
Метою дисципліни "Алгоритми та структури даних" є
вивчення методів побудови алгоритмів та аналіз їх
ресурсних характеристик. У курсі розглядаються такі
питання: основні структури даних, зв'язок структур даних та
алгоритмів, базові алгоритми для вирішення типових
завдань, оцінка складності алгоритмів

Після вивчення дисципліни студенти мають знати:

• фундаментальні алгоритми (сортування, пошук, алгоритми на


графах);
• методи оцінки та порівняння алгоритмів;
• базові структури даних;
• роль структур даних при розробці алгоритму.

3
Література

• Томас Х. Кормен, Чарльз І. Лейзерсон, Рональд Л. Рівест,


Кліффорд Штайн
• Алгоритми: побудова та аналіз

• Лафоре, Р. Структури даних та алгоритми в Java

• Р. Седжвік Фундаментальні алгоритми на С++

• Ахо, Хопкрофт, Ульман Структури даних та алгоритми

• З.В. Дудар, О.В. Вечур, О.Л. Лещинська Олімпіадні задачі з


програмування за матеріалами Зимової школи

4
Термін – алгоритм
• Походження терміна «алгоритм» пов'язано з математикою. Це
слово походить від Algorithmi – латинського написання імені
Мухаммеда аль-Хорезмі (787 – 850) видатного математика
середньовічного Сходу. У своїй книзі "Про індійський рахунок"
він сформулював правила запису натуральних чисел за
допомогою арабських цифр та правила дій над ними
стовпчиком. У XII ст. було виконано латинський переклад його
математичного трактату, з якого європейці дізналися про
десяткову позиційну систему числення та правила арифметики
багатозначних чисел. Саме ці правила тоді називали
алгоритмами.
• Надалі алгоритмом стали називати точне розпорядження, що
визначає послідовність дій, що забезпечує отримання
необхідного результату.

5
Поняття алгоритму
• «Алгоритм — точний припис про виконання у певному порядку
деякої системи операцій, які ведуть до вирішення всіх завдань
цього типу». (М.М. Розенталь)

Вимоги до алгоритму:

• Наявність вхідних та вихідних даних


• Алгоритм повинен описуватися формальною мовою, що
виключає неоднозначність тлумачення приписів (мова
програмування)
• Множина інструкцій кінцева
• Запис алгоритму формальною мовою називається програмою

6
Властивості алгоритмів
• Дискретність - алгоритм будується з окремих кроків (інструкцій,
дій, команд). Множина кроків, з яких складено алгоритм, кінцева.

• Результативність – алгоритм має закінчуватися після виконання


кінцевого числа кроків (інструкцій).

• Масовість – алгоритм розв'язання задачі має бути застосований


для деякого класу задач, що відрізняються лише значеннями
вхідних даних

• Детермінованість (визначеність) – кожен крок алгоритму має


бути точно визначено. У кожен час наступний крок роботи
однозначно визначається станом системи. Детермінованість
забезпечує однаковість результату, одержуваного при
багаторазовому виконанні алгоритму, на тому самому наборі
вхідних даних
7
Подання алгоритму
• Блок-схема - поширений тип схем (графічних моделей), що описують
алгоритми або процеси, в яких окремі кроки зображуються у вигляді
блоків різної форми, з'єднаних між собою лініями, що вказують напрям
та послідовності дій.

Наименование Обозначение

Блок начало-конец

Блок вычислений

Логический блок (блок условия)

Предопределённый процесс

Данные
(ввод-вывод)

Граница цикла

Соединитель

Комментарий Пример блок-схемы


алгоритма вычисления 8
факториала числа N
Подання алгоритму
Псевдокод — компактна мова опису алгоритмів, що використовує
ключові слова мови програмування, але опускає несуттєві подробиці та
специфічний синтаксис. Псевдокод зазвичай опускає деталі, несуттєві
розуміння алгоритму людиною. Такими несуттєвими деталями можуть
бути описи змінних, системно-залежний код та підпрограми. Головна
мета використання псевдокоду — забезпечити розуміння алгоритму
людиною, зробити опис більш сприйманим, ніж вихідний код мовою
програмування. Псевдокод широко використовується у підручниках та
науково-технічних публікаціях, а також на початкових стадіях розробки
програм.

Базові структури, що використовуються в псевдокоді:


• присвоєння, введення, виведення
• розгалуження
• цикл

9
Структури даних
Структури даних – це спосіб організації даних у пам'яті
комп'ютера (наприклад – масиви, списки, стеки, дерева
тощо)

Абстрактний тип даних (АТД) – це тип даних, який надає


для роботи з елементами цього типу певний набір
функцій, а також можливість створювати елементи цього
типу за допомогою спеціальних функцій. Уся внутрішня
структура такого типу захована від розробника — у цьому
полягає суть абстракції. Абстрактний тип даних визначає
набір незалежних від конкретної реалізації типу функцій
оперування його значеннями. Конкретні реалізації АТД
називають структурами даних.

10
Структури даних

Лінійні структури даних(Linear data structures)

– Масив (Array)
– Список (List)
• Зв'язаний список (Linked list)
– Хеш-таблиця (Hash table)
– Дек (Deque) — двозв'язкова черга
– Стек (Stack, LIFO — Last in, first out)
– Черга (Queue, FIFO — First in, first out)
• Черга з пріоритетом (Priority queue)

11
Структури даних
• Граф (Graph)
– Список ребер (Adjacency list)
– Дерева
• 2-3-дерево
• Дерево відрізків
• BSP-дерево
• Двійкове дерево пошуку (Binary search tree)
– Дерево пошуку, що самобалансується (Self-balancing binary search
tree)
» АВЛ-дерево (AVL tree)
» Червоно-чорне дерево (Red-black tree)
» Дерево, що розширюється (Splay tree)
• Купа (Heap)
– Двійкова купа (Binary heap)
– Біноміальна купа (Binomial heap)
– Фібоначчієва купа (Fibonacci heap)
• Дерево розбору (Parse tree)
• Інші структури даних
– Об'єднання (Union)
– Таблиця (Table) 12
Показники ефективності алгоритмів

Часова ефективність - визначається кількістю операцій,


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

Просторова ефективність - визначається обсягом


споживаної пам'яті, відображуе максимальну кількість
пам'яті, необхідну для роботи алгоритму.

Показники ефективності дозволяють

• порівнювати алгоритми
• оцінювати потреби алгоритмів у обчислювальних
ресурсах

13
Аналіз алгоритмів
• Аналіз алгоритмів – теоретичне дослідження
продуктивності алгоритмів та споживаних ними ресурсів.

• Для більшості алгоритмів кількість операцій


безпосередньо залежить від розміру вхідних даних.

• Швидкодія - час роботи алгоритму, залежно від обсягу


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

• Швидкодія задається функцією Т(n),


де n – обсяг вхідних даних

14
Лінійний пошук
public int LinearSearch(int[] array, int x)
{
for (int index = 0; index < array.Length; index++)
{
if (array[index] == x)
{
return index;
}
}
return NotResult; Кількість виконань циклу?
}
11 разів

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2 3 8 15 23 27 33 40 51 66 68 71 79 85 86 90 92 98 99 100

15
Двійковий пошук
int low, high, mid;
low = 0;
high = array.Length - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (x < array [mid])
high = mid - 1;
else if (x > array [mid])
low = mid + 1;
else Кількість виконань циклу?

return mid;
}
return -1;
0 }1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
16
2 3 8 15 23 27 33 40 51 66 68 71 79 85 86 90 92 98 99 100
Двійковий пошук
1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2 3 8 15 23 27 33 40 51 66 68 71 79 85 86 90 92 98 99 100

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2 3 8 15 23 27 33 40 51 66 68 71 79 85 86 90 92 98 99 100

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2 3 8 15 23 27 33 40 51 66 68 71 79 85 86 90 92 98 99 100

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2 3 8 15 23 27 33 40 51 66 68 71 79 85 86 90 92 98 99 100

17
Покроковий метод аналізу алгоритму

• Записується алгоритм на псевдокоді.


• Кожному кроку алгоритму надається ваговий
коефіцієнт
• Підраховується кількість виконань кожного кроку
• Функція Т(n) є сумою кроків, де ваговий коефіцієнт
кроку помножено на кількість виконань

18
Лінійний пошук
код кількість
повторень
for (int index = 0; index < array.Length; index++) n+1
{
if (array[index] == x) n
{
return index; 1
}
}
return NotResult; 1

T(n)= n+1+n+1+1=2*n+3

19
Двійковий пошук
код кількість
повторень
while (low <= high) log n
{
mid = (low + high) / 2; log n -1
if (x < array [mid]) log n -1
high = mid - 1;
else if (x > array [mid]) log n -1
low = mid + 1; log n -1
else 1
return mid; 1
}
return -1; 1

T(n)= 5*log n - 4+3= 5*log n - 1 20


Порівняння швидкості пошуку

T(n)=2*n+3

T(n)=5*log n - 1

21
Види аналізу

• Найгірший випадок: T(n) – максимальний час для будь-


яких вхідних даних розміру n.

• Середній випадок: T(n) – очікуваний час для будь-яких


вхідних даних розміру n.

• Найкращий випадок – мінімальний час роботи

22
Сортування вибором

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

• i-й (i=0) елемент оголошується мінімальним, його індекс


записується в змінну min
• A[min] порівнюється з іншими елементами масиву, якщо
знаходимо елемент менший за A[min], його індекс зберігається в
min і переходимо до наступного елементу
• A[min] та A[i] міняємо місцями
• i++ та алгоритм повторюється

23
Сортування вибором

6, 5, 3, 4, 11
3, 5, 6, 4, 11
3, 4, 6, 5, 11
3, 4, 5, 6, 11
3, 4, 5, 6, 11

24
Сортування вибором

for(i=0; i < n-1; i++) {


min = i ;
for ( j = i+1; j <= n-1; j++ )
if (a[ j ] < a [min ])
min = j;
k = a[ i ];
a[ i ] = a[ min ];
a[ min ] = k;
}

25
Сортування вибором

for(i=0; i < n-1; i++) { с1 n


min = i ; с2 n-1

for ( j = i+1; j <= n-1; j++ ) с3

if (a[ j ] < a [min ]) с4

min = j; с5

k = a[ i ]; с6 n-1

a[ i ] = a[ min ]; с7 n-1

a[ min ] = k; с8 n-1

26
Арифметичні прогресії

(1  n)n
i0 ti  n  (n  1)  (n  2)  ...  2  2  1
n 1

n(n  1)
i 0 (ti  1)  (n  1)  (n  2)  ...  1  2
n 1

27
Оцінка складності
T (n)  c1* n  c 2 * (n  1)  c3 * i 0 ti  (c 4  c5) *
n 1


n 1
i 0
(ti  1)  (c6  c7  c8) * (n  1) 
 n(1  n)   n(n  1) 
c1* n  c 2 * (n  1)  c3 *   1  (c 4  c5) *  
 2   2 
 (c6  c7  c8) * (n  1) 
 n  n2   n2  n 
c1* n  c 2 * (n  1)  c3 *   1  (c 4  c5) *   
 2   2 
c3 c 4 c5
(c6  c7  c8) * (n  1)  (c1  c 2     c6  c7  c8) * n 
2 2 2
(c3  c 4  c5) 2
* n  (c 2  c3  c6  c7  c8)  a * n 2  b * n  c
2
28
Види аналізу

Найгірший випадок : T(n)=1.5*n2+4.5*n - 5

Найкращий випадок: T(n)=n2+5*n – 5

29
Порівняння швидкодії алгоритмів

30
Асимптотичні позначення

У теорії обчислювальної складності алгоритмів


для вказівки меж функції T(n) використовуються
асимптотичні позначення Ɵ(тета велике), O(о
велике), Ω (велике омега)

31
Межі функції Т(n)

32
Асимптотична функція Ɵ

Нехай f (n) - це кількість операцій, що виконуються алгоритмом,


g(n) – це асимтотична оцінка для функції f (n), позначаеться як

f(n)= Ɵ(g(n)).

Якщо виконуються наступні умови:

Функція f (n) обмежена знизу та зверху функцією g(n) з


точністю до постійного множника.
33
Асимптотична функція Ɵ

34
Асимптотична функція О
Нехай f (n) - це кількість операцій, що виконуються алгоритмом,
f(n)= О(g(n)),
якщо виконуються наступні умови:

Існують константи с>0 та n0 є


{0,1,2,…} такі, що f(n)≤cg(n) для
усіх n≥n0.
Функція f (n) обмежена зверху
функцією g(n) з точністю до
постійного множника.

Використовується, щоб показати,


що час роботи алгоритму зростає
35
не швидше, ніж g (n).
Асимптотична оцінка

f(n)=1/2n2-3n
Доведемо, що g(n)=n2 є асимптотичною оцінкою f(n)
f(n)=θ(n2)
1 2
0  C1 * n 2  n  3n  C 2 * n 2
2
1 3
0  C1    C 2
2 n
При С2= 1/2 нерівність буде виконуватись (n→∞)
n0 = 7, так як n = 6 брати не можна (С1 і С2> 0)
C1 = 1/14, С2 = 1/2 з виразу - 1/2-3/7 = 1/14.

Твердження вірне

36
Асимптотична оцінка

f(n)=6n3
Доведемо, що g(n)=n2 є асимптотичною оцінкою f(n)
f(n)=θ(n2)
0  C1n 2  6n 3  C 2 n 2

0  C1  6n  C2

Припущення помилково т.к. не виконується умова 6n  C2

37
Найбільш розповсюджені асимптотичні функції

38

You might also like