Nieprzesuwalny termin oddania rozwiązania: 30.05.2005
W tym projekcie programistycznym każdy będzie miał do zaimplementowania co najmniej jedną ze struktur danych prezentowanych na wykładzie. Dla każdej z tych struktur należy napisać moduł realizujący podstawowe operacje:
Na Wasze rozwiązania powinny składać się (co najmniej) następujące pliki:
§
Pascal (standard FreePascal 1.0.6)
§
C++
(standard GCC 3.3.1)
§
Java
(standard J2SDK 1.4.0)
o
Programy będą
kompilowane następującymi poleceniami: fpc, g++, javac.
Jedynym parametrem tych poleceń będzie nazwa pliku z programem.
o
Programy będą
uruchamiane projektów środowisku Linux’owym.
o
Proszę nie
korzystać projektów projektów bibliotek specyficznych dla poszczególnych
producentów oprogramowania.
UWAGA: Wymagane jest przestrzeganie powyższych konwencji - w przeciwnym przypadku może się zdarzyć, że poprawnie działający program nie zaliczy testów sprawdzających poprawność implementacji.
Napisz moduł implementujący kopce Fibonacciego. Następnie wykorzystaj go do znalezienia najkrótszych dróg w grafie od zadanego źródła do pozostałych wierzchołków.
Postać pliku dane.in:
W pliku wynikowym ma znaleźć się n-1 liczb całkowitych: i-ta liczba ma być równa odległości wierzchołka nr (i+1) od wierzchołka nr 1 (wierzchołek nr 1 będzie źródłem).
Wymagane pliki: fibheap<nazwisko>, programfibheap<nazwisko>
Przykładowe dane i wyniki:
dane.in
4 4
1 2 1
2 3 1
1 3 1
3 4 1
wyniki.out
1
1
2
Napisz moduł tworzący optymalne drzewo binarnych wyszukiwań, a następnie zastosuj go do utworzenia drzewa dla przykładowych danych.
Postać pliku dane.in:
W pliku wynikowym zawierającym n wierszy ma znaleźć się opis optymalnego drzewa (w postaci ciągu wierzchołków wypisanych w porządku preorder).
Wymagane pliki: opttree<nazwisko> programoptree<nazwisko>
Przykładowe dane i wyniki:
dane.in
3
0.2 0.1 0.5
0.0 0.0 0.0 0.2
wyniki.out
3
1
2
optymalne
drzewo: 3(1(nil, 2), nil) - o wadze 1.4
drzewo zbalansowane: 2(1, 3) posiada wage 1.9
Napisz moduł tworzący słownik statyczny, a następnie zastosuj go do utworzenia słownika dla przykładowych danych. W module mają znaleźć się co najmniej dwie procedury: makedict, tworząca słownik dla danych z pliku wejściowego, oraz search(key) sprawdzająca, czy key znajduje się w słowniku. Twój program powinien wywoływać procedurę makedict a następnie wypisywać do pliku wynikowego opis utworzonego słownika.
Postać pliku dane.in:
Ustalenia co do rodziny funkcji hashujących. Przyjmij, że funkcja pierwotna i funkcje wtórne są losowane z rodzin funkcji hashujących postaci Hp,l={ha : a=áa1,a2,...,alñ, gdzie "i aiÎ Zp}. Wartością funkcji ha z rodziny Hp,l dla napisu x1x2...xl jest
(åaic(xi)) mod p,
gdzie c(xi) jest kodem ASCII litery xi modulo 32. Przyjmij, że napisy o długości mniejszej od l uzupełniane są z prawej strony spacjami (zwróć uwagę, że c(spacja)=0).
W pliku wynikowym (jest to plik tekstowy) znajdują się:
Wymagane pliki: statdict<nazwisko> programstatdict<nazwisko>
Przykładowe dane i wyniki:
dane.in
3 2
aa
ab
ba
wyniki.out
3 1 2
3 1 1
3 1 1
3 1 1
Napisz moduły obsługujące kopiec minimaksowy oraz zwykły kopiec. Następne użyj ich w programie implementującym podwójną kolejkę priorytetową.
Postać pliku dane.in:
W pliku wynikowym powinien znaleźć się ciąg n liczb, na i-tym miejscu powinna znaleźć się liczba, której dotyczyła i-ta operacja (insert, deletemin lub deletemax). Ponadto wypisz na standardowe wyjście liczbę całkowitą równą czasowi w milisekundach wykonania ciągu operacji przy obydwu implementacjach kolejki.
Wymagane pliki: mmheap<nazwisko> programmmheap<nazwisko> heap<nazwisko> programheap<nazwisko>
Przykładowe dane i wyniki:
dane.in
3
5
i,2
i,1
i,3
d
D
wyniki.out
2
1
3
1
3
Napisz moduły obsługujące drzewa samoorganizujące się oraz drzewa AVL. Następnie wykorzystaj do porównania średniego czasu dostępu do elementów drzewa dla przykładowych danych.
Postać pliku dane.in:
W pliku wyjściowym powinien znaleźć się ciąg złożony z (oddzielonych spacjami) zer i jedynek - na i-tym miejscu powinna znaleźć się cyfra 0 jeśli i-ta operacja search zakończyła się niepowodzeniem, a 1 w przeciwnym przypadku. Ponadto wypisz na standardowe wyjście liczbę rzeczywistą równą odpowiednio średniej liczbie porównań wykonywanych podczas jednej operacji w drzewie.
Wymagane pliki: avl<nazwisko> programavl<nazwisko> splaytree<nazwisko> programsplaytree<nazwisko>
Przykładowe dane i wyniki:
dane.in
7
i,1
i,2
i,3
s,4
d,2
s,2
s,1
wyniki.out
0 0 1
Napisz moduły obsługujące drzewa samoorganizujące się i drzewa czerwono-czarne. Następnie wykorzystaj do porównania średniego czasu dostępu do elementów drzewa dla przykładowych danych.
Postać pliku dane.in:
o w pierwszym wierszu znajduje się n – liczba operacji;
o w każdym z kolejnych n wierszy znajduje się opis jednej operacji na drzewie; opis ten ma postać pary op,klucz, gdzie op jest jedną z liter {i,s,d} oznaczających odpowiednio insert, search i delete, a klucz jest liczbą naturalną.
W pliku wyjściowym powinien znaleźć się ciąg złożony z (oddzielonych spacjami) zer i jedynek - na i-tym miejscu powinna znaleźć się cyfra 0, jeśli i-ta operacja search zakończyła się niepowodzeniem, a 1 - w przeciwnym przypadku. Ponadto wypisz na standardowe wyjście liczbę rzeczywistą równą odpowiednio średniej liczbie porównań wykonywanych podczas jednej operacji w drzewie.
Wymagane pliki: redblack<nazwisko> programredblack<nazwisko> splaytree<nazwisko> programsplaytree<nazwisko>
Przykładowe dane i wyniki:
dane.in
7
i,1
i,2
i,3
s,4
d,2
s,2
s,1
wyniki.out
0 0 1
Napisz moduły obsługujące kopce dwumianowe w wersji eager i wersji lazy. Następnie wykorzystaj je do porównania efektywności tych dwóch wersji.
Postać pliku dane.in:
1. w pierwszym wierszu znajduje się n – liczba operacji;
2. w każdym z kolejnych n wierszy znajduje się opis jednej operacji na kopcu według poniższego formatu:
W pliku wyjściowym powinien znaleźć się ciąg kluczy - na i-tym miejscu klucz usunięty w i-tej operacji deletemin. Ponadto wypisz na standardowe wyjście liczbę całkowitą podającą w milisekundach czas wykonania przykładowego ciągu operacji.
Wymagane pliki: binheapeager<nazwisko> programbinheapeager<nazwisko> binheaplazy<nazwisko> programbinheaplazy<nazwisko>
Przykładowe dane i wyniki:
dane.in
8
c A
i A 2
i A 3
c B
i B 1
d A
m A B
d A
wyniki.out
2
1
Napisz moduł obsługujący operacje na drzewiastej strukturze dla Union-Find. Zaimplementuj dwie wersje operacji find: jedną z kompresją ścieżek wykonywaną w sposób podany na wykładzie; drugą z kompresją wykonywaną przez podczepianie wierzchołków pod swoim dziadkiem. Następnie wykorzystaj w programie znajdującym liczbę spójnych składowych grafu.
Postać pliku dane.in:
o w pierwszym wierszu znajduje się n – liczba wierzchołków grafu
o w drugim wierszu znajduje się m – liczba krawędzi grafu
o w każdym z kolejnych m wierszy znajduje się para liczb naturalnych nie większych od n opisująca krawędź grafu.
W pliku wyjściowym mają znaleźć się :
o w pierwszym wierszu – liczba naturalna równa liczbie składowych spójności grafu
o w drugim wierszu - dwie liczby naturalne oznaczające czasy w milisekundach znajdowania liczby składowych przez program stosujący pierwszą i (odpowiednio) drugą metodę kompresji ścieżek
o w drugim wierszu - dwie liczby rzeczywiste oznaczające średnią głębokość wierzchołków, do których stosowano find w trakcie obliczeń programu stosującego poszczególne metody kompresji ścieżek.
Wymagane pliki: uf<nazwisko> programuf<nazwisko>
Przykładowe dane i wyniki:
dane.in
5
4
1 3
4 3
2 5
4 1
wyniki.out
2
2 2
2.71828183 3.14159265