Sprawozdanie do 5. Projektu z Algorytmów i struktur danych 1 1. Złożoność obliczeniowa operacji wstawiania i usuwania elementów kolejki dla sterty dwu i trójkierunkowej Powyższy problem badano porównując czas działania programu przy operacjach wstawiania, a następnie usuwania różnej ilości elementów kolejki dla stert dwukierunkowej i trójkierunkowej. Badania zostały przeprowadzone dla ilości elementów od 1 do w każdym przypadku po 1 razy. Otrzymane wyniki przedstawia poniższy wykres. 24 21 trójkierunkowa dwukierunkowa 18 15 12 9 6 2 2 2 2 1
Jednoznacznie okazuje się, że kolejka priorytetowa działa szybciej na stercie dwukierunkowej. Co więcej stosunek ich złożoności dla różnej ilości elementów nie jest stały. Dla liczby 1 elementów kolejka dla sterty trójkierunkowej działa 2 dłużej, a dla 2 elementów już 4 razy wolniej. Badanie zakończono dla liczby elementów wynoszącej tysięcy, dla których to czas działania wyniósł odpowiednio 5,28 i 22,68 sekundy. 2. Porównanie wydajności algorytmów sortujących Badania porównujące czas działania algorytmów przeprowadzono dla poniższych sortowań : sortowanie przez kopcowanie dla kolejki priorytetowej bazującej na stercie dwukierunkowej (SortHeap2) oraz kolejki priorytetowej bazującej na stercie trójkierunkowej (SortHeap), sortowanie przez kopcowanie dla bezpośredniego ukopcowania w stertę dwukierunkową () oraz dla bezpośredniego ukopcowania w stertę trójkierunkową (), sortowania szybkiego (), sortowania przez scalenie (), sortowania metodą Shell a (), sortowania grzebieniowego o współczynniku 1, () Badania zostały przeprowadzone dla tablic o ilości elementów od 1 do w każdym przypadku po 1 razy. Wszystkie sortowania przeprowadzanie były dla identycznych, losowych tablic. Otrzymane wyniki przedstawiają poniższe wykresy. 2
27 24 21 18 15 12 9 6 SortHeap2 SortHeap 2 2 2 2 Oto ten sam wykres z czasem w skali logarytmicznej : 1 1 1,1,1 SortHeap2 SortHeap,1 2 2 2 2
Okazuje się, że wykres ze zwykłą skalą jest całkowicie nieczytelny, gdyż czas sortowania przez kopcowanie dla kolejki priorytetowej bazującej na stertach jest nieporównywalnie większy od pozostałych sortowań. Przykładowo, dla wielkości tablicy trwa ono około 6 (dla sterty dwukierunkowej) oraz (dla trójkierunkowej) sekund. Natomiast średni czas działania pozostałych sortowań dla tych samych tablic zawiera się w przedziale 1 46 milisekund. Wykres ze skalą logarytmiczną uzmysławia nam tą ogromną różnicę wydajnościową. Aby porównać wydajność pozostałych sortowań z wykresu usunięto sortowania SortHeap.,5,45,4,5,,25,2,15,1,5 2 2 2 2 4
Okazuje się, że najdłużej działa algorytm, natomiast najkrócej. Wolniejsze od niego są sortowania grzebieniowe oraz metodą Shell a, natomiast sortowania bezpośredniego ukopcowania są jedynie trochę wolniejsze. Zaznaczyć tutaj trzeba, że powyższe sortowanie przez kopcowanie wydajniej działa dla sterty trójkierunkowej niż dla sterty dwukierunkowej. Powyższe badanie przeprowadzono jeszcze dla większych tablic tj. dla ilości elementów od 1 do 5. Wyniki prezentuje wykres. 1,1 1,,9,8,7,6,5,4,,2,1, 4 16 22 2 28 4 4 4 46 4 Okazuje się, iż dla większych tablic sortowanie grzebieniowe spowalnia i ma podobną wydajność co sortowanie przez scalenie. Najszybszym algorytmem okazuje się znowu. Również w tym przypadku sortowanie przez kopcowanie działa szybciej dla sterty trójkierunkowej niż dla sterty dwukierunkowej. 5