Zadanie 1 – stos (5 pkt) Dla struktury danych typu stos elementów typu int zbadaj złożoność obliczeniową następujących operacji: 1. Dodanie elementu na szczyt stosu (1 pkt). 2. Usunięcie elementu ze szczytu stosu (1 pkt). 3. Usunięcie elementu ze spodu stosu (1 pkt). 4. Wyszukanie czy element o zadanej wartości znajduje się na stosie (1 pkt). Uwagi: • złożoność należy badać w zależności od rozmiaru stosu przed rozpoczęciem danej operacji, • wyniki pomiaru składające się z samych zer (lub ogólniej – z wartości mniejszych niż rozdzielczość pomiaru czasu) nie są miarodajne, gdyż równie dobrze mogą oznaczać złożoność liniową, a nie stałą. Należy stosować takie rozmiary stosu lub takie "skalowanie" pomiaru, by uzyskać "niezerowe" wyniki. Przykład skalowania znajduje się na stronie przy okazji poprzedniego laboratorium, • dozwolone są tylko operacje typowe dla stosu: sprawdzenie rozmiaru stosu (operacje empty oraz size), dodanie/usunięcie elementu na/z szczytu stosu (pop_back/push_back) oraz uzyskanie dostępu do elementu na szczycie stosu (back). • w punkcie 3 dozwolone jest tymczasowe zdjęcie innych elementów ze stosu, ale po zakończeniu całej operacji pozostałe elementy poza usuwanym mają pozostać na stosie, • analogicznie w przypadku punktu 4: procedura ma zwracać informację czy dany element jest na stosie, ale po jej zakończeniu stos ma posiadać dokładnie te same elementy co przed rozpoczęciem procedury, • w przypadku punktu 4 w celu uzyskania miarodajnych wyników wyszukiwany element powinien być zawsze celowy umieszczony w określonej części stosu (najlepiej na końcu), • za własną implementację stosu jest dodatkowy punkt. Zadanie 2 – binarne drzewo poszukiwań (4 pkt) Zaimplementuj strukturę danych typu binarne drzewo poszukiwań (BST), na której będzie można wykonać operacje dodawania elementu o zadanej wartości (1 pkt), wyszukiwanie elementu o zadanej wartości (1 pkt) oraz usuwania elementu o zadanej wartości (1 pkt). Dokonać analizy złożoności obliczeniowej jednej z powyższych operacji (1 pkt). Uwagi: • każdą operację należy przeprowadzać zaczynając od korzenia drzewa tzn. zabronione jest przechowywanie wskaźników do innych elementów niż korzeń przed rozpoczęciem operacji, • wyszukiwanie ma zwracać wskaźnik na element o zadanej wartości (jeśli taki element jest w drzewie) lub pusty wskaźnik (jeśli nie ma takiego elementu), • analiza złożoności obliczeniowej ma być miarodajna. Przykładowo, aby zmierzyć złożoność operacji dodawania elementu należy przygotować możliwie zrównoważone drzewo, a następnie dodać element o kluczu większym niż wszystkie elementy w drzewie (zostanie wtedy zawsze dodany blisko "prawego dolnego" rogu drzewa). Zadanie 3 – kopiec binarny (4 pkt) Zaimplementuj strukturę danych typu kopiec binarny, na której będzie można wykonać operacje dodawania elementu o zadanej wartości (1 pkt) oraz usuwania elementu-korzenia (1 pkt). Napisać funkcję budującą kopiec na podstawie zadanych danych (listy, tablicy lub podawanych z klawiatury) (1 pkt). Dokonać analizy złożoności obliczeniowej jednej z powyższych operacji (1 pkt). Przyjmujemy, że kopiec jest malejący tzn. korzeń przechowuje element największy. Punkty <5 5 6 7–8 9–10 11–12 13 Ocena 2.0 3.0 3.5 4.0 4.5 5.0 5.5