Sprawozdanie do 5. Projektu z Algorytmów i struktur danych 1
Transkrypt
Sprawozdanie do 5. Projektu z Algorytmów i struktur danych 1
Tomek Kędziora numer indeksu 118380 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 000 do 30 000 w każdym przypadku po 100 razy. Otrzymane wyniki przedstawia poniższy wykres. 24 trójkierunkowa 21 dwukierunkowa czas w sekundach 18 15 12 9 6 3 liczba elementów 1 29 00 0 25 00 0 27 00 0 21 00 0 23 00 0 17 00 0 19 00 0 13 00 0 15 00 0 90 00 11 00 0 70 00 50 00 30 00 10 00 0 Tomek Kędziora numer indeksu 118380 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 10 000 elementów kolejka dla sterty trójkierunkowej działa 2 dłużej, a dla 20 000 elementów już 4 razy wolniej. Badanie zakończono dla liczby elementów wynoszącej 30 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 (SortHeap3), • sortowanie przez kopcowanie dla bezpośredniego ukopcowania w stertę dwukierunkową (HeapSort2) oraz dla bezpośredniego ukopcowania w stertę trójkierunkową (HeapSort3), • sortowania szybkiego (quicksort), • sortowania przez scalenie (mergesort), • sortowania metodą Shell’a (shellsort), • sortowania grzebieniowego o współczynniku 1,3 (combsort) Badania zostały przeprowadzone dla tablic o ilości elementów od 1 000 do 30 000 w każdym przypadku po 100 razy. Wszystkie sortowania przeprowadzanie były dla identycznych, losowych tablic. Otrzymane wyniki przedstawiają poniższe wykresy. 2 Tomek Kędziora numer indeksu 118380 Szybkość algorytmów sortujących 30 SortHeap2 27 SortHeap3 czas w sekundach 24 HeapSort2 HeapSort3 21 quicksort 18 mergesort 15 shellsort combsort 12 9 6 3 29 00 0 25 00 0 27 00 0 21 00 0 23 00 0 17 00 0 19 00 0 13 00 0 15 00 0 90 00 11 00 0 70 00 50 00 30 00 10 00 0 liczba elementów Oto ten sam wykres z czasem w skali logarytmicznej : Szybkość algorytmów sortujących 100 czas w sekundach 10 1 SortHeap2 SortHeap3 HeapSort2 HeapSort3 quicksort mergesort shellsort combsort 0,1 0,01 0,001 0 00 29 0 00 27 0 00 25 0 00 23 0 00 21 0 00 19 0 00 17 0 00 15 0 00 13 0 00 11 00 90 00 70 00 50 00 30 00 10 liczba elementów 3 Tomek Kędziora numer indeksu 118380 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 30 000 trwa ono około 6 (dla sterty dwukierunkowej) oraz 30 (dla trójkierunkowej) sekund. Natomiast średni czas działania pozostałych sortowań dla tych samych tablic zawiera się w przedziale 13 – 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. Szybkość algorytmów sortujących 0,05 HeapSort2 0,045 0,04 HeapSort3 quicksort mergesort shellsort czas w sekundach 0,035 combsort 0,03 0,025 0,02 0,015 0,01 0,005 0 0 00 29 0 00 27 0 00 25 0 00 23 0 00 21 0 00 19 0 00 17 0 00 15 0 00 13 0 00 11 00 90 00 70 00 50 00 30 00 10 liczba elementów 4 Tomek Kędziora numer indeksu 118380 Okazuje się, że najdłużej działa algorytm mergesort, natomiast najkrócej quicksort. 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 10 000 do 500 000. Wyniki prezentuje wykres. Szybkość algorytmów sortujących 1,1 HeapSort2 1,0 0,9 HeapSort3 quicksort mergesort czas w sekundach 0,8 0,7 shellsort combsort 0,6 0,5 0,4 0,3 0,2 0,1 10 00 0 40 00 0 70 00 0 10 00 00 13 00 00 16 00 00 19 00 00 22 00 00 25 00 00 28 00 00 31 00 00 34 00 00 37 00 00 40 00 00 43 00 00 46 00 00 49 00 00 0,0 liczba elementów Okazuje się, iż dla większych tablic sortowanie grzebieniowe „spowalnia” i ma podobną wydajność co sortowanie przez scalenie. Najszybszym algorytmem okazuje się znowu quicksort. Również w tym przypadku sortowanie przez kopcowanie działa szybciej dla sterty trójkierunkowej niż dla sterty dwukierunkowej. 5