
- •Затверджено на засіданні
- •Редактор л.М. Тонкошкур
- •1. Введення в теорію алгоритмів.
- •2. Складність алгоритмів.
- •3. Структури даних.
- •3.1 Статичні та динамічні структури даних.
- •3.2. Стеки
- •3.3. Списки.
- •Блок-схема програми
- •3.4. Черги.
- •Блок-схема програми
- •3.5 Графи.
- •3.6. Дерева.
- •4. Методи побудови ефективних алгоритмів
- •4.1 Метод «розподіляй та володій».
- •Способ 1. Алгоритм пошуку мінімального та максимального значень елементів масиву.
- •Функція MinMax
- •Блок-схема
- •4.4. Жадібні алгоритми
- •5. Алгоритми сортування
- •5.1. Задача сортування та класифікація методів сортування.
- •5.2. Складність алгоритмів сортування.
- •5.3. Швидке сортування (OuickSort).
- •5.4. Сортування деревом (HeapSort) Алгоритм.
- •5.5. Cортування Шелла (ShellSort)
- •5.6. Сортування злиттям (MergeSort)
- •Лінійний пошук - це пошук підряд в неупорядкованій послідовності.
- •7. Алгоритми на графах.
- •Список літератури
3. Структури даних.
3.1 Статичні та динамічні структури даних.
Вибір структури даних може суттєво вплинути на ефективність алгоритма.
Оперативна пам’ять організована сегментами: сегмент даних, стек, тіло програми (код) та інші. Розмір сегментів визначається архітектурою мікропроцесору.
Змінні, що об’явлені в програмі, розміщуються в сегменті даних (статична пам’ять). Але цього сегменту даних при обробці великих масивів даних може не вистачити. Тому при роботі з великими масивами даних користуються динамічною пам’ятью.
Динамічна пам’ять - це найбільший сегмент оперативної пам’яті, що надається програмі при її роботі.
Статичне розміщення даних здійснюється при компиляції програми, динамічне - безпосередньо при роботі програми.
До статичних структур даних належать масиви, записи (структури, класи), множини.
До динамічних структур даних належать лінійні зв'язані структури: списки, черги, стеки; нелінійні структури: дерева (графи, мережі).
Ці структури є фундаментальними в програмуванні.
У лінійно зв'язаних структурах:
всі елементи зв'язані між собою в ланцюг за допомогою покажчиків;
пам'ять для елементів виділяється і звільняється динамічно;
послідовність елементів має початок ланцюга і кінець (вершину), що адресує покажчик стека, черги або списку.
Елементами лінійно зв'язаних структур є записи (структури struct), що містять інформаційне поле та одне чи кілька полів з адресами наступного (попереднього) елементів. Таким чином, елемент містить покажчик на інший елемент.
Несхожість лінійних зв'язаних структур полягає в тому, що включення і виключення елементів з цих структур відбувається по-різному.
Схема взаємодії елементів у ланцюзі зв'язаних структур
К
інець
ланцюга (null - 0)
(вершина) Початок
ланцюга
Стек: включення і виключення
елементів тільки на вершині стеку.
Черга: включення - тут; виключення – тут.
Список: включення і виключення елементів у
будь-якому місці ланцюга.
3.2. Стеки
Стек - це лінійна зв'язана структура даних, в якій додавати (включати), видаляти (виключати) і читати дані можна тільки з одного кінця (вершина - top): доступний при цьому тільки елемент, доданий у стек останнім. Інші назви цього способу організації даних:
- LIFO-Last In- First Out (останнім увійшов - першим вийшов);
магазинна пам'ять.
Елемент стека має вид:
struct node
{ float num //ключове поле
//інформаційні поля
node *next; // покажчик на попередній елемент
};
Приклад.
Ввести з клавіатури n цілих чисел і розмістити їх в стек. Підрахувати кількість позитивних елементів стеку та витягти зі стека всі елементи.
Блок-схема програми
Блок-схема функції push додавання до стеку нового елемента
Блок-схема функції pop видалення останнього елемента стека
Блок-схема функції printstack виведення на екран елементів стека
ЦИКЛ
top<>0
ЦИКЛ
Текст програми
#include <iostream.h>
struct node
{
float num;
node* next;
} ;
// прототипи функцій
node* push(node* , float); // додавання елементу в стек
void printstack(node* ); // виведення на екран (читання) елементів стеку
node* pop(node*); // видалення елементу зі стеку
void main()
{
float what;
int n,i;
node* top=0;
cout<<"input n\n";
cin>>n;
cout<<endl;
// формування стеку з n елементів
cout<<"input what"<< n<<"value\n";
for (i=1;i<=n;i++)
{
cin>>what;
top= push(top, what);
}
// виведення на екран елементів стека
printstack(top);
int k=0;
// підрахунок кількості позитивних елементів та звільнення пам’яті
while(top)
{
if (top->num >0)
k++;
top= pop(top);
}
cout<<"k="<< k<<"\n";
}
node* push(node* top, float what)
{
node* pv=new node;
pv->num=what;
pv->next=top;
return pv;
}
void printstack(node* top)
{
float what;
cout<<"stek:\n";
while (top)
{
cout<<top->num<<" ";
top=top->next;
}
cout<<endl;
}
node* pop(node* top)
{
node* pv=top->next;
delete top;
return pv;
}