Przykłady zastosowania struktur danych: stosu, kolejki i kolejki
Transkrypt
Przykłady zastosowania struktur danych: stosu, kolejki i kolejki
Algorytmy i struktury danych, ćwiczenia, studia stacjonarne, zestaw zadań nr 5 Krzysztof Ostrowski Przykłady zastosowania struktur danych: stosu, kolejki i kolejki priorytetowej Koszt zamortyzowany Zadanie 1 Zaproponuj wykorzystujący stosy algorytm obliczania wartości wyrażeń arytmetycznych (w postaci infiksowej). Dysponujemy nawiasami, operatorami + - * / ^ z ich standardowymi priorytetami oraz liczbami od 0 do 9. Przykładowo dla wyrażenia 5*8+4*2^3 wynikiem powinna być liczba 72, a dla wyrażenia 2+(7+8/2-2*3)*5 wynikiem jest 27. Wskazówka: najpierw zamień wyrażenie na odwrotną notację polską. Zadanie 2 Zaproponuj algorytm, który zasymuluje programowy stos wywołań rekurencyjnych funkcji obliczającej symbol Newtona oraz obliczy jej wartość: int newton(int n, int k){ if(n==k || k==0) return 1; return newton(n-1, k-1)+newton(n-1, k); } Program nie powinien jawnie wykorzystywać rekurencji. Jako struktury pomocniczej należy użyć: struct Wywolanie{ int n, k; int wynik; int stan; } //argumenty wywołania rekurencyjnego //wynik wywołanej funkcji //wskazuje, w którym miejscu w kodzie funkcji jesteśmy aktualnie //stan=0 jesteśmy na początku //stan=1 jesteśmy po pierwszym rekurencyjnym wywołaniu newton(n-1, k-1) //stan=2 jesteśmy po drugim rekurencyjnym wywołaniu newton (n-1, k) stack<Wywolanie*> stos; //stos wywołań rekurencyjnych (C++) Zadanie 3 Zaproponuj algorytm przeglądania drzewa binarnego poziomami. Algorytm najpierw powinien wypisać korzeń, następnie od lewej do prawej jego synów, następnie od lewej do prawej elementy na 3 poziomie drzewa itd. Zadanie 4 Planujemy stworzyć kolejkę priorytetową, która umożliwi nam następujące operacje: construct – tworzenie kolejki priorytetowej z istniejących n elementów findMax – znalezienie elementu o największym priorytecie deleteMax – usunięcie elementu o największym priorytecie insert – dodanie nowego elementu Porównaj złożoności czasowe powyższych operacji dla różnych struktur danych (tablica, lista, zrównoważone drzewo binarne, kopiec binarny). Która z nich najlepiej nadaje się do tego celu? Zadanie 5 Dany jest pewien kontener (np. zwykła tablica lub tablica haszująca), do którego można dodawać kolejne elementy. W momencie, gdy liczba elementów przekracza rozmiar tablicy, następuje realokacja tablicy (jej rozmiar zwiększa się dwukrotnie) i wówczas możliwe, że będzie trzeba dokonać ponownego wstawienia wszystkich elementów do nowego kontenera. Początkowo rozmiar kontenera wynosi 100 i nie zawiera on żadnych elementów. Po kolei dodajemy do niego n elementów (n>100). a) jaki jest pesymistyczny koszt wykonania operacji wstawiania? b) jaki jest całkowity koszt wykonania n operacji wstawiania? c) jaki jest średni koszt operacji wstawiania (koszt zamortyzowany) z jej n wykonań? d) jak zmieni się koszt zamortyzowany, gdy zmienimy sposób realokacji (powiększając rozmiar tablicy o stały czynnik np. o 10).