analiza zlozonosci algorytmów sortowania (szablony i przeciążanie)
Transkrypt
analiza zlozonosci algorytmów sortowania (szablony i przeciążanie)
11/16/2016
1. Przygotować implementacje z wykorzystaniem szablonów i przeciążeń dla wszystkich
zaimplementowanych funkcji sortowania:
sort(),
InsertionSort(),
SelectionSort(),
MergeSort(),
HeapSort()
realizujących sortowanie słów oraz liczb całkowitych.
2. Poprzez symulacje znaleźć czas wykonania w/w procedur dla następujących rozmiarów
zmiennych:
1024, 2048, 4096, …..,1 048 576
3. Oszacować wydajność swoich implementacji procedur sortowania zestawiając wyniki na
wykresach ( log_2(rozmiar danych) , log_2(czas sortowania)). Wyznaczyć współczynniki
kierunkowe z wyników uzyskanych dla każdej procedury sortowania i każdego rodzaju
zmiennych.
1. Przeciążanie inaczej polimorfizm, funkcji:
rodzina funkcji o tej samej nazwie.
Realizowane powinny być takie same zadania, ale na
różnych zestawach parametrów.
void wyswietl_tablice (const vector<string> & tab){
for (int i = 0, rozmiar= tab.size(); i < rozmiar; ++i){
cout.width(10); cout.fill(' ');
cout << tab[i] << '\n';
}
cout << endl;
}
void wyswietl_tablice (const vector<int> & tab){
for (int i = 0, rozmiar= tab.size(); i < rozmiar; ++i){
cout << i <<'\t'<< tab[i] << '\n';
}
cout << endl;
}
przeciążanie
1
11/16/2016
2. Szablon funkcji :
opis funkcji z użyciem typów ogólnych
template <typename Item >
void BubbleSort(vector<Item> &data){
int n=data.size();
for (int i =0; i < n-1; i++)
for (int j = n-1; j > i; --j)
if (data[j] < data[j-1])
swap (data[j], data[j-1]);
}
Szablony można przeciążać
szablony
UWAGA:
Nie można oddzielać kompilacji szablonu funkcji od jej deklaracji bowiem szablony funkcji są
kompilowane dopiero wtedy, gdy używają swojego argumentu.
Wniosek – implementacje szablonu muszą być w plikach nagłówkowych.
#include <ctime>
ANALIZA ZŁOŻONOŚCI
unsigned int time_start = clock();
// <---- start pomiaru czasu
sort(wektor_int.begin(), wektor_int.end()); // operacja której czas mierzymy
unsigned int time_end = clock();
// <---- start pomiaru czasu
Wyniki z
symulacji
należy
zebrać w
pliku
wydajność
2
11/16/2016
„zwyczajny wykres”
2.5x106
„wykres LOG-LOG”
wydajność algorytmow sortujacych
wydajność algorytmow sortujacych
25
sort(int)
bubble(int)
20
1.5x106
15
log2(sort,int)
log2(bubble,int)
czas
czas
2.0x106
106
10
5.0x105
5
0
0
2x105
0
4x105
6x105
8x105
106
8
rozmiar
10
12
14
16
18
20
22
rozmiar
(log rozmiar, log czas ).
Wydajność algorytmu wyznacza współczynnik kierunkowy tej prostej.
Wyznaczyć te współczynniki dla każdego algorytmy i dla każdego typu
danych
DLACZEGO WYKRES LOG-LOG?
Jeśli:
y ( n ) n
To :
log y (n) log n log n
czyli
zmienna
zależy potęgowo od
n
zmienna log y zależy
liniowo od log n
Zatem:
• Jeśli na wykresie log-log współzależność zmiennych
układa się w linię prostą, to oznacza, że te zmienne
zależą od siebie potęgowo.
• Współczynnik współliniowości log-log wyznacza
wykładnik potęgi zależności zmiennych.
log2(sort,int)
log2(bubble,int)
bubble(): 1.99
sort() : 0.83
25
y
20
wydajność
algorytmow sortujacych
WYNIK:
Wydajność badanych algorytmów na
zmiennych typu int jest:
czas
15
10
Osort (n) n 0.83
5
Obubble (n) n1.99
0
8
10
12
14
16
18
20
22
rozmiar
3