Wstęp do informatyki II
Semestr letni
Materiały archiwalne
Część zajęć będzie się odbywać w laboratorium komputerowym, pozostałe będą prowadzone w trybie "tablicowym".
W laboratorium będziemy pracowali w systemie Linux. Programy będziemy pisać w języku C. Ze względu na prawie stuprocentową przenośność kodu w języku C, można będzie testować tworzone w LABie programy w innych środowiskach programistycznych, takich, jak popularne w systemie Windows środowiska Microsoft Visual Studio lub Clang.
Aktualności
Najbliższe zajęcia: kartkówka.
Pisząc programy, zachowujcie Państwo ich czytelną strukturę i dodawajcie wyraziste komentarze - co prawda kompilatorowi jest obojętne, jak zapisujecie program (byleby tylko syntax był poprawny) - ale za to Wam będzie znacznie wygodniej je czytać, sprawdzać, analizować...
Treści omawiane na zajęciach
- 13.05.09., SALA
Znajdowanie silnych składowych w grafie. Wstęp do problemu najkrótszych ścieżek.
- Czym jest GT, gdy G jest macierzą sąsiedztwa
- Przypomnienie algorytmu DFS
- Algorytm znajdowania DFS
- Realizacja algorytmu na przykładowych grafach. Graf zredukowany.
- Acykliczność grafu zredukowanego
- Do zastanowienia w domu: jak uspójnić graf dodając doń możliwie mało krawędzi?
- 06.05.09., LAB
Inne zadania związanie z grafami rzadkimi - przykład: wyznaczanie rankingu stron internetowych algorytmem PageRank, kiedyś stosowanym w Google.
- Jeszcze jeden sposób reprezentacji grafu rzadkiego: macierz rzadka w formacie współrzędnych
- Wczytywanie grafu rzadkiego z pliku
- Mnożenie macierzy rzadkiej przez wektor (na razie w wersji bardzo wolnej)
- Jak pokonywać problem webringów oraz istnienia liści w grafie: wersja z grafem pełnym, dodajemy ścieżki o (zwykle bardzo małej, ale niezerowej wadze) (chociaż w implementacji PageRank wciąż rzadkim! - dzięki znakomitej własności mnożenia wektora przez macierz jedynkową)
- Pierwszy testowy graf (oryginalny graf linków dla naszego wydziałowego portalu): macierz lab.txt. Ta macierz nie jest stochastyczna, bo w grafie są liście, tzn. strony z których nie ma żadnych linków.
Praca domowa
Na za tydzień. Rozwiązaniem obu zadań jest 5 par liczb z opisem.
- Opracuj funkcję mnożenia SparseMult() znacznie szybciej działającą od SparseMultSlow() z programu opracowanego w labie.
- Uruchom nasz algorytm PageRank na grafie (bez liści i bez webringów) danym w pliku test.txt (pierwszy wiersz zawiera liczbę węzłów i liczbę krawędzi w grafie) Podaj indeksy i rangę 5 stron o najwyższym rankingu. Uwaga: tego zadania nie da się zrobić bez zadania poprzedniego ;-)
- 29,04.09., SALA
Algorytm DFS. Parę uwag o kolokwium.
- Struktury danych dla DFS (zob. także praca domowa poniżej).
- Przykładowe DFS na przykładowym grafie
- Klasyfikacja krawędzi.
- Częściowa charakteryzacja krawędzi przez czasy dojścia i czasy przetworzenia. Częściowa charakteryzacja przez kolory wierzchołków.
- Wyznaczanie typu krawędzi w trakcie DFS przez sprawdzenie czasów dojścia i kolorów.
Praca domowa
- Implementacja DFS w C (na za 2 tygodnie). Na zajęciach, aby reprezentować otrzymywany las, skorzystaliśmy z listy drzew, gdzie każde drzewo reprezentowaliśmy przez listę sąsiedztwa!(!!) To znaczące marnotrawstwo i niepotrzebna komplikacja! Postaraj się obmyślić (możesz też po prostu sprawdzić w wykładzie lub szukać inspiracji w algorytmie BFS z ćwiczeń), czy możliwe jest znacznie tańsze rozwiązanie tego problemu, wykorzystujące po prostu jedną tablicę rozmiaru |V|. To nie tylko uprości struktury danych, ale także samą implementację algorytmu DFS!
- Kilka drobnych zadań podanych na zajęciach, m.in. rodzaje krawędzi w grafie nieskierowanym oraz przeprowadzenie DFS z wierzchołka "F" grafu z ćwiczeń. Te zadania na za tydzień.
- 22,04.09., SALA
MST.
- Wyznaczanie MST algorytmem Kruskala vs. wyznaczanie algorytmem Prima (przykład)
- (Nie)jednoznaczność MST.
- (Któraś) najlżejsza krawędź musi należeć do MST.
- Wstępne rozważania o pierwszym zadaniu z pracy domowej.
Praca domowa
- Maksymalna liczba drzew w nieskierowanym grafie pełnym.
- Jednoznaczność MST, gdy wszystkie krawędzie mają różne wagi.
- 08.04.09, SALA
Grafy, ich implementacja i przeszukiwanie.
- Grafy skierowane i nieskierowane. Reprezentacja listowa i macierzowa.
- Implementacja obu reprezentacji grafu.
- Podstawowe własności grafów. Obliczanie stopnia zadanego wierzchołka itp.
- Algorytm BFS i jego implementacja z użyciem kolejki.
Praca domowa
Coś ostrzejszego do wielkanocnego jajeczka. Na najbliższe zajęcia.
- Podaj algorytm sprawdzenia, czy dany graf nieskierowany jest spójny. Uzasadnij.
- Podaj algorytm, który w czasie O(|V|) sprawdzi, czy dany graf skierowany, reprezentowany przez macierz sąsiedztwa, ma choć jeden wierzchołek o stopniu wejściowym |V|-1 i wyjściowym równym zero. Taki wierzchołek nazywa się czasem ujściem uniwersalnym lub VIPem (znają go wszyscy, a on tylko siebie; hmm....).. Uzasadnij poprawność tego algorytmu.
- Macierz incydencji grafu skierowanego to macierz B wymiaru |V| x |E| taka, że
- Bij = -1, gdy krawędź j wychodzi z wierzchołka i,
- Bij = +1, gdy krawędź j wchodzi do wierzchołka i,
- Bij = 0, w przeciwnym przypadku.
Podaj interpretację macierzy B*BT.
- 01.04.09., SALA
Kodowanie Huffmana (zobacz także zabawną animację). Kilka funkcji C przydatnych przy implementacji programu zaliczeniowego.
- Konstrukcja drzewa Huffmana i średnia długość kodu Huffmana.
- Kodowanie kodem Huffmana.
- Dekodowanie kodu Huffmana.
- Kodowanie Huffmana parami.
- 25.03.09., SALA/LAB
Mikrokolokwium (20 min.; tematyka: listy, drzewa binarne i BST). Drzewa AVL. "Sadzenie" drzew (BST i AVL) to może być także fajna zabawa!
- Wstawianie do drzewa AVL. Wszelkie możliwe rotacje i jak je robić.
- Usuwanie wierzchołka z drzewa AVL.
Praca domowa
Dwa zadania, dokładnie sformułowane na ćwiczeniach. Oddajemy na kartkach, najpóźniej na następnych zajęciach.
- Wstawianie kolejnych wierzchołków o rosnących kluczach do drzewa AVL.
- Drzewo przed każdą rotacją (z opisem).
- 18.03.09., SALA/LAB
Nieudane próby napisania procedur obsługujących drzewo BST:
- Tworzenie drzewa BST z losowymi kluczami będąymi znakami 'a'...'z' typu
unsigned char
.
- Sprawdzenie, czy utworzone drzewo jest faktycznie drzewem BST.
- Wypisanie drzewa w zadanym porządku.
- Usunięcie całego drzewa z pamięci.
Zobacz przykładowe rozwiązania na blogu z programami!
Praca domowa
Dokończyć zadania z zajęć (przykładowe rozwiązania na blogu z programami; zajrzyj w razie trudności z samodzielnym opracowywaniem programów, ale nie przepisuj!) Przygotować się do mikrokolokwium na następne zajęcia. Tematyka: listy, drzewa binarne i BST.
- 11.03.09., SALA
Drzewa (binarne) i drzewa BST (tzn. takie, których wierzchołki mają następującą własność: wszystkie wierzchołki lewego (odpowiednio: prawego) poddrzewa mają klucze nie większe (odpowiednio: nie mniejsze) od klucza danego wierzchołka.
- Implementacja drzewa w C
- Konstrukcja drzew BST
- Wyszukiwanie w drzewie BST (z rekurencją i bez rekurencji).
- Wypisywanie zawartości drzewa (w porządkach: pre-order, in-order oraz post-order)
- Sortowanie zawartości drzewa BST
- Liczenie wierzchołków drzewa
Praca domowa
Programy i procedury, o których mowa - ich kody źródłowe w języku C, a nie pliki wykonywalne - należy przesłać na mój adres email, piotr.krzyzanowski@mimuw.edu.pl, do 25. marca (środa), do godz. 9:00 (decyduje chwila dotarcia wiadomości do mojej skrzynki pocztowej). Każdy z "elementarnych" podpunktów jest wart maksymalnie 3 punkty. Zdanie na kartce oddajemy na zajęciach 25. marca (lub wcześniejszych).
- (niepunktowane) Proszę popraw pierwsze zadanie tak, by wszystkie wskazane drzewa miały własność BST.
- Napisz (na kartce) procedurę w C wyznaczającą wysokość drzewa. Pamiętaj, by zdefiniować stosowny typ "drzewiasty".
- Zaimplementuj w C procedurę tworzenia drzwa BST o kluczach będących kolejnymi liczbami w zadanej N-elementowej tablicy liczb rzeczywistych.
- Zaimplementuj także (jedną) procedurę wypisywania zawartości otrzymanego drzewa w jednym z możliwych do wyboru porządków: pre-order, in-order oraz post-order.
- Testuj obie procedury w jakimś sensownym programie. Nie zapomnij o Makefile, jeśli jest potrzebny.
- 04.03.09., SALA
Listy.
- Wstawianie do listy, wyszukiwanie w liście, usuwanie z listy elementu spełniającego warunek
- Implementacja listy w C.
Praca domowa
Programy i procedury, o których mowa - ich kody źródłowe w języku C, a nie pliki wykonywalne - należy przesłać na mój adres email, piotr.krzyzanowski@mimuw.edu.pl, do 13. marca (piątek!), do godz. 9:00 (decyduje chwila dotarcia wiadomości do mojej skrzynki pocztowej). Każdy z "elementarnych" podpunktów jest wart maksymalnie 3 punkty.
- Zaimplementuj następujące procedury dla listy jednokierunkowej o kluczach będących liczbami całkowitymi :
- Tworzenie listy składającej się z N kolejnych liczb: 1 (w głowie), 2, 3, ..., N (w ogonie)
- Drukowanie jej pełnej zawartości od głowy do ogona
- Usuwanie z listy pierwszego elementu, którego klucz jest równy zadanej liczbie całkowitej v.
- Dodatkowe (nieobowiązkowe, ale można dostać dodatkowe punkty): Odwracanie kolejności elementów na liście.
- Wykorzystaj te procedury w programie, w którym: utworzysz listę zadanego rozmiaru N, wypiszesz ją, następnie usuniesz element o kluczu 0, wypiszesz, usuniesz element o kluczu 1, wypiszesz i na końcu usuniesz element o kluczu N i wypiszesz pozostałą listę.
- Dodatkowe (wariant trudniejszy, punktowany dodatkowe 3 punkty):
procedury obsługi listy umieść w pliku lista.c (pamiętaj o zrobieniu pliku nagłówkowego lista.h), a program testujący - w pliku testlista.c; oczywiście, powinieneś utworzyć do kompletu elegancki Makefile...
- 25.02.09., LAB
Dynamiczna alokacja pamięci. Dalszy rozwój biblioteczki macierzowej z poprzednich zajęć. Kilka ciekawostek z arytmetyki zmiennoprzecinkowej, jeśli czas pozwoli.
- Alokacja macierzy 2-wymiarowej i jej obsługa, zobacz pliki z LABu
- Wyznaczanie epsilona maszynowego
- 18.02.09., LAB
Projekty złożone z wielu plików.
- Zaczynamy tworzyć "biblioteczkę" funkcji macierzowych, zob. pliki c1-mx1.c i c1-mx1.h dla biblioteczki wektorowej (tablice 1-wymiarowe). Na zajęciach nie udało nam się (z powodu mojego błędu) wygenerować analogicznej biblioteczki dla tablic dwuwymiarowych, będziemy to robili na następnych zajęciach.
- Budowanie projektu etapami (kompilacja i linkowanie).
- Polecenie make i konstrukcja pliku Makefile.
Praca domowa
W tym tygodniu praca domowa nie jest obowiązkowa!
- Do zestawu procedur z c1-mx1.c dodaj procedurę generującą wektor zawierający losowe liczby rzeczywiste z przedziału [0,1] oraz funkcję obliczającą normę Euklidesową wektora.
- Obie funkcje wykorzystaj w pliku c1-testmx.c.
Zasady zaliczenia
Podstawy zostały sformułowane na pierwszym wykładzie. Na ocenę z ćwiczeń składają się:
Kartkówki będą mini-zadaniami na tematy różne. Może to być jakieś zadanie do rozwiązania na kartce, sprawdzenie znajomości zagadnień z wykładu, czy też zaprogramowanie czegoś małego przy komputerze.
Prace domowe będą zadawane z tygodnia na tydzień. Po terminie prace nie będą sprawdzane.
Za każde zadanie z pracy domowej można otrzymać maksymalnie 3 punkty. Za każde zadanie z kartkówki można dostać maksymalnie 1 punkt. Program zaliczeniowy będzie oceniany w skali 10-punktowej. Suma uzyskanych punktów z prac domowych i kartkówek zostanie na koniec semestru znormalizowana tak, by 100% punktów było równe maksimum punktów do uzyskania z kolokwium; tak samo zostanie znormalizowana ocena z programu zaliczeniowego.
Ostateczna liczba punktów uzyskanych z ćwiczeń będzie wyliczona według wzoru P = 0.3*D + 0.3*Z + 0.4*K, gdzie D - znormalizowana suma punktów z prac domowych i kartkówek, Z - znormalizowana suma punktów z programu zaliczeniowego, K - znormalizowana suma punktów z kolokwium.
Ciekawe linki