Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекції 1.docx
Скачиваний:
3
Добавлен:
14.07.2019
Размер:
44.36 Кб
Скачать

Алгоритми обходу дерева

  1. Послідовний

(зліва направо:обробляється ліве піддерево, потім вузол потім праве піддерево)

  1. Паралельний

(знизу верх:обробляється ліве піддерево , потім праве піддерево потім вузол)

  1. В ширину

(зверху вниз: обробляється вузол, потім ліве піддерево, потім праве піддерево)

Сортуваання

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

Випадки сортування:

  1. У використанні до самих даних

  2. У використанні до кроків, асоційованих з даними

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

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

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

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

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

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

Елементарні методи сортування

  1. Сортування методом вибору

  2. Методи вставки

  3. Методи бульбашки

  4. Метод Шелла

  5. По індексам вказівника

  6. Метод роз приділеного підрахунку

Метод вибору

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

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

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, М](ключі можна використовувати в якості індексів елементівЇ

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

Сортування зливанням

Зливання – це процес з’єднування двох відсортованих наборів даних

  1. Метод двухшляхового зливання

  2. Метод визхідного зливання

  3. Метод низхідного зливання

Метод двухшляхового зливання

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

Для виконання відповідної сортіровки потрібна додаткова пам’ять об’ємом не менше чим сумарний об’єм об’єднаних даних.

За прикладом звернутись до Катерини Білоус!!!

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

Метод нисходящей сортировки слиянием

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

Public static Elem sort (Elem sp) {

If ((sp==null)||(sp.next==null))

Return sp;

Elem a =sp,

b=sp.next;

while ((b!=null)&&(b.next!=null)) {

sp=sp.next;

b=b.next.next;

}

B=sp.next;

sp.next=null;

return con(sort(a),sort(b));

}

Public static Elem con (Elem a,Elem b) {

Elem c =new Elem(0),

while ((a!=null)&&( a!=null))

if(a.d<b.d){

c.next=a; c=a; a=a.next;

}

Else{

c.next=b; c=b; b=b.next;

}

c.next =(a==null)? b:a

Метод восходящей сортировки слиянием

Суть – не рекурсивна сортіровка , виконання якої предполагає використання ринциа «…….

Треба дописати

Методи пирамидальной сортировки

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

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

Застосування :система планування завдання (ключ являє собою значення пріоритету).

Реалізація операції вставки і видалення дуже сильно залежить від представлення набора даних:

Упорядкований і неупорядкований, в вигляді массива звязаного спику.

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

Упорядочене представлення – «енергічний підхід» коли попередньо виконується необхідний обєм робіт щоб забеспечити максимальну ефективність реалізації операції видалення .

Пирамедальное представление структури даних

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

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

При формировании такого дерева відерживается следующий

Порядок :

  1. Создается корневой узел

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

Дерево

Представление такого дерева в виде массива формируется по следующему правилу: і-й елемент больше или равен значению 2і-го и 2і+……….дописать !

Все алгоритмі для очередей по приоритету, представленних в виде сортирующего дерева, работают по правилу:

  1. Вносится простое изменение.

  2. Віполняется подход по пирамиде, внося изменения, связанніе с поддержкой сортируемой структурі.

Подход по пирамиде снизу вверх для установки ногово порядка структурі данніх назівается восходящим.

Проход по пирамиде сверху вних для установки нового порядка структурі данніх назівается нисходящим.

Восходящая установка :

Public static void Up(int m[], int k) {

While((k>1)&&(m{k/2]<m[k])) {

Int t=m[k/2];

m[k/2]=m[k];

m[k]=t;

k=k/2;

}}

Пирмер реализации базовой сортировки очередью по приоритетам.

Создать пустую очередь

Сформировать очередь используя восходящую вставку

Удалить очередь, используя исходящую вставку

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

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

Кожна позиція масива розглядається як корінь не великого дерева і два потомка цього вузла (два під дерева) Представляють собою сортуюче дерево.

Зсамого початку перегляд сортуючого масиву даних починається з половини і дальше масив проглядається в зворотньому порядку.

Фото 1

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

Методи побудовані на сортуванні об’єктів з ключами ,де ключ розглядається як числа представлення в деякій системі числення й обробки чисел здійснюється порція цифрами за один крок.

Існує два базових підходи до порозрядного сортування

  1. Постарші цифри (порозрядне сортування MSD)

  2. По молодші цифри (порозрядне сортування LSD)

В залежності від контекста ключом в нормальній сортіровці може бути рядок або слово

Рядок – це послідовність байтів перемінного розміру

Слово – це послідовність байтів фіксованої довжини

Передбачається що нумерація байтів в слові і біті в байтів починається зліва від значення

Приклад

  • Представляє собою чотирьохбайтне значення

  • Цифрою являється однобайтове значення

Фото 2

Фото 3

Методи пошуку

Пошук – це та операція отримання (вилучення ) інформації (даних )ііз деякого інформаційного простору з ціллю її обробки.

Методи пошуку інформації залежать від впорядкованості та структурності даних.

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

Пошук інформації основується на операції порівняння, результатом якого являється повідомлення про успіх (попадання) і не успіх(промах)

Пошук індексуванням по ключу.

Викоенується в два етапи

  1. Визначається адрес (виконується переробка ключа в індекс масива)

  2. Розрішення конфліктів(обробка значень з одинаковимии індексами)

Хешування – цк компроміс між часом виконання і кількість даних.

Приклад реалізації хеш таблиці з роздільним зв’язуванням

ФОТО

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

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

Послідовний пошук

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

Якщо впорядкованому набору даних використати принцип «розділяй і владарюй», то получитьбся бінарний пошук.

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

Інтерполяційний пошук

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

Дерево бінарного пошуку

Ключ кожного вузла дерева має значення ключа більше або рівне значенню ключа його лівого піддерева і менше або рівне – правого піддерева.

Рекурсивна реалізація пошуку для добавлення вузла в дерево ділить новий елемент зовнішнього вузла

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

BST-дерево – це вже відсортований набір даних.

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

Реалізація

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

  2. Якщо значення ключа нового вузла менше значення ключа кореня, тоді старого кореня стає

  1. Ротація – перетворення дерева , основаному на обміні кореня з його дочерним вузлом при зберігання порядку слідування в вузлах BST- дерева.

а) Ротація вправо – місцями міняються корінь та його лівий вузол

- старий корінь стає правим піддеревом нового кореня

- Праве піддерево нового кореня стає лівим піддеревом старого кореня

б)Ротація вліво – місцями міняються корінь та його правий вузол

- старий корінь стає лівим піддеревом нового кореня

- ліве піддерево нового кореня стає правим піддеревом старого кореня

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

Існують декілька методів балансування BST-дерева.

  1. Рандомізація (позиція нового вузла вибирається випадковим чином або в корінь дерева або в корінь деякого піддерева )

  2. ……………………………………

Порозрядний пошук

При пошуку елемента значення ключа оцінюється порціями а не цілком

Простішою

Анализ алгоритма – это способ предсказания требуемых ресурсов для его выполенния (оценка его эффективности ).

Под ресурсами понимается время выполнения и об\ем памяти

Применяется анализ алгоритмов как на этапе из разработки , так и на этапе реализации .

Рассматрмваемые методы анализа …..

Эмпирический анализ – вычисление времени выполнения путем запуска на исполнение реализаций алгоритмов.

Математический анализ – вычисление относительного времени выполнения путем построения математического выражения .

Допущения при эмпирическом анализе

1. Категория (реализация )

  1. Алгоритмы реализованы на одном и том же языке программирования .

  2. Реализация алгоритмов осуществлялась с одинаковой тщательностью.

  3. Выполняемый код (программа )алгоритмов был получен с использованиям одной и той же среды программирования .

  4. Выполнение алгоритмов осуществлялась на одной и той же машине .

2 категория (исходные данные )

  1. Использование реальных данных (точное измерение времени выполнения).

  2. Использование случайных данных ( гарантия анализа именно алгоритма, измерение среднего времени выполнения).

  3. Использование необычных данных ( измерение наихудшего случая ).

Рассмотрим пример эмпирическеого анализа алгоритмов последовательного и бинарного поиска :

- помск осуществляется в массмве целых чисел;

- разсерность массмва в диапазоне от 10 в 3 до 10 в 6 степени ;

- количество операций поиска элемента в диапазоне от 10 в 4 до 10 в 7 степени;

- набор данных и поиск элементов один и тот же ;

- массив инициализируемся случайными значениями ;

Математический анализ

Математический

Анализ применяется если :

  1. Отсутствует реализация алгоритма.

  2. Необходимо предсказать время выполнения алгоритма в новой среде .

  3. Сравниваются алгоритмы , предназначенные для решения одной задачи.

При выполнении аналитического анализа важно понимать , что все алгоритмы имеют параметры, которые влияют на время их выполнения (типы абстрактных операций).

Необходимо выделить один главный , который чаще всего пропорционален величине обрабатываемого набора данных, т.е. N – размерность набора данных.

Зависимость времени выполнения можно выразить через главный параметр м использованием простых математических формул, называемых рост функциями:

  1. - постоянное время выполнения (почни все операции программы выполняются один раз или несколько).

Например , поиск индексированием по ключу.

logN – логарифмическое время выполнения программы (задача разбивается на набор подзадач , уменьшением размера задачи на каждом шаге на некоторый постоянный коэффициент, и решение определяется в одной подзадаче).

Например , бинарный поиск .

N – линейное время выполнения программы ( если каждый элемент подвергается обработке ).

Например, последовательный поиске.

NlogN – время выполнения , пропорциональное NlogN (задача разбивается на подзадачи , решения которых затем объединяются ).

Например, нисходящая сортировка слиянием.

N в квадрате – квадратичное время выполнения (когда обрабатываются все пары элементов – двойные циклы ).

Например , сортировка вставками в наихудшем случае.

2в N степени –экспоненциальное время …

Для построения аналитического выражения, определяющего время выполнения, необходимо определить все операции, из количества и время исполнения.

Полученное выражение можно преобразовать, выразив через рост функции.

Для приближенной оценки времени выполнения алгоритма при больших значениях N можно упростить математическое выражение отбросив слагаемые «низших порядков»

Оценка порядка рост времени выполнения алгоритма при больших объемах набора данных называется асимптотической.

Математическая запись асимптотической оценки называется «тета - нотацией» (Q - нотацией) :

Где Q(q(n)) – это множество функций , для которых справедливо высказывание:

F(n) € Q(q(n)), если существуют константы c1, c2,n0………… звернутись до Анастасії Підгорної!!!!!!!!!!!!

……………………