- •Лекція 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 кортежі. Зберігання множин і масивів. Зберігання розріджених матриць. Операції з масивами, множинами та кортежами
7.1.1. Реалізація стеку на базі масиву
Реалізація стеку на базі масиву є класикою програмування. Іноді навіть саме поняття стеку не цілком коректно ототожнюється із цією реалізацією.
Базою реалізації є масив розміру N. Таким чином реалізується стек обмеженого розміру, максимальна глибина якого не може перевищувати N. Індекси елементівмасиву змінюються від 0 до N - 1. Елементи стеку зберігаються в масиві в такий спосіб: елемент на дні стеку розташовується на початку масиву, тобто в елементі з індексом 0. Елемент, розташований над самим нижнім елементом стеку, зберігається в елементі з індексом 1, і так далі. Вершина стеку зберігається десь у середині масиву. Індекс елемента на вершині стеку зберігається в спеціальній змінній, яку звичайно називають вказівником стеку (англійською Stack Pointer або просто SP).
Коли стек порожній, вказівник стеку містить значення мінус одиниця. При включенні елемента вказівник стеку спочатку збільшується на одиницю, потім у елемент масиву з індексом, що зберігається в вказівнику стеку, записується елемент, що включається. При видаленні елемента зі стеку спершу вміст елементамасиву з індексом, що зберігається у вказівнику стеку, запам'ятовується в тимчасовій змінній у якості результату операції, потім вказівник стеку зменшується на одиницю.
У наведеній реалізації стек росте убік збільшення індексів елементів масиву. Часто використовується інший варіант реалізації стеку на базі вектора, коли дностеку міститься в останньому елементі масиву, тобто в елементі з індексом N - 1. Елементи стеку займають безперервний відрізок масиву, починаючи із елемента, індекс якого зберігається у вказівнику стеку, і закінчуючи останнім елементом масиву. У цьому варіанті стек росте убік зменшення індексів. Якщо стек порожній, то вказівник стеку містить значення N , яке на одиницю більше, ніж індекс останнього елемента масиву).
7.2. Черги
Черга - це лінійна динамічно змінювана послідовність елементів, у якій виконуються такі умови:
1) новий елемент приєднується завжди з одного і того ж боку послідовності;
2) доступ до елементів aбo їх виключення завжди здійснюється з другого боку послідовності.
Наприклад, нехай послідовність Q=Q1... ,Qn зображує чергу. Тоді елемент Q1, називають "головою" черги і він вказує на місце для виключення елемента; а елемент Qn називають "хвостом" черги і він вказує на місце для включення елемента в чергу.
Чергу можна представити у вигляді трубки. В один кінець трубки можна додавати кульки — елементи черги, з іншого кінця вони видаляються. Елементи в середині черги, тобто кульки усередині трубки, недоступні. Кінець трубки, у який додаються кульки, відповідає кінцю черги, кінець, з якого вони видаляються — початку черги. Таким чином, кінці трубки не симетричні, кульки усередині трубки рухаються тільки в одному напрямку.
Отже, в структурі черг потрібні два вказівники: один - для посилання на вершину послідовності (для включення елемента), другий - для посилання на основу послідовності (для виключення елемента). При кожному виключенні елемента із такої структури виключається завжди найстаріший елемент. Черги обслуговуються за дисципліною FIFO - "перший прийшов, перший пішов".
Черги бувають різних типів: лінійні, з пріоритетом і циклічні. Звичайна лінійна черга може бути зображена масивом, з двома вказівниками: перший вказує на елемент для вибірки з черги, другий - на останній елемент, записаний у чергу. Багаторазове звертання до елементів лінійної черги призводить до того, що пам'ять для зберігання такої черги використовується неефективно. У лінійній черзі після вибірки елемента пам'ять, зайнята чергою, звільняється і повторно не використовується, оскільки нові елементи приписуються з іншого краю послідовності.
Чергу, для якої є можливість включати або виключати елементи з певної позиції в залежності від деяких її характеристик називають пріоритетною чергою. Прикладом пріоритетної черги може служити порядок розв'язування потоку задач на комп‘ютері у деяких операційних системах . Така черга зводиться до послідовності лінійних черг, якщо відомі пріоритети її елементів. Кожна черга з послідовності обслуговується за дисципліною FIFO , але елементи з другої черги обслуговуються тільки тоді, коли порожня попередня черга, а з третьої тоді, коли порожні перша і друга черги. При включенні елементи приєднуються до боку однієї з черг згідно з їх пріоритетом.
Черги, в яких елементи Q1 ,Q2, …,Qn розміщуються так, що за елементом Qn іде елемент Q1 називаються циклічними (рис. 7.1). Циклічну чергу також можна зобразити лінійною послідовністю, але при записі нового елемента на відміну від лінійної черги вся послідовність зсувається на одне поле і новий елемент записується знову на її початку. Вибірка елемента буде також виконуватися за вказівником на кінець послідовності.
Рис.7.1. Графічне зображення циклічної черги
Прикладом циклічної черги може служити робота обчислювальної системи з розподілом часу, з якою одночасно працює багато користувачів. Оскільки така система має переважно один блок обробки, що називають процесором, і одну пам'ять, то в кожний момент часу ці ресурси належать одному користувачу. Для кожного користувача виділяється певний інтервал часу. Тільки на відміну від пріоритетної черги одна задача до кінця не розв'язується, а "порціями" протягом виділеного їй інтервалу часу. Програми, що чекають на виконання, утворюють циклічну чергу.
