Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
final.docx
Скачиваний:
10
Добавлен:
14.07.2019
Размер:
71.28 Кб
Скачать
  1. Дайте поняття динамічного програмування і наведіть класифікацію, приклади.

У математиці та теорії обчислювальних систем Динамічне програмування (ДП) - це метод розв'язання задач з оптимальною підструктури і перекриваються підзадачі, який набагато ефективніше, ніж рішення «в лоб» (brute force).

Словосполучення динамічне програмування вперше було використано в 1940-х роках Р. Беллманом для опису процесу знаходження рішення задачі, де відповідь на одне завдання може бути отриманий тільки після рішення завдання, «попередньої» їй. У 1953 р. він уточнив це визначення до сучасного. Спочатку ця область була заснована, як системний аналіз та інжиніринг, яка була визнана IEEE. Вклад Беллмана в динамічний програмування був увічнений у назві рівняння Беллмана, центрального результату теорії динамічного програмування, який переформулює оптимізаційну задачу у рекурсивної формі.

Слово «програмування» у словосполученні «динамічне програмування» насправді до традиційного програмування (написання коду) майже ніякого відношення не має і походить від словосполучення «математичне програмування», яке є синонімом слова «оптимізація». Тому слово «програма» в даному контексті швидше означає оптимальну послідовність дій для отримання рішення задачі. Приміром, певне розклад подій на виставці іноді називають програмою. Програмування в даному випадку розуміється як допустима послідовність подій.

Підводячи підсумки вищесказаного можна сказати, що динамічне програмування користується наступними властивостями завдання:

Перекриваються підзадачі.

Оптимальна підструктура.

Можливість запам'ятовування рішення часто зустрічаються підзадач.

Динамічне програмування зазвичай дотримується двох підходів до вирішення завдань:

Спадний ДП: завдання розбивається на підзадачі меншого розміру, вони вирішуються і потім комбінуються для розв'язання вихідної задачі. Використовується запам'ятовування для рішень часто зустрічаються підзадач.

Висхідне ДП: Всі підзадачі, які згодом знадобляться для вирішення вихідної задачі прораховуються наперед і потім використовуються для побудови розв'язку вихідної задачі. Цей спосіб краще спадного ДП в сенсі розміру необхідного стека і кількості виконання функцій, але іноді буває нелегко заздалегідь з'ясувати вирішення яких підзадач нам буде потрібно надалі.

  1. Дайте поняття терміну "сортування" і визначте групи алгоритмів сортування.

Сортування – це процес упорядкування деяких даних у відповідності оприділеним критеріям (правилам)

Група методів сортування:

  1. Елементарне сортування

  2. Методи швидкого сортування

  3. Методи злиття і сортування злиттям

  4. Методи пірамідального сортування

  5. Методи порозрядного сортування

  1. Опишіть сутність алгоритмів групи елементарного сортування (вибору, вставки, бульбашки, Шелла).

Метод вибору

Суть – в наборі даних що відрізняються найменшим чи найбільшим, яким міняється місцями з першим , потім знаходиться другий найменший чи найбільшим елементи міняються місцями з другим і продовжується до впорядкування даних.

Недостатки – на час виконання степінь упорядкування до сортування показує малий вплив.

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/)

  1. Опишіть сутність алгоритмів групи елементарного сортування (по покажчиках, по індексам, розподільного підрахунку).

За покажчиках і індексам, розподіляє підрахунку

Сортування за індексами і вказівниками Застосовується для непростих типів даних. Суть - сортування підлягає не сам набір даних, а масив посилань (покажчиків на елементи набору даних) або індексний масив (елементи - це індекси елементів набору даних).

Сортування методом розподіляє підрахунку Застосовується для наборів даних, елементи яких ідентифікуються ключем описуваних цілим значенням з діапазону [0; M] (ключі можна використовувати як індекси елементів).

Суть - спочатку підраховується кількість елементів для кожного значення ключа в масиві індексів, потім обчислюються часткові суми (для кожного значення ключа підраховується кількість елементів з меншими значеннями), потім у додатковий масив переписуються ключі відповідно з обчисленими значеннями, а потім упорядкований додатковий масив переписується в масив індексів.

  1. Опишіть сутність алгоритмів групи «швидкого» сортування, наведіть їхню класифікацію і відмінності.

Методи «швидкого» сортування Базуються на алгоритмі «розділяй і володарюй» та операції вибірки. У залежності від способу розподілу набору даних на частини і розрізняють кілька видів швидкого сортування:

1. Базовий метод «швидкої» сортування

2. «Швидке» сортування з розділенням на три частини

3. «Швидке» сортування методом обчислення медіани з трьох елементів

Базовий метод «швидкого» сортування

Суть - набір даних ділиться на дві частини, які сортуються незалежно один від одного. Положення точки поділу залежить від вихідного порядку елементів у наборі.

Розділяючий елемент визначається довільно, потім поміщається в свою остаточну позицію і виконується перегрупування набору даних наступним чином: елементи з меншим значенням поміщаються ліворуч, елементи з великим значенням - праворуч. Потім кожна частина сортується окремо.

«Швидке» сортування з розділенням на три частини

Суть - набір даних ділиться на три частини: елементи зі значенням рівним розділяє і зустрілися в лівій частині перемішається до лівого краю, елементи зі значенням рівним розділяє і зустрілися в правій частині переміщуються до правого краю, потім частини сортуються окремо.

«Швидке» сортування

методом обчислення медіани з трьох елементів

Суть - розділяє елемент вибирається довільно з трьох (в основному з першого, останнього і середнього), потім середнім міняється місцями з передостаннім, потім ці елементи впорядковуються (найменший - перший, найбільший - останній), після виробляється сортування (можливо рекурсивно) між першим і передостаннім елементами.

Виходом з рекурсивного виклику є перевірка умови: якщо кількість елементів у піднаборі менше деякого встановленого значення, то сортування в такій частині ігнорується.

  1. Опишіть сутність алгоритмів групи сортування злиттям, наведіть їхню класифікацію і особливості.

Злиття - це процес об'єднання відсортованих наборів даних в один більшого розміру.

1. Метод двоколійних злиття

2. Метод низхідній сортування злиттям

3. Метод висхідній сортування злиттям

Метод двоколійних злиття

Суть - з двох відсортованих наборів даних послідовно вибираються найменші та переміщуються у третій (i-й елемент з одного набору порівнюється з j-й елементом з другого набору і найменший записується в третій).

Альтернатива прямому злиттю - це обмінна злиття, при виконанні якого спочатку відбувається копіювання двох наборів даних в один (елементи розташовуються зростаючими назустріч один одному), а потім проводиться порівняння елементів об'єднаного набору даних лівого кінця з правим і переміщення найменшого в результуючий набір даних.

Метод низхідній сортування злиттям

Суть - набір даних ділиться на дві частини і виконується рекурсивна сортування обох частин з наступним їх злиттям

Метод висхідній сортування злиттям

Суть - не рекурсивна сортування, виконання якої передбачає використання принципу «об'єднуй і володарюй» (спочатку виконується злиття сусідніх елементів, потім сусідніх пар, потім сусідніх подвійних пар і т.д.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]