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).