Professional Documents
Culture Documents
Лабораторна робота №7
Лабораторна робота №7
Лабораторна робота №7
з дисципліни «Теорія алгоритмів»
Вінниця 2023
Лабораторна робота №7
Тема: програмування та аналіз алгоритму сортування за допомогою купи
(пірамідальне сортування). Обчислення часу виконання алгоритму.
Мета: проаналізувати та дослідити алгоритм сортування методом купи.
1
Хід роботи
2
Таким чином, найбільший елемент дерева (або будь-якого піддерева)
знаходиться у кореневій вершині цього дерева (або піддерева)
Висота вершини дерева – це число ребер у найдовшому шляху, який
починається у цій вершині, йде вниз по дереву
і закінчується листком. Тобто, висота дерева збігається з висотою його
кореня.
• У дереві, що утворює купу, всі рівні (крім останнього)
заповнені повністю.
Тому висота цього дерева дорівнює O(logn), де n – число елементів купи.
• Час роботи основних операцій над купою пропорційний висоті дерева і,
відповідно,
складає O(logn).
Крок 1
3
Рис.1.1
Крок 2
Рис.1.2
4
Крок 3
Рис.1.3
Крок 4
5
Рис.1.4
6
3. Алгоритм сортування у графічному вигляді.
7
5. Практична оцінка складності відповідного алгоритму в трьох
випадках для масивів різного розміру. Навести таблиці та відповідні
графіки часу виконання програми для трьох випадків. Кількість значень
часу має бути не менше семи. Увага! Мінімальне та максимальне
значення часу кожним студентом підбирається індивідуально, залежно
від потужностей Вашого ПК. При цьому врахуйте, що мінімальне
значення часу повинно
бути порядка кількох секунд (до 10), а максимальне – не більше 5 – 10
хвилин (за Вашим бажанням останній час може бути збільшено). 7.1
Таблиця та графік для найкращого випадку. 7.2 Таблиця та графік для
найгіршого випадку. 7.3 Таблиця та графік для середнього випадку.
Середній випадок
n t, с
10000 0.034052
50000 0.196202
100000 0.41826
200000 0.892817
300000 1.404840
400000 1.915475
500000 2.491182
600000 3.127492
800000 4.31716
1000000 5.499669
Найкращий випадок
n t, с
10000 0.031322
50000 0.191432
100000 0.413479
200000 0.886670
300000 1.395457
8
400000 1.891927
500000 2.488069
600000 3.064783
800000 4.219747
1000000 5.337023
Найгірший випадок
n t, с
10000 0.039718
50000 0.200475
100000 0.427104
200000 0.918864
300000 1.423789
400000 1.936715
500000 2.49664
600000 3.140472
800000 4.373874
1000000 5.506510
t,
n, кількість елементів
9
Лістинг програми для оцінки часової складності алгоритму методом купи
для 3 випадків :
import
random
import time
if largest != i:
arr[i], arr[largest] = arr[largest],
arr[i] heapify(arr, n, largest)
def heapSort(arr):
n = len(arr)
10
# Generate an array of numbers
size = 700000 # Specify the size of the array
numbers = [random.randint(1, 700000 ) for _ in range(size)]
# Worst Case
worst_case_numbers = list(reversed(numbers)) # Sorted in descending order
# Best Case
best_case_numbers = sorted(numbers) # Already sorted in ascending order
# Average Case
average_case_numbers = list(numbers) # Random order
11
Практичні результати відповідають нашим теоретичним оцінкам, отже ми
можемо вважати, що наші теоретичні оцінки є коректними. Порівняльний
аналіз теоретичної та практичної часової складності алгоритму сортування
купою ми здійснили, порівнюючи графіки залежності часу виконання
програми від розміру вхідних даних.
У теорії пірамідальне сортування має часову складність O(n*log n), де n -
кількість елементів у вхідному масиві.
Практична складність алгоритму залежить від багатьох факторів, таких як
швидкість процесора, оптимізація програмного коду, кількість операцій
вводу-виводу і т.д. Проте в цілому, при збільшенні розміру вхідних даних,
час виконання програми збільшується. З графіка видно, що час виконання
програми збільшується при збільшенні розміру масиву. Проте,
спостерігається, що залежність між розміром масиву і часом виконання не
є лінійною, але близька до лінійної. Це означає, що практична складність
алгоритму близька до теоретичної складності O(n*log n) у 3 випадках. На
основі графіків залежності часу виконання алгоритму сортування методом
купи від розміру вхідних даних можна зробити наступні висновки:
Переваги:
Не є рекурсивним та практично взагалі не вимагає додаткової пам’яті для
своєї роботи;
Алгоритм сортування за допомогою купи використовує структуру даних –
двійкову купу. Ця структура буває корисною і в інших ситуаціях,
наприклад, досить ефективно на її основі можна організовувати чергу з
пріоритетами;
Ефективність: Пірамідальне сортування має часову складність O(n * log n),
що робить його ефективним алгоритмом сортування для великої кількості
елементів. В порівнянні з іншими алгоритмами, такими як сортування
вставкою чи сортування бульбашкою, пірамідальне сортування зазвичай
працює швидше;
Алгоритм сортування за допомогою купи потребує T(n) = O(n·logn) часу
для сортування n об’єктів, та додаткову пам’ять розміром O(1), а не O(n),
як сортування злиттям;
Недоліки:
12
Практично алгоритм сортування за допомогою купи не є найшвидшим;
Нестійкий (не зберігає порядок рівних елементів у вхідному масиві);
Алгоритм буде ефективнішим на великих обсягах даних. Якщо даних
небагато існують алгоритми, які будуть ефективніші.
14