- •0Міністерство освіти і науки, молоді та спорту україни
- •«Теорія алгоритмів» Методичні вказівки
- •2.1 Види алгоритмів
- •2.2 Організація лінійних алгоритмів .
- •2.3 Організація розгалужень в са
- •2.4 Організація циклів.
- •Розділ 3. Моделі обчислень
- •3.1 Скінченний автомат, як модель перетворювача дискретної інформації
- •3.2 Визначення та властивості скінченого автомату
- •3.3 Автомат Мілі
- •3.4 Автомат Мура
- •3.5 Машина Тюрінга.
- •3.5.1 Історія
- •3.5.2 Визначення машини т.
- •3.5.3 Можливості машини Тюрінга
- •3.5.4 Приклади
- •4.1 Необхідність структурування даних. Поняття Структури даних
- •4.2 Послідовне і зв’язне розподілення даних в пам’яті еом.
- •4.2.2 Зв'язаний розподіл в пам'яті.
- •4.3 Лінійні та нелінійні структури даних.
- •4.3.1 Лінійні струтури даних
- •Однозв'язні списки
- •Двохзв'язні списки
- •4.3.2 Нелінійні структури даних
- •4.4 Статичні структури даних.
- •4.5 Уявлення в пам’яті машини множин; операції над множинами. Уявлення графів. Дерева і бінарні дерева. Характеристики дерев. Ліс. Уявлення бінарних дерев. Перехід від дерева до бінарного дерева.
- •4.5.1 Множини. Опис множин, операції над множинами.
- •4.5.2 Поняття графа як структури даних.
- •Застосування графів
- •4.5.3 Поняття дерева як структури даних
- •4.5.4 Бінарне дерево
- •Перехід від дерева до бінарного дерева
- •4.6 Порядок обходу вузлів дерева: обернений і внутрішній. Властивості обходу вузлів дерева: прямий, обернений і внутрішній. Властивості обходу дерев. Порядок та властивості обходу дерева.
- •5.1 Предмет теорії комбінаторних алгоритмів (обчислювань)
- •5.2 Правила множення і суми для знаходження
- •5.3 Види задач підрахунку числа елементів множин
- •1. Метод рекурентних співвідношень.
- •2. Метод включення і виключення.
- •5.4 Елементи комбінаторики. Набори: набори з повторюванням; специфікація набору
- •Розділ 6 Ефективність алгоритмів
- •6.1. Характеристики алгоритмів.
- •6.2 Ємна та часова складність. Поліноміальна зв’язність.
- •6.3 Класи p та np
4.3.2 Нелінійні структури даних
В теорії графів та інформатиці граф — це сукупність об'єктів із зв'язками між ними.
Об'єкти розглядаються як вершини, або вузли графу, а зв'язки — як дуги, або ребра. Для різних областей використання види графів можуть відрізнятися орієнтовністю, обмеженнями на кількість зв'язків і додатковими даними про вершини або ребра.
Велика кількість структур, які мають практичну цінність в математиці та інформатиці, можуть бути представлені графами. Наприклад, будову Вікіпедії можна змоделювати за допомогою орієнтованого графу, в якому вершини — це статті, а дуги (орієнтовані ребра) — посилання на інші статті.
Дерево (англ. tree) — в інформатиці та програмуванні одна з найпоширеніших структур даних. Формально дерево визначається як скінченна множина Т з однієї або більше вершин (вузлів, nodes), яке задовольняє наступним вимогам:
існує один виокремлений вузол — корінь (root) дерева
інші вузли (за виключенням кореня) розподілені серед m ≥ 0 непересічних множин T1…Tm і кожна з цих множин в свою чергу є деревом. Дерева T1…Tm мають назву піддерев (subtrees) даного кореня.
4.4 Статичні структури даних.
Статичні структури відносяться до розряду непримітивних структур, які, фактично, є структурованою безліччю примітивних, базових, структур.
Вектор (одновимірний масив) - структура даних з фіксованим числом елементів одного і того ж типа типа. Кожен елемент вектора має унікальний в рамках заданого вектора номер. Звернення до елементу вектора виконується по імені вектора і номеру необхідного елементу.
Машинне представлення. Адресація елементів структур.
Елементи вектора розміщуються в пам'яті в підряд розташованих елементах пам'яті. Під елемент вектора виділяється кількість байт пам'яті, визначуване базовим типом елементу цього вектора. Необхідне число байтів пам'яті для зберігання одного елементу вектора називається слотом. Розмір пам'яті для зберігання вектора визначається твором довжини слота на число елементів.
У мовах програмування вектор представляється одновимірним масивом з синтаксисом опису вигляду (PASCAL):
< Ім'я > : array [n..k] of < тип >;
де n-номер першого елементу, до-номер останнього елементу.
У мовах, де пам'ять розподіляється до виконання програми на етапі компіляції (C, PASCAL, FORTRAN), при описі типа вектора граничні значення індексів повинні визначені. У мовах, де пам'ять може розподілятися динамічно (ALGOL, Pl/1), значення індексів можуть бути задані під час виконання програми.
Кількість байтів безперервної області пам'яті, зайнятих одночасно вектором, визначається по формулі:
Bytesise = ( до - n + 1 ) * Sizeof (тип)
Звернення до i-тому елементу вектора виконується за адресою вектора плюс зсув до даного елементу. Зсув i-ого елементу вектора визначається по формулі:
Bytenumer = ( i- n ) * Sizeof (тип)
а адреса його: @ Bytenumber = @ ім'я + Bytenumber.
де @ ім'я - адреса першого елементу вектора.
Наприклад:
var Мas: array [ 5..10 ] of word.
Базовий тип елементу вектора - Word вимагає 2 байти, тому на кожен елемент вектора виділяється по два байти.
Масив - така структура даних, яка характеризується:
фіксованим набором елементів одного і того ж типа;
кожен елемент має унікальний набір значень індексів;
кількість індексів визначають мірна масиву, наприклад, два індекси - двовимірний масив, три індекси - тривимірний масив, один індекс - одновимірний масив або вектор;
звернення до елементу масиву виконується по імені масиву і значенням індексів для даного елементу.
Інше визначення: масив - це вектор, кожен елемент якого - вектор.
Синтаксис опису масиву представляється у вигляді:
< Ім'я > : Array [n1..k1] [n2..k2] .. [nn..kn] of < Тип >.
Для випадку двовимірного масиву:
Mas2d : Array [n1..k1] [n2..k2] of < Тип >, або
Mas2d : Array [n1..k1, n2..k2] of < Тип >
Наочно двовимірний масив можна представити у вигляді таблиці з (k1-n1+1) рядків і (k2-n2+1) стовпців.
Безліч - така структура, яка є набором даних одного і того ж типа, що не повторюються. Безліч може набувати всіх значень базового типа. Базовий тип не повинен перевищувати 256 можливих значень. Тому базовим типом безлічі можуть бути byte, char і похідні від них типи.
Фізична структура.
Безліч в пам'яті зберігається як масив бітів, в якому кожен біт вказує чи є елемент таким, що належить оголошеній безлічі чи ні. Т.ч. максимальне число елементів безлічі 256, а дані типа безліч можуть займати не більш 32 байт.
Число байтів, що виділяються для даних типа безліч, обчислюється за формулою: Bytesize = (max div 8)-(min div 8)+ 1, де max і min - кордони верху і нижньої базового типа даної безлічі.
Номер байта для конкретного елементу Е обчислюється за формулою:
Bytenumber = (E div 8)-(min div 8)
номер біта усередині цього байта по формулі:
Bitnumber = E mod 8
Запис - кінцева впорядкована безліч полів, що характеризуються різним типом даних. Записи є надзвичайно зручним засобом для представлення програмних моделей реальних об'єктів наочної області, бо, як правило, кожен такий об'єкт володіє набором властивостей, що характеризуються даними різних типів.
Приклад запису - сукупність відомостей про деякого студента.
Об'єкт "студент" володіє властивостями:
"особистий номер" - характеризується цілим позитивним числом
"прізвище-ім'я-по батькові" - характеризується рядком символів і так далі.
Коли йшлося про записи, було відмічено, що полями запису можуть бути інтегровані структури даних - вектори, масиви, інші записи. Аналогічно і елементами векторів і масивів можуть бути також інтегровані структури. Одна з таких складних структур - таблиця. З фізичної точки зору таблиця є вектором, елементами якого є записи. Характерною логічною особливістю таблиць є те, що доступ до елементів таблиці виробляється не по номеру (індексу), а по ключу - за значенням однієї з властивостей об'єкту, що описується записом-елементом таблиці. Ключ - це властивість, що ідентифікує даний запис в безлічі однотипних записів. Як правило, до ключа пред'являється вимога унікальності в даній таблиці. Ключ може включатися до складу запису і бути одним з її полів, але може і не включатися в запис, а обчислюватися по положенню запису. Таблиця може мати один або декілька ключів. Наприклад, при інтеграції в таблицю записів про студентів (опис запису приведений в п.3.5.1) вибірка може вироблятися як по особистому номеру студента, так і по прізвищу.
Основною операцією при роботі з таблицями є операція доступу до запису по ключу. Вона реалізується процедурою пошуку. Оскільки пошук може бути значно ефективнішим в таблицях, впорядкованих по значеннях ключів, досить часто над таблицями необхідно виконувати операції сортування. Ці операції розглядаються в наступних розділах даної глави.
Інколи розрізняють таблиці з фіксованою і із змінною довжиною запису. Вочевидь, що таблиці, об'єднуючі записи абсолютно ідентичних типів, матимуть фіксовані довжини записів. Необхідність в змінній довжині може виникнути в завданнях, подібних тим, які розглядалися для записів з варіантами. Як правило таблиці для таких завдань і складаються із записів з варіантами, тобто зводяться до фіксованої (максимальною) довжини запису. Значно рідше зустрічаються таблиці з дійсно змінною довжиною запису. Хоча в таких таблицях і економиться пам'ять, але можливості роботи з такими таблицями обмежені, оскільки по номеру запису неможливо визначити її адресу. Таблиці із записами змінної довжини обробляються лише послідовно - в порядку зростання номерів записів. Доступ до елементу такої таблиці зазвичай здійснюється в два кроки. На першому кроці вибирається постійна частина запису, в якому міститься, - в явному або неявному вигляді - довжина запису. На другому кроці вибирається змінна частина запису відповідно до її довжини. Додавши до адреси поточного запису її довжину, отримують адресу наступного запису.
Так таблиця із записами змінної довжини може, наприклад, розглядатися в деяких завданнях програмованих в машинних кодах. Кожна машинна команда - запис, складається з одного або декількох байт. Перший байт - завжди код операції, кількість і формат решти байтів визначається типом команди. Процесор вибирає байт за адресою, що задається програмним лічильником, і визначає типа команди. За типом команди процесор визначає її довжину і вибирає останні її байти. Вміст програмного лічильника збільшується на довжину команди.
