Projekt Programistyczny „Struktury Danych”

Ogólne informacje

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.

Lista projektów

Projekt 2.1

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

Projekt 2.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

Projekt 2.3

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,...,a­lñ, gdzie "i aiÎ Zp}.  Wartością funkcji ha  z rodziny Hp,l dla napisu x1x2...x­l 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

Projekt 2.4

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

Projekt 2.5

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

Projekt 2.6

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

Projekt 2.7

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
 

Projekt 2.8

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