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