Projekt zrealizowany w ramach przedmiotu Struktury Danych. Celem zadania była samodzielna implementacja abstrakcyjnej struktury kolejki priorytetowej (priority queue) typu MAX w języku C++ oraz przeprowadzenie empirycznych badań czasu wykonywania poszczególnych operacji.
Projekt został zrealizowany w parach.
Zgodnie z wymogami projektu na ocenę 4.0-5.0, wdrożyliśmy następujące struktury:
- Kopiec maksymalny (Max Heap) - struktura oparta na tablicy, działająca na zasadzie drzewa binarnego, w którym każdy węzeł ma wartość większą bądź równą wartościom swoich dzieci.
- Sortowana lista dwukierunkowa (Sorted Doubly Linked List) - oparta na wskaźnikach
head,tail,prevoraznext. Elementy są utrzymywane i przechowywane malejąco względem priorytetu, co zapewnia natychmiastowy dostęp do wartości maksymalnej.
Dla każdej z powyższych struktur przygotowaliśmy testy badające czas wykonywania następujących operacji:
insert(e, p)- Dodanie elementu o wartościei prioryteciep.extract-max()- Usunięcie i zwrócenie elementu o najwyższym priorytecie.find-max()/peek()- Podejrzenie elementu o najwyższym priorytecie (bez jego usuwania ze struktury).modify-key(e, p)- Zmiana priorytetu pierwszego napotkanego elementu o wartościena nowy priorytetp.get-size()/return-size()- Zwrócenie aktualnego rozmiaru (liczby elementów) struktury.
Projekt został utworzony w środowisku Visual Studio.
-
Sklonuj repozytorium:
git clone [https://github.com/Czarko-exe/DataStructures-PriorityQueue.git](https://github.com/Czarko-exe/DataStructures-PriorityQueue.git)
-
Otwórz plik rozwiązania (.sln / .slnx) w programie Visual Studio.
-
Skompiluj projekt (zalecane użycie trybu Release dla dokładniejszych wyników badań wydajnościowych).
-
Uruchom aplikację. Obsługa programów testujących odbywa się za pomocą interaktywnego menu w konsoli.
- Z przeprowadzonych badań (dla zestawów danych od 1000 do 128 000 elementów) płyną następujące wnioski:Max Heap jest strukturą znacznie lepiej skalowalną. Operacje zależne od wysokości kopca (insert, modify-key) wykazały logarytmiczny wzrost czasu
$O(\log n)$ . - Sorted DLL wypada lepiej jedynie dla bardzo małych zbiorów danych. Wraz ze wzrostem liczby elementów, operacje wymagające przejścia przez listę (insert, modify-key) zajmują znacznie więcej czasu ze względu na złożoność
$O(n)$ . - Operacje stałoczasowe (peek, get-size) wykazały minimalne różnice między strukturami, potwierdzając teoretyczną złożoność
$O(1)$ .