- •Дайте визначення структури даних і наведіть класифікацію, приклади.
- •Дайте визначення такої структури даних як «хеш-таблиця» і наведіть класифікацію, приклади.
- •Опишіть способи реалізації хеш-функції (перетворення ключа в індекс).
- •Опишіть способи вирішення колізії в хеш-таблицях з відкритою адресацією.
- •Дайте визначення алгоритму і опишіть його властивості.
- •Дайте поняття динамічного програмування і наведіть класифікацію, приклади.
- •Дайте визначення такої структури даних як «черга за пріоритетом», наведіть її представлення і реалізацію.
- •Дайте визначення поняттю "пошуку", наведіть особливості реалізації і класифікацію алгоритмів пошуку.
- •Методи пошуку
- •Послідовний пошук
- •Інтернполяці
- •Дерево бінарного пошуку
- •Порозрядний пошук
Дайте поняття динамічного програмування і наведіть класифікацію, приклади.
У математиці та теорії обчислювальних систем Динамічне програмування (ДП) - це метод розв'язання задач з оптимальною підструктури і перекриваються підзадачі, який набагато ефективніше, ніж рішення «в лоб» (brute force).
Словосполучення динамічне програмування вперше було використано в 1940-х роках Р. Беллманом для опису процесу знаходження рішення задачі, де відповідь на одне завдання може бути отриманий тільки після рішення завдання, «попередньої» їй. У 1953 р. він уточнив це визначення до сучасного. Спочатку ця область була заснована, як системний аналіз та інжиніринг, яка була визнана IEEE. Вклад Беллмана в динамічний програмування був увічнений у назві рівняння Беллмана, центрального результату теорії динамічного програмування, який переформулює оптимізаційну задачу у рекурсивної формі.
Слово «програмування» у словосполученні «динамічне програмування» насправді до традиційного програмування (написання коду) майже ніякого відношення не має і походить від словосполучення «математичне програмування», яке є синонімом слова «оптимізація». Тому слово «програма» в даному контексті швидше означає оптимальну послідовність дій для отримання рішення задачі. Приміром, певне розклад подій на виставці іноді називають програмою. Програмування в даному випадку розуміється як допустима послідовність подій.
Підводячи підсумки вищесказаного можна сказати, що динамічне програмування користується наступними властивостями завдання:
Перекриваються підзадачі.
Оптимальна підструктура.
Можливість запам'ятовування рішення часто зустрічаються підзадач.
Динамічне програмування зазвичай дотримується двох підходів до вирішення завдань:
Спадний ДП: завдання розбивається на підзадачі меншого розміру, вони вирішуються і потім комбінуються для розв'язання вихідної задачі. Використовується запам'ятовування для рішень часто зустрічаються підзадач.
Висхідне ДП: Всі підзадачі, які згодом знадобляться для вирішення вихідної задачі прораховуються наперед і потім використовуються для побудови розв'язку вихідної задачі. Цей спосіб краще спадного ДП в сенсі розміру необхідного стека і кількості виконання функцій, але іноді буває нелегко заздалегідь з'ясувати вирішення яких підзадач нам буде потрібно надалі.
Дайте поняття терміну "сортування" і визначте групи алгоритмів сортування.
Сортування – це процес упорядкування деяких даних у відповідності оприділеним критеріям (правилам)
Група методів сортування:
Елементарне сортування
Методи швидкого сортування
Методи злиття і сортування злиттям
Методи пірамідального сортування
Методи порозрядного сортування
Опишіть сутність алгоритмів групи елементарного сортування (вибору, вставки, бульбашки, Шелла).
Метод вибору
Суть – в наборі даних що відрізняються найменшим чи найбільшим, яким міняється місцями з першим , потім знаходиться другий найменший чи найбільшим елементи міняються місцями з другим і продовжується до впорядкування даних.
Недостатки – на час виконання степінь упорядкування до сортування показує малий вплив.
Public class Sort_1{
Public static void sort(double m[]){
Double temp;
Int max;
For (int k=o; k<m.length; k++){
Max=k;
For (i=k+1; i<m.length; i++)
If(m[i]>m[max])
Max=I;
Temp=m[k];
M[k]=m[max];
M[max]=temp;
}
}
Сортування методом вставки
Суть – кожний елемент набору даних аналізується , оприділяється місце по розміщенню вже серед відсортованих даних , потім всі дані , які повинні стояти після нього , зміщуються вправо , а потім дальній елемент поміщається у вільну комірка пам'яті.
На відміну від сортування метод вибору часу виконання залежить від початкового порядку даних.
Public void sort(double m[]){
Double temp;
For (intk=1;k<m/length; k++)
For (int i=k: i>0: i++)
If(m[i]<m[i-1]){
Temp=m[i];
M[i]=m[i-1];
M{i-1}=temp;
}
}
2-ий варіант
Public static void sort(double m[]){
Double temp;
For(int k=m.length-1;k>0;k--)
If (m[k]<m[k-1]){
Temp =m[k];
M[k]=m[k-1];
M[k-1]=temp;
}
For(int i=2; i<m.length; i++){
Int j=I; temp=m[i];
While(temp<m[j-1]){
M[j]=m[j-1];j--;
}
M[j]=temp;
}
}
Сортування методом бульбашки
Суть – виконується циклічний прохід по набору даних.
Public static void sort (double m[]){
Double temp;
For(int k=o;k<m.length;k++)
For (int i=m.length-1; i>k;i--)
If (m[i]<m[i-1]){
Temp = m[i];
M[i]=m[i-1];
M[i-1]=temp;
` }
}
Метод Шелла – розширений метод сортування вставкою , в якому відбувається обмін не тільки сусідніми даними а і тих що знаходяться далеко один від одного
Набір даних розбивається незалежні під набори які являються пересікаючимися, а в кожному під наборі сортування ведеться методом вставки.
На практиці використовується низхідна послідовність в геометричній послідовності
Кнут запропонував наступний набір кроків
1 4 13 40 121 164 1093 3280
(b=b*3+1)
Програма сортування Шелла
Shell.txt
Public static void sort(double m{}){
Double temp int h;
for(h-1;h<m.length/9; h=3*h+1);
for (; h=0; h/)
Опишіть сутність алгоритмів групи елементарного сортування (по покажчиках, по індексам, розподільного підрахунку).
За покажчиках і індексам, розподіляє підрахунку
Сортування за індексами і вказівниками Застосовується для непростих типів даних. Суть - сортування підлягає не сам набір даних, а масив посилань (покажчиків на елементи набору даних) або індексний масив (елементи - це індекси елементів набору даних).
Сортування методом розподіляє підрахунку Застосовується для наборів даних, елементи яких ідентифікуються ключем описуваних цілим значенням з діапазону [0; M] (ключі можна використовувати як індекси елементів).
Суть - спочатку підраховується кількість елементів для кожного значення ключа в масиві індексів, потім обчислюються часткові суми (для кожного значення ключа підраховується кількість елементів з меншими значеннями), потім у додатковий масив переписуються ключі відповідно з обчисленими значеннями, а потім упорядкований додатковий масив переписується в масив індексів.
Опишіть сутність алгоритмів групи «швидкого» сортування, наведіть їхню класифікацію і відмінності.
Методи «швидкого» сортування Базуються на алгоритмі «розділяй і володарюй» та операції вибірки. У залежності від способу розподілу набору даних на частини і розрізняють кілька видів швидкого сортування:
1. Базовий метод «швидкої» сортування
2. «Швидке» сортування з розділенням на три частини
3. «Швидке» сортування методом обчислення медіани з трьох елементів
Базовий метод «швидкого» сортування
Суть - набір даних ділиться на дві частини, які сортуються незалежно один від одного. Положення точки поділу залежить від вихідного порядку елементів у наборі.
Розділяючий елемент визначається довільно, потім поміщається в свою остаточну позицію і виконується перегрупування набору даних наступним чином: елементи з меншим значенням поміщаються ліворуч, елементи з великим значенням - праворуч. Потім кожна частина сортується окремо.
«Швидке» сортування з розділенням на три частини
Суть - набір даних ділиться на три частини: елементи зі значенням рівним розділяє і зустрілися в лівій частині перемішається до лівого краю, елементи зі значенням рівним розділяє і зустрілися в правій частині переміщуються до правого краю, потім частини сортуються окремо.
«Швидке» сортування
методом обчислення медіани з трьох елементів
Суть - розділяє елемент вибирається довільно з трьох (в основному з першого, останнього і середнього), потім середнім міняється місцями з передостаннім, потім ці елементи впорядковуються (найменший - перший, найбільший - останній), після виробляється сортування (можливо рекурсивно) між першим і передостаннім елементами.
Виходом з рекурсивного виклику є перевірка умови: якщо кількість елементів у піднаборі менше деякого встановленого значення, то сортування в такій частині ігнорується.
Опишіть сутність алгоритмів групи сортування злиттям, наведіть їхню класифікацію і особливості.
Злиття - це процес об'єднання відсортованих наборів даних в один більшого розміру.
1. Метод двоколійних злиття
2. Метод низхідній сортування злиттям
3. Метод висхідній сортування злиттям
Метод двоколійних злиття
Суть - з двох відсортованих наборів даних послідовно вибираються найменші та переміщуються у третій (i-й елемент з одного набору порівнюється з j-й елементом з другого набору і найменший записується в третій).
Альтернатива прямому злиттю - це обмінна злиття, при виконанні якого спочатку відбувається копіювання двох наборів даних в один (елементи розташовуються зростаючими назустріч один одному), а потім проводиться порівняння елементів об'єднаного набору даних лівого кінця з правим і переміщення найменшого в результуючий набір даних.
Метод низхідній сортування злиттям
Суть - набір даних ділиться на дві частини і виконується рекурсивна сортування обох частин з наступним їх злиттям
Метод висхідній сортування злиттям
Суть - не рекурсивна сортування, виконання якої передбачає використання принципу «об'єднуй і володарюй» (спочатку виконується злиття сусідніх елементів, потім сусідніх пар, потім сусідніх подвійних пар і т.д.