You are on page 1of 63

Алгоритми пошуку

Асимптотична складність
Теорія алгоритмів
2
Складність задачі
• Зазвичай під найефективнішим алгоритмом розуміється
найшвидший.
• Складність задачі P – це складність найкращого алгоритму, відомого
для її вирішення

• Час роботи алгоритму зручно виражати у вигляді функції від однієї


змінної, що характеризує розмір індивідуальної задачі - обсяг
вхідних даних, необхідних для опису задачі.

Кафедра СТ. Доцент Ситнікова П. Е.


3
Складність алгоритму
Характеристики алгоритму:
• показують ступінь практичної можливості алгоритмів бути
реалізованим;
• дозволяють порівнювати ефективність різних алгоритмів, які
вирішують одну і ту ж задачу.
Визначення. Кількісна характеристика, що відображає споживані
алгоритмом ресурси, необхідні програмі або алгоритму під час його
виконання (успішного розв’язку задачі), називається складністю
алгоритму.

Кафедра СТ. Доцент Ситнікова П. Е.


4
Характеристики алгоритмів
• Складність алгоритмів вимірюється за необхідними ресурсами, в
основному це тривалість обчислень або необхідний обсяг пам’яті.
Розглядаються основні наступні характеристики:
• Кількість кроків 𝑇𝐴 (𝑥), яке необхідно зробити алгоритму для отримання
результату при використанні вхідних даних x.
• Величина 𝑇 𝐴, 𝑥 = max 𝑇𝐴 (𝑥) (максимум береться за всіма вхідними
𝑥 =𝑛
даним обсягу n) називається часовою складністю алгоритму A.
• Обсяг пам'яті 𝑀𝐴 (𝑥), необхідної для зберігання всіх вхідних і проміжних
даних в процесі виконання алгоритму при використанні вхідних даних x.
• Величина M 𝐴, 𝑥 = max 𝑀𝐴 (𝑥) (максимум береться за всіма вхідними
𝑥 =𝑛
даними обсягу n) називається ємнісною складністю алгоритму A.

Кафедра СТ. Доцент Ситнікова П. Е.


5
Часова складність
• Часова складність часто оцінюється шляхом підрахунку числа
елементарних операцій, що здійснює алгоритм, де елементарна
операція займає для виконання фіксований час.

• Оскільки продуктивність алгоритму може відрізнятися при входах


одного і того ж розміру, як правило використовується часова
складність найгіршого випадку поведінки алгоритму, яка
позначається як T(n) і яка визначається як максимальний час, який
потрібен для будь-якого входу довжини n.

Кафедра СТ. Доцент Ситнікова П. Е.


6
Приклад: знайти максимальний елемент масиву.
Для аналізу цього коду треба поділити його на атомарні операції
(прості інструкції, які будуть виконуватися за однаковий проміжок часу,
на приклад за 1 такт процесора).
До атомарних операцій віднесемо:
• Присвоєння значення
• Доступ до елемента масиву по індексу
• Порівняння двох значень
• Основні арифметичні операції (*, +)

Кафедра СТ. Доцент Ситнікова П. Е.


7
Підрахунок кількості операцій
• Перший рядок містить 2 операції: доступ до
елемента масиву по індексу a[0] та
присвоєння значення max = a[0];
• Ініціалізація циклу потребує 2 операції:
присвоєння і = 0 та порівняння і < n;
• Кожен крок циклу (за умови порожнього
тіла) проводить порівняння і < n та
присвоєння i++ (ще 2n операцій);
• В загальному прохід порожнього циклу
займе 4 + 2*n операцій.
Для циклу for з порожнім тілом
𝑓 𝑛 = 4 + 2𝑛.

Кафедра СТ. Доцент Ситнікова П. Е.


8
Три види випадків
В теорії складність алгоритму характеризують
трьома варіантами вхідних даних:
• найкращий випадок
• середній випадок
• найгірший випадок
Для обраного прикладу найкращий випадок буде
коли максимальний елемент стоїть на першому
місці, а найгірший – масив відсортований по
зростанню (доведеться робити присвоєння на
кожній ітерації).

Кафедра СТ. Доцент Ситнікова П. Е.


9
Складність алгоритму в гіршому та середньому випадках
• Для вирішення задачі для двох вхідних даних x та y однакового
розміру (|x|=|y|) алгоритм може витрачати різний час.
• Для отримання оцінок часової складності в залежності від розміру задачі
визначають її як максимальний час, що витрачається алгоритмом для
вхідних даних довжини n (складність алгоритму в гіршому випадку):
𝑇 𝑛 = max{𝑇 𝑥 : 𝑥 = 𝑛}
• Формально складність в середньому випадку визначається так:
𝑇ср = ෍ 𝑇 𝑥 𝑝(𝑥)

де p(x) – ймовірність появи вхідних даних x, а підсумовування ведеться за


всіма можливими вхідними даними розміру n.
При оцінці складності алгоритму зазвичай розглядають його
складність в гіршому випадку.

Кафедра СТ. Доцент Ситнікова П. Е.


10
Аналіз найгіршого випадку
• Тіло циклу містить 2 операції
(доступ до елемента масиву та порівняння);
Але тіло умови (ще 2 операції) буде
виконуватись не завжди, що ускладнює точну оцінку
кількості операцій;
• В такому разі говорять про найгірший випадок – коли
вважаємо що алгоритм виконує максимально
можливу кількість інструкцій;
Отже тіло циклу в найгіршому випадку виконує 4n
операцій,
Для циклу for з порожнім тілом
𝒇 𝒏 = 𝟒 + 𝟐𝒏.
Загалом 𝒇 𝒏 = 𝟒 + 𝟐𝒏 + 𝟒𝒏 = 𝟔𝒏 + 𝟒.
Кафедра СТ. Доцент Ситнікова П. Е.
11

Арифметична функція 𝑓(𝑥) називається функцією одного верхнього


порядку з функцією 𝑔 𝑥 , що записуємо
𝑓 𝑥 =𝑂 𝑔 𝑥 ,
якщо існує така натуральна константа С і деяке натуральне 𝑁0 , що
𝑓(𝑥) ≤ 𝐶 𝑔 𝑥 для всіх 𝑥 ≥ 𝑁0

Формально 𝑂(𝑓 𝑛 ) означає, що час роботи алгоритму (або обсяг


займаної пам’яті) росте в залежності від обсягу вхідних даних не
швидше, ніж деяка константа, помножена на 𝑓 𝑛 .

Кафедра СТ. Доцент Ситнікова П. Е.


12
Нотація «O» велике
• Часова складність алгоритму зазвичай виражається
з використанням нотації «O» велике.
• Оцінюють не точне значення функції складності 𝑇(𝑛),
а порядок зростання цієї функції, знаходять таку
функцію 𝑓(𝑛), що 𝑇 𝑛 = 𝑂 𝑛 при 𝑛 → ∞.
• Якщо складність виражена таким способом, кажуть
про асимптотичний опис часової складності, тобто
при прямуванні розміру входу до нескінченності.
• Наприклад, якщо час, який потрібно алгоритму для
виконання роботи, для всіх входів довжини n не
перевищує 5n3 + 3n для деякого n, асимптотична
тимчасова складність дорівнює O (n3).

Кафедра СТ. Доцент Ситнікова П. Е.


13
Приклад
• Маємо два алгоритми, оцінки складності яких виражаються
формулами:

• Який з цих алгоритмів краще обрати при великому обсязі вхідних


даних?

Кафедра СТ. Доцент Ситнікова П. Е.


14

Кафедра СТ. Доцент Ситнікова П. Е.


15
Основні класи складності
Клас складності Назва
Асимптотична ефективність. 𝑂(1) Константна складність
Нехай час роботи алгоритму
виражається функцією 𝑓(𝑛) 𝑂(𝑙𝑜𝑔𝑛) Логарифмічна складність
від розміру входу 𝑛. Нас буде 𝑂(𝑛) Лінійна складність
цікавити швидкість росту цієї
функції. 𝑂(𝑛𝑙𝑜𝑔𝑛) n-log-n складність
𝑂(𝑛2) Квадратична складність
𝑂(𝑛3) Кубічна складність
𝑂(2𝑛) Експоненціальна складність
𝑂(𝑛!) Факторіальна складність
Кафедра СТ. Доцент Ситнікова П. Е.
16
Асимптотична складність

𝒇 𝒏 = 𝟔𝒏 + 𝟒 => 𝑓 𝑛 = 𝑂(𝑛)
• Іншими словами асимптотична складність відображає, з якою
швидкістю росте функція 𝑓, якщо 𝑛 прямує до нескінченності.

Кафедра СТ. Доцент Ситнікова П. Е.


17

Знайти асимптотичну складність:


𝑓 𝑛 = 5𝑛 + 12 𝑂(𝑛)
𝑓 𝑛 = 109 𝑂 1
𝑓 𝑛 = 𝑛2 + 3𝑛 + 112 𝑂 𝑛2
𝑓 𝑛 =𝑛+ 𝑛 𝑂 𝑛
𝑓 𝑛 = 𝑛3 + 1999𝑛 + 1337 𝑂 𝑛3

Кафедра СТ. Доцент Ситнікова П. Е.


18
Порівняння класів складності алгоритмів

Кафедра СТ. Доцент Ситнікова П. Е.


19
Порівняння деяких класів складності

Кафедра СТ. Доцент Ситнікова П. Е.


20

Алгоритми пошуку

Кафедра СТ. Доцент Ситнікова П. Е.


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

Кафедра СТ. Доцент Ситнікова П. Е.


22
Види пошуку
Множина з N елементів задано в вигляді масиву a[N].
• Завдання полягає в пошуку елемента a[i], що дорівнює заданому
«аргументу пошуку» (ключу) x.
• Алгоритми пошуку:
• Лінійний пошук;
• Лінійний пошук з бар'єром;
• Двійковий пошук (дихотомічний пошук, пошук розподілом навпіл, бінарний
пошук);
• Інтерполяційний пошук.

Кафедра СТ. Доцент Ситнікова П. Е.


23

Лінійний пошук

Кафедра СТ. Доцент Ситнікова П. Е.


24
Лінійний пошук
Лінійний (послідовний)
пошук застосовується в тому
випадку, якщо невідома
організація даних або дані
невпорядковані. Умови
закінчення пошуку такі:
1) елемент знайдений,
тобто a[i] = x;
2) весь масив
переглянутий, і збіги не
виявлено.

Кафедра СТ. Доцент Ситнікова П. Е.


25
Аналіз середнього випадку
Цільове значення в списку може зайняти будь-яке місце серед N місць,
вважаємо що вони є рівноймовірностними.
Для складності в середньому випадку отримуємо:

𝑁
1 1 𝑁 𝑁+1 𝑁+1
𝑇 𝑁 = ෍𝑖 = ∗ =
𝑁 𝑁 2 2
𝑖=1

Кафедра СТ. Доцент Ситнікова П. Е.


26
Аналіз найгіршого випадку
У алгоритмі послідовного пошуку два найгірших випадки.
• цільовий елемент стоїть у списку останнім;
• його зовсім немає в списку.
Алгоритм проробляє всі порівняння поки не дійде до останнього
елемента. В результаті буде зроблено N порівнянь, де N - число
елементів в списку.

Кафедра СТ. Доцент Ситнікова П. Е.


27
Оцінка складності (лінійний пошук):
Число порівнянь:
• кращий випадок – 1;
• найгірший випадок – N;
• середній випадок - N / 2.
Часова складність: O(N).

Якщо дані не впорядковані, то послідовний пошук є єдиним


можливим методом пошуку !!!

Кафедра СТ. Доцент Ситнікова П. Е.


28
Лінійний пошук
Переваги:
• Не вимагає сортування значень множини.
• Не вимагає додаткового аналізу функції.
• Не вимагає додаткової пам'яті.
Отже, може працювати в потоковому режимі при безпосередньому
отриманні даних з будь-якого джерела.
Недоліки:
• Малоефективний в порівнянні з іншими алгоритмами пошуку.
Отже, використовується, якщо множина містить невелику кількість
елементів.

Кафедра СТ. Доцент Ситнікова П. Е.


29
Лінійний пошук з бар'єром
• В кінець масиву розміщують додатковий
елемент зі значенням x - «бар'єр», який захищає
від виходу за границі масиву.
• У цьому випадку розмір масиву збільшиться на
одиницю: a[N + 1].

Кафедра СТ. Доцент Ситнікова П. Е.


30

Двійковий пошук

Кафедра СТ. Доцент Ситнікова П. Е.


31
Пошук у впорядкованих даних
• Двійковий пошук - метод швидкого пошуку, при якому
упорядкований набір даних розділяється на дві частини і операція
порівняння завжди виконується для середнього елемента списку:
після порівняння одна половина списку відкидається і операція
виконується для половини, і т.д.
• Загальний алгоритм двійкового пошуку
(пошук розподілом навпіл, бінарний пошук, дихотомічний пошук ):
• вибрати випадковим чином певний елемент 𝑎[𝑚], і порівняти його з
аргументом пошуку 𝑥.
• якщо 𝑎[𝑚] = 𝑥, то пошук закінчується;
• якщо 𝑎[𝑚] > 𝑥, то продовжуємо шукати x в лівій від 𝑎[𝑚] частини масиву;
• якщо 𝑎[𝑚] < 𝑥, то продовжуємо шукати x в правій від 𝑎[𝑚] частини масиву.

Кафедра СТ. Доцент Ситнікова П. Е.


32
Двійковий пошук
Алгоритм:
1. Визначимо 𝐿 і 𝑅 як ліву і праву межу інтервалу пошуку відповідно.
2. Виберемо m, що лежить посередині між 𝐿 і 𝑅.
3. Порівняємо 𝑥 з елементом масиву 𝑎[𝑚]; якщо вони рівні, то
алгоритм завершено, інакше виконуємо крок 4.
4. Якщо 𝑥 > 𝑎[𝑚], то змінюємо ліву межу інтервалу: 𝐿 = 𝑚 + 1,
інакше змінюємо праву межу інтервалу: 𝑅 = 𝑚 − 1.
5. Якщо інтервал порожній, тобто 𝐿 ≤ 𝑅, йдемо на крок 2.

Кафедра СТ. Доцент Ситнікова П. Е.


33
Алгоритм бінарного пошуку

Кафедра СТ. Доцент Ситнікова П. Е.


34
Алгоритм бінарного пошуку

Кафедра СТ. Доцент Ситнікова П. Е.


35
Алгоритм бінарного пошуку

Кафедра СТ. Доцент Ситнікова П. Е.


36
Алгоритм бінарного пошуку

Кафедра СТ. Доцент Ситнікова П. Е.


37
Алгоритм бінарного пошуку

Кафедра СТ. Доцент Ситнікова П. Е.


38
Двійковий пошук
• Вибір m довільний в тому сенсі, що
коректність алгоритму від нього не
залежить. Однак вибір m впливає на
ефективність алгоритму.
• Оптимальне рішення - вибір
середнього елемента, так як при цьому
в будь-якому випадку буде
виключатися половина інтервалу.

Кафедра СТ. Доцент Ситнікова П. Е.


39
Аналіз найгіршого випадку
• Яка максимальна кількість порівнянь для цього алгоритму потрібна
для перевірки всього масиву? Якщо ми почнемо з масиву який
𝑛
містить n елементів, близько елементів залишиться після першого
2 𝑛 𝑛 𝑛
порівняння. Після другого порівняння буде близько . Потім , і так
4 8 16
далі.
• Коли цикл закінчиться, ми отримуємо масив, в якому є тільки один
елемент. Або це шуканий елемент, або шуканого елемента немає.
Кількість порівнянь, необхідних для досягнення цієї точки, так само 𝑖,
𝑛
де 𝑖 = 1. Тобто 𝑖 = log 2 𝑛
2

Кафедра СТ. Доцент Ситнікова П. Е.


40
Оцінка складності (двійковий пошук):
Число порівнянь:
• кращий випадок – 1;
• найгірший випадок – log 2 𝑛;
• середній випадок - 𝑙𝑜𝑔2 𝑛 + 1 − 1

Часова складність: 𝐎(𝒍𝒐𝒈𝟐 𝒏).

Двійковий пошук можливий тільки у впорядкованому масиві

Кафедра СТ. Доцент Ситнікова П. Е.


41
Залежність кількості порівнянь від об'єму масиву

Кафедра СТ. Доцент Ситнікова П. Е.


42
Інтерполяційний пошук
• Лінійна інтерполяція

Кафедра СТ. Доцент Ситнікова П. Е.


43
Інтерполяційний пошук
• Інтерполяційний пошук від двійкового
пошуку відрізняється лише вибором m.
Якщо закон зростання елементів масиву
лінійний (𝑎[𝑚] ≈ 𝑘𝑚 + 𝑏), то індекс m
визначається зі співвідношення:
𝑦 − 𝑎[𝐿] 𝑚−𝐿
=
𝑎 𝑅 − 𝑎[𝐿] 𝑅 − 𝐿

𝑦−𝑎 𝐿
𝑚=𝐿+ (𝑅 − 𝐿)
𝑎 𝑅 −𝑎 𝐿

• Інтерполяційний пошук працює так само, як і


двійковий, тобто алгоритм і блок-схеми всюди,
крім вибору m, залишаються без змін.

Кафедра СТ. Доцент Ситнікова П. Е.


44
Приклад. Шукаємо число 55

𝑦−𝑎 𝐿
• 𝑚=𝐿+ (𝑅 − 𝐿)
55−1 𝑎 𝑅 −𝑎 𝐿
1. 𝑚 = 1 + 70−1
20 − 1 ≈ 16
• y – елемент, який шукається
2. 𝑎[16] = 54 • m - індекс елемента
3. 55 > 54 • L, R – лівий та правий індекси
4. 𝐿 = 17, 𝑅 = 20 частини масиву, у якій іде
55−55 пошук
5. 𝑚 = 17 + 20 − 17 ≈ 17
70−55 • a[R], a[L] – значення елементів
6. 𝑎[17] =55 масиву з відповідними
7. Кінець індексами

Кафедра СТ. Доцент Ситнікова П. Е.


45
Часова складність
• Інтерполяційний пошук асимптотично краще бінарного;
• По суті, один крок бінарного пошуку зменшує кількість
"підозрюваних" записів від n до n/2, а один крок інтерполяційного -
від n до 𝑛. В середньому інтерполяційний пошук вимагає
𝐥𝐨𝐠 𝟐 𝐥𝐨𝐠 𝟐 𝒏 кроків.

Кафедра СТ. Доцент Ситнікова П. Е.


46

Пошук підрядка в рядку

Кафедра СТ. Доцент Ситнікова П. Е.


47
Пошук підрядка в рядку
• Пошук заданої підпослідовності в
тексті (масиві).
S[7]
• Нехай заданий рядок S з N
елементів і рядок Р з M
елементів: S[N], P[M]. P[3]

• Завдання пошуку підрядка P в рядку S полягає в знаходженні першого


зліва входження P в S, тобто знайти значення індексу i, починаючи з
якого: S[i]=P[0], S[i+1]=P[1], ..., S[i+M-1]=P[M- 1]
• Алгоритми пошуку:
• прямий пошук;
• алгоритм Кнута, Мориса і Пратта;
• алгоритм Боуера і Мура.

Кафедра СТ. Доцент Ситнікова П. Е.


48
Пошук підрядка в рядку.
Прямий пошук
• Встановити i на початок рядка S,
тобто i = 0.
• Перевірити, чи не вийшло i+M за
границю N рядка S. Якщо так, то
алгоритм завершено (входження
немає).
• Починаючи з i-го символу s,
провести посимвольне порівняння
рядків S і Р, тобто S[i] і P[0], S[i+1] і
P[1], ..., S[i+M-1] і P[M-1].
• Якщо хоча б одна пара символів не
збіглася, то збільшити i та повторити
крок 2, інакше алгоритм
завершений (входження знайдено).

Кафедра СТ. Доцент Ситнікова П. Е.


49

Використовується додаткова змінна flag, яка явно


змінює своє значення з 0 (false) на 1 (true) при
виявленні входження зразка P в текст S
Складність: (N-M+1)*M
Кафедра СТ. Доцент Ситнікова П. Е.
50

Кафедра СТ. Доцент Ситнікова П. Е.


51

КМП алгоритм
Кнута Морріса і Пратта
(Knuth-Morris-Pratt algorithm)

Кафедра СТ. Доцент Ситнікова П. Е.


52
Терміни
• Довжина рядка - кількість символів в рядку

• Підрядок (образ) - це послідовність поспіль символів в рядку.

• Префікс - це підрядок, що починається з першого символу рядка.

• Суфікс - це підрядок, що закінчується на останній символ рядка.


Префікс та суфікс можуть бути максимальною довжиною на 1 символ
менше довжини рядка

Кафедра СТ. Доцент Ситнікова П. Е.


53
Алгоритм Кнута, Морріса і Пратта
На відміну від прямого пошуку індекс порівнюваного елемента не
відкатується назад.
Етапи КМП алгоритму
1. Формування масиву , що використовується при зсуві образу по
рядку
2. Пошук образа в рядку.

Кафедра СТ. Доцент Ситнікова П. Е.


54
Формування масиву 
Префікс-функція для i-го
значення образа вертає
значення, що дорівнює
максимальній довжині
співпадаючих перфікса і суфікса
підрядка в образі, що
закінчується i-м символом
Це значення зберігається в
елементі [i]
Складність етапу 𝑂 𝑛 , де 𝑛 –
довжина образу

Кафедра СТ. Доцент Ситнікова П. Е.


55

Кафедра СТ. Доцент Ситнікова П. Е.


56

Кафедра СТ. Доцент Ситнікова П. Е.


57
Складність алгоритму КМП
Загальна складність алгоритму 𝑶 𝒏 + 𝒎
де 𝑛- довжина рядка
𝑚- довжина образу

Порівняйте зі складністю прямого пошуку 𝑶 𝒏 ∙ 𝒎

Кафедра СТ. Доцент Ситнікова П. Е.


58

Алгоритм Бойєра — Мура —


Хорспула

Кафедра СТ. Доцент Ситнікова П. Е.


59
Алгоритм Бойєра-Мура-Хорспула
Етапи алгоритму:
1. Формування таблиці d, що використовується при зсуві образу по
рядку
2. Пошук образу в рядку

Кафедра СТ. Доцент Ситнікова П. Е.


60

1. В таблицю заносяться значення, що відповідають відстані символу від кінця


образу.
• Якщо символ зустрічається декілька разів, то пишеться найкоротша відстань.
2. Для символу в кінці образу записується значення, що дорівнює довжині образу
(якщо той символ не зустрічався в образі).
3. Для символів, що відсутні в образі, будемо застосовувати значення, що
дорівнює довжині образу

Кафедра СТ. Доцент Ситнікова П. Е.


61

Кафедра СТ. Доцент Ситнікова П. Е.


62

Кафедра СТ. Доцент Ситнікова П. Е.


63
Оцінка складності (алгоритм Боуера-Мура):
Число порівнянь:
• кращий випадок – 𝑀/𝑁 (напр., рядок 1111…1, підрядок 000…0;
• найгірший випадок – 𝑁 ∗ 𝑀 (рядок 1111…1, підрядок 0111…1);
• середній випадок - 𝑀/ Σ
Σ - кількість символів у рядку і підрядку
Часова складність: 𝐎(𝒏𝟐 ).

Кафедра СТ. Доцент Ситнікова П. Е.

You might also like