Algorytmy i złożoność 2016/2017 - Studia zaoczne. Opisy projektów.
Transkrypt
Algorytmy i złożoność 2016/2017 - Studia zaoczne. Opisy projektów.
Algorytmy i złożoność 2016/17 – studia zaoczne Projekty zaliczeniowe. Warunki zaliczenia przedmiotu. W semestrze ogłoszone zostaną trzy projekty. Za każdy z nich będzie można otrzymać do 10 punktów, przy czym oceny powyżej siedmiu punktów przewidziane są dla projektów wykraczających poza zasadnicze ramy zadania. Dodatkowy, czwarty projekt będzie ogłoszony w ramach zaliczenia poprawkowego. Każdy projekt będzie miał ściśle określony termin zwrotu. Jeżeli ktoś przekroczy ten termin o mniej niż tydzień, będzie mógł liczyć na maksymalnie 4 punkty. Dłuższe spóźnienie skutkuje automatycznym niezaliczeniem projektu. Ponadto jeden punkt można otrzymać za sensowną aktywność na zajęciach. Powiązanie punktów z oceną: punkty ocena 11 - 19 3 14 - 16 3+ 17 - 19 4 20 - 22 4+ 23 lub więcej 5 Projekty należy przysyłać na adres [email protected]. Proszę o tytuł maila sformatowany wg następującego wzorca: Projekt A – Jan Iksiński Projekt A Funkcja void Permute(int * tab, int n) otrzymuje jako argumenty wskaźnik do tablicy liczb całkowitych i długość tej tablicy. Jej zadaniem jest dokonanie losowej permutacji liczb w tablicy. Dobra funkcja to taka, która każdą permutację generuje z tym samym prawdopodobieństwem. Proszę o napisanie dwóch wersji pow. funkcji – z wykorzystaniem algorytmu, który losuje kolejne wyrazy tablicy, oraz algorytmu Knutha (por. https://en.wikipedia.org/wiki/Random_permutation). Proszę następnie o: 1. porównanie czasów działania funkcji dla rosnącego ciągu długości tablicy (mile widziane ujęcie tego w formie wykresu) 2. zaproponowanie jakiejś metody sprawdzenia, na ile dana funkcja jest „dobra” - czyli, czy losuje permutacje „sprawiedliwie”. Projekt B Wersja 1. Zmodyfikować algorytm sortowania kubełkowego tak, żeby uwzględniał możliwość, że liczby w tablicy zostały wylosowane z rozkładem prawdopodobieństwa innym niż jednostajny. Pomysł jest taki, że algorytm wstępnie losuje jakąś próbkę z tablicy, i na podstawie tej próbki dobiera ilość i rozmiary „kubełków”. Sprawdzić doświadczalnie, czy zastosowany algorytm jest średnio lepszy od poprzedniego. Można w tym celu wypełniać tablicę liczbami losowymi w różny sposób, np.: tab[i] = rand()%zakres; lub tab[i] = rand()%(zakres/3)+rand()%(zakres/3)+rand()%(zakres/3); albo tab[i] = pow( rand()%pow(zakres,2), 0.5) ; Wersja 2. Sprawdzić doświadczalnie działanie algorytmu sortowania Shella. Wykorzystać trzy klasyczne ciągi kroków znane z wikipedii, oraz dwa własne. Wersja druga pozwoli uzyskać standardowe 10 pkt, wersja pierwsza nawet więcej. Termin nadsyłania prac – do 11 grudnia (zajęcia mamy 12go) Projekt C Wersja 1. Posortować alfabetycznie wyrazy jakiegoś wybranego długiego tekstu (może być np. ten: https://wolnelektury.pl/media/book/txt/lalka-tom-pierwszy.txt). Wykorzystać w tym celu sortowanie pozycyjne. Zwrócić uwagę na fakt, że wyrazy nie są jednakowej długości. Wersja 2. Zbadać doświadczalnie zależność między ilością węzłów a wysokością drzewa BST stworzonego losowo. Przebadać drzewa o ilości węzłów 10 000, 20 000, … , 100 000. Badanie przeprowadzić trzykrotnie, za pierwszym razem losując liczby z przedziału [1, 10], za drugim z przedziału [1, 1000], a za trzecim z całego zakresu funkcji Rand(). Proszę przysłać przed zajęciami.