- •Лекція 1. Структури даних. Основні визначення та поняття
- •1.1. Термінологія
- •1.2. Типи даних
- •1.3. Рівні організації даних
- •1.4. Представлення даних
- •1.5. Класифікація структур даних
- •1.6. Основні операції над структурами даних
- •1.7. Документування даних
- •Лекція 2. Алгоритми. Складність алгоритмів.
- •2.1. Зображення алгоритмів
- •2.2. Складність алгоритмів
- •2.3. Класи алгоритмів
- •2.4. Документація алгоритмів
- •Лекція 3. Методи сортування .
- •3.1. Задача сортування
- •3.2.Метод простої вибірки.
- •3.3. Метод бульбашки.
- •3.4.Швидкий метод сортування
- •Лекція 4 методи сортування (продовження)
- •4.5. Сортування включенням
- •4.6. Сортування розподілом
- •4.7. Сортування злиттям або об’єднанням
- •4.8. Сортування підрахунком
- •Лекція 5 нелінійні структури даних
- •5.1. Дерева
- •5.1.1. Бінарні дерева
- •5.1.2. Алгоритм обходу дерева
- •5.1.3. Зображення в пам‘яті комп‘ютера графоподібних структур
- •Лекція 6 методи сортування на деревах
- •6.1. Сортування на деревах
- •6.1.2. Пірамідальне сортування.
- •Питання до першого модуля
- •Тема 1. Основні визначення та поняття. Термінологія. Класифікація структур даних. Основні операції над структурами даних.
- •Тема 2. Поняття алоритму. Зображення алгоритмів. Алгоритмічна складність. Поліноміальна та неполіноміальна складність алгоритмів..
- •Тема 3-4. Алгоритми сортування
- •Тема 5-6. Дерева. Основні визначення та поняття. Бінарні дерева. Зображення в пам‘яті еом графоподібних структур. Алгоритми обходу дерев.Висхідні, нисхідні, змішані алгоритми обходу дерев.
- •Лекція 7. Лінійні структури даних. Стеки, черги і деки.
- •7.1. Стеки
- •7.1.1. Реалізація стеку на базі масиву
- •7.2. Черги
- •7.2.1. Використання черги в програмуванні
- •7.2.2. Реалізація черги на базі масиву
- •7.3. Деки
- •Лекція 8. Лінійні структури даних.
- •8.1. Лінійні списки . Основні визначення та поняття
- •8.2. Однонаправлені списки
- •8.3. Двонаправлені списки
- •8.4. Циклічні списки
- •Лекція 9. Масиви, множини, кортежі
- •9.1. Масиви
- •9.2. Множини I кортежі
- •9.2.1. Реалізація множини
- •9.3. Зберігання множин і масивів
- •9.4. Зберігання розріджених матриць
- •Лекція 10. Нелінійні структури даних
- •10.1. Таблиці
- •10.1.1. Зображення таблиць
- •Лекція 11. Нелінійні структури даних
- •11.1. Спискові структури
- •11.1.1. Ієрархічні списки
- •11.1.2. Організація спискових структур
- •11.2. Сіткові структури
- •Лекція 12 пошук даних.
- •12.1. Послідовний пошук
- •12.2. Двійковий пошук
- •12.2.1. Дерева порівнянь на векторній пам‘яті.
- •12.3. Прямий пошук стрічки
- •12.4. Алгоритм Кнута, Моріса і Прата пошуку в стрічці.
- •12.5. Алгоритм Бойера - Мура пошуку в стрічці
- •12.6. Алгоритми з поверненням
- •Лекція 13 пошук у таблицях
- •13.1. Пошук у таблицях з обчислюваними адресами
- •13.2. Пошук у таблицях з прямим доступом
- •13.3. Пошук у Хеш-таблицях
- •Питання до другого модуля
- •Тема 9 Лінійні списки. Основні визначення та поняття. Однонаправлені списки. Двонаправлені списки. Циклічні списки. Організація списків.
- •Тема 10 Масиви. Множини I кортежі. Зберігання множин і масивів. Зберігання розріджених матриць. Операції з масивами, множинами та кортежами
12.2.1. Дерева порівнянь на векторній пам‘яті.
Розглянемо спочатку, як можна записати дерево у векторну пам‘ять.
Нехай ключі зберігаються у векторі КЛЮЧ(i;j). Елементи у векторній пам‘яті повинні бути впорядкованими за значенням ключів.
При пошуку певного елемента зробимо коренем дерева вмістиме КЛЮЧ(т), де m=[(і+j)/2]- найбільше ціле, менше або рівне (i+j)/2. Тоді ліве піддерево розміщується у векторі КЛЮЧ(i;m-1), а праве - у векторі KЛЮЧ(m+1;j). Цей процес повторюється, доки не буде знайдений потрібний елемент, тобто доки процес не зійдеться у одній вершині, для якої обидва індекси у векторі КЛЮЧ будуть мати однакові значення.
Тоді алгоритм D пошуку ключа К у векторі КЛЮЧ(і;j) можна записати наступною послідовністю кроків:
Алгоритм D
D0. Ініціалізація індексів і, j .
D1. Повторювати кроки D2 - D5 доти, доки i<j.
D2. Обчислення індекcа кореня дерева: m=[(i+j)/2].
D3. Якщо [КЛЮЧ (m)]= К, то REZ= т, кінець.
D4. Інакше: якщо [ КЛЮЧ (т)] <K,
тo і=т +1 (пошук справа); перехід на D2.
D5. Інакше j=m-1 (пошук зліва); перехід на D2;
Основна задача полягає у виключенні на кожному кроці з подальшого пошуку як можна більшої кількості елементів. Оптимальним рішенням буде вибір середнього елемента, оскільки при цьому буде виключена половина кількості елементів. Максимальне число порівнянь дорівнює О(log2 n), де n- кількість елементів даних.
12.3. Прямий пошук стрічки
Нехай задано масив S з n елементів та масив P з m елементів, m<=n. Необхідно знайти перше входження масиву P у масив S . Алгоритм зводиться до повтору порівнянь окремих елементів.
Алгоритм R
R1. Встановити і=1.. n-m, j=1..m.
R2. Якщо S[i] = P[j] , то зафіксувати перше співпадіння k=i, та перевірити співпадіння всього масиву P у масиві S. При першому неспівпадінні відмінити значення k та продовжити пошук.
R3. Кінець.
Кількість порівнянь дорівнює n*m.
Приклад.
Перша ітерація, співпав перший символ ‘a’=’a’:
a c a a b c
a a b
Друга ітерація, неспівпадіння ‘a’!=’c’:
a c a a b c
a a b
Третя ітерація, співпали всі символи масиву Р:
a c a a b c
a a b
12.4. Алгоритм Кнута, Моріса і Прата пошуку в стрічці.
Маємо масив символів S з n елементів (текст) та масив P з m - взірець. Необхідно знайти перше входження взірця в масив. Схема алгоритму полягає у поступовому порівнянні взірця з текстом та зсуву по тексту на кількість співпавших символів у разі знайденого неспівпадіння. Алгоритм використовує просте спостереження, що коли відбувається неспівпадіння тексту і взірця, то взірець містить у собі достатньо інформації для того, щоб визначити де наступне входження може початися, таким чином пропускаючи кількаразову перевірку попередньо порівняних символів. Попередньо проводиться дослідження взірця та визначається максимально можливий зсув взірця по тексту Dmax. Для цього вираховується відстань між однаковими символами у взірці, якщо такі є, інакше Dmax = m .
Алгоритм КМП
КМП 1. Встановити і=0.
КМП 2. j=0, d=1.
КМП 3. Поки j<m, i<n
Перевірка: якщо S[i]=P[j], то d++, i++.j++ поки d != m.
КМП 4. Інакше встановити зсув взірця на d позицій по тексту якщо d <. Dmax , або на Dmax позицій якщо d > Dmax .Перейти на крок КМП 2.
КМП 5. Кінець.
Складність алгоритму становить O(n+m).
Приклад.
abcabdabcabc – текст,
abcabc – взірець, m=6
Dmax=3
Перша ітерація:
abcabdabcabc
abcabc
кількість співпадінь d=5<m, але d > Dmax, тому проводимо зсув взірця на 3 позиції по тексту.
Друга ітерація:
abcabdabcabc
abcabc
кількість співпадінь d=2<m, d <. Dmax, проводимо зсув взірця на 2 позиції по тексту.
Третя ітерація:
abcabdabcabc
abcabc
співпадінь немає, отже d=1, d <. Dmax, проводимо зсув взірця на 1 позицію по тексту.
Четверта ітерація:
abcabdabcabc
abcabc
кількість співпадінь d=6=m. Входження взірця знайдено.
