
- •Лекція 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 кортежі. Зберігання множин і масивів. Зберігання розріджених матриць. Операції з масивами, множинами та кортежами
Лекція 9. Масиви, множини, кортежі
9.1. Масиви
Масив - це набір однотипних елементів даних, з кожним з яких пов'язана впорядкована послідовність цілих чисел, які називають індексами. Індекси однозначно визначають місце даного елемента в масиві і забезпечують прямий доступ до нього. Локалізувати елемент у масиві означає задати його індекс. Кількість індексів визначає розмірність масиву. Кількість елементів визначають розмір масиву.
Розмір і розмірність масиву фіксовані. Найпростіший масив одномірний, його називають також вектором. Двомірний масив - матриця, де кожний елемент b[i,j]належить одночасно двом лінійним ортогональним послідовностям: j-му стовпцю та і-му рядку. Подібну структуру мають також масиви більшої розмірності, тобто кожний індекс масиву визначає одну ортогональну лінійну послідовність так само, як координати точки в багатомірній системі координат.
Універсальні мови програмування (такі як Фортран, Паскаль, С, С++) дають можливість працювати тільки з масивами ортогональної структури. Але ці самі двомірні масиви можуть бути симетричними, діагональними, квазідіагональними, де відмінні від нуля тільки ті елементи bij, для яких j=і або j = i+1 . Трикутні матриці називають тетраедральними. Крім того, існують ще так звані розріджені матриці, в яких багато елементів є нульовими. Такі структури можуть матимасиви різних розмірностей. Кожна з цих структур має свою структуру зберігання в пам'яті комп‘ютера. Як правило, ортогональні багатомірні масиви відображуються у одномірні.
Найбільш поширеними операціями над структурами масивів є:
1) пошук елемента за заданим індексом;
2) локалізація елемента в масиві;
3) запис елемента в масив;
4) злиття масивів і розбиття масиву на частини;
5) сортування елементів масиву за деякими правилами;
6) копіювання масивів.
Найскладнішою є операція локалізації або обчислення індексу елемента по відношенню до першого елемента. Розглянемо модифікації цієї операції для різних типів масивів і способів відображення їх у одномірний масив.
Очевидно, що локалізація елемента вектора не представляє ніяких труднощів, оскільки індекс елемента однозначно визначається його номером у послідовності.
Індекс елемента bij двомірного масиву, що складається із n рядків та т стовпців, при зберіганні в пам'яті комп‘ютера "по стовпцях", обчислюється за формулою(j-1)*n + (i-1) , а при зберіганні його "по рядках" - за формулою (i-1)*m+(j-1).
У загальному випадку для n -мірного масиву, елемент якого позначається В [S1 , ... , Sn ] , а діапазон зміни індексів визначається нерівностями 1 <= Si <= ui , i = 1,n , функція адресації цього масиву при запам'ятовуванні його "по рядках" має вигляд
f (S1 , ... , Sn )= u2 u3… un (S1-1)+ u3 u4… un (S2-1)+…+ un (Sn-1-1)+( Sn-1).
Оперативна пам'ять із погляду програміста - це масив елементів. Будь-який елемент масиву можна прочитати або записати відразу, за одну елементарну дію.Масив можна розглядати як базову структуру даних. Структури даних, у яких можливий безпосередній доступ до довільних їхніх елементів, називають структурами даних із прямим, або з довільним доступом (англійською random access).
З логічної точки зору, масивом є також найважливіша складова комп'ютера - магнітний диск. Елементарною одиницею читання й запису для магнітного диска служить блок. Розмір блоку залежить від конструкції конкретного диска, звичайно він кратний 512. За одну елементарну операцію можна прочитати або записати один блок із заданою адресою.
Отже, найбільш важливі запам'ятовувальні пристрої комп'ютера - оперативна пам'ять і магнітний диск - являють собою масиви. Робота з елементами масиву здійснюється винятково швидко, усі елементи масиву доступні без усяких попередніх дій. Проте масивів недостатньо для написання ефективних програм. Наприклад, пошук елемента в масиві, якщо його елементи не впорядковані, неможливо реалізувати ефективно: не можна винайти нічого кращого, крім послідовного перебору елементів. У випадку впорядкованого зберігання елементів можна використовувати ефективний бінарний пошук, але утруднення виникають при додаванні або видаленні елементів у середині масиву й приводять до масових операцій, тобто операцій, час виконання яких залежить від числа елементів структури. Від цих недоліків вдається позбутися, реалізуючи множину елементів на базі збалансованих дерев або хеш-функцій.
Є й інші причини, за яких необхідно використовувати більш складні, ніж масиви, структури даних. Логіка багатьох задач вимагає організації певного порядку доступу до даних. Наприклад, у випадку черги елементи можна додавати тільки в кінець, а забирати тільки з початку черги; у стеці доступні лише елементи у вершині стека, у списку - елементи до й за вказівником.
Нарешті, масив має обмежений розмір. Збільшення розміру масиву приводить до переписування його вмісту в захоплену область пам'яті більшого розміру, тобто знову ж до масової операції. Від цього недоліку вільні посилальні реалізації структур даних: реалізації на основі лінійних списків або на основі дерев.