Mariusz Borkowski - strona prywatna
Algorytmy i struktury danych
Table of Contents
Informacje organizacyjne
Projekty
Zasady rozliczenia zajęć projektowych - uwagi ogólne:
- Projekty jednoosobowe.
- Projekt składa się z 2 części:
- Tematyka oraz terminy oddania i obrony kolejnych zadań projektowych:
- ustalane z prowadzącym.
- Ocena końcowa to średnia z ocen otrzymanych za zadania projektowe (ocena pozytywna pod warunkiem zaliczenia każdego zadania na min. 3.0).
Zasady rozliczenia zadań projektowych programistyczny/algorytmicznych
- Programy powinny zostać napisane w środowisku Code::Blocks IDE w języku C/C++.
- W celu zaliczenia zadania projektowego należy
- dostarczyć kod programu i sprawozdanie:
- przesłać mailowo sprawozdanie (wersja elektroniczna) i przesłać działający kod programu (spakowany). Ww. pliki powinny być wysłane jako załącznik będący spakowanym archiwum w formacie .zip (UWAGA! Plików spakowanych w formacie .rar poczta uczelniana nie przepuści!) o nazwie ''PXX Nazwisko Imie'', gdzie ''XX'' to numer grupy projektowej, przykład ''P03 Kowalski Jan.zip'', lub
- zamieścić kod programu i sprawozdanie w jednym ze znanych repozytoriów (GitHub, GitLab, itp.) i podesłać mi link do niego
- obrona wybranego projektu osobiście (UWAGA: Na obronę przynosimy wydrukowane wersje sprawozdania.)
- dostarczyć kod programu i sprawozdanie:
Sprawozdanie powinno:
- być w formacie PDF (!!!)
- zawierać: stronę tytułową, wstęp, opis problemu, opis podstaw teoretycznych zagadnienia, opis szczegółów implementacji problemu, schemat blokowy algorytmu (a nie całego programu!!!) oraz sam algorytm zapisany w pseudokodzie, rezultaty testów wykonanych przy pomocy napisanego programu -> wykresy!!! (złożoność czasowa, obliczeniowa, czasy obliczeń), wnioski i podsumowanie. Jako appendix należy dodać kod programu.
- być napisane poprawną polszczyzną, z dbałościa o formatowanie tekstu (tekst wyjustowany(!!!), marginesy zachowane, strony ponumerowane, odnośniki do źródeł, rysunki/tabele podpisane etc.)
Wzory przyzwoicie sformatowanych dokumentów (na dole strony) - zacząć od tego (LaTeX!)
- Za nieoddanie zadania projektowego w ustalonym terminie ocena będzie adekwatnie obniżona.
- Wykonanie projektu z wykorzystaniem git/Githuba/Gitlaba itp. będzie mile widziane. (Dla osób zainteresowanych wykonaniem projektu z wykorzystaniem systemu Git - podstawy git).
- Wykonanie sprawozdania w LaTeXu będzie mile widziane.
Kod programu powinien zawierać przynajmniej dwie funkcje:
- główny kod programu powinien być zaimplementowany w oddzielnej funkcji, którą powina być wywoływana wewnątrz programu
- w głównym programie powinno zostać wykonane kilka testów sprawdzających działanie funkcji
- program powinien mieć możliwość odczytywania danych wejściowych i zapisu wyników do plików tekstowych
- kod powinien być opatrzony stosownymi komentarzami
- UWAGA: Jeśli w treści zadania nie jest wyraźnie napisane, że dane wejściowe należy posortować, to zadany problem należy rozwiązać bez wykorzystania algorytmów sortujących.
Prezentacje
- Czas trwania 10/15 min. (10/15 slajdów/przedstawienie przykładów na tablicy).
- Wykonanie prezentacji w LaTeX'u (Beamer) będzie mile widziane.
Tematy prezentacji
- Zasady dobrego programowania (wraz z przykładami): podział programu na funkcje, sensowne nazwy, komentarze komentarze i komentarze, poprawna interpretacja komunikatów interpretera/kompilatora, testowanie, debugowanie, najczęstsze błędy popełnianie w trakcie pisania programów (przepełnienie pamięci, wyciek pamięci, niepoprawne argumenty funkcji, użycie niepoprawnego wskaźnika, wartości niemieszczące się w zmiennych…).
- Złożoność obliczeniowa (przykłady, przykłady szacowania itd. itp.)
- System git / github/ gitlab (prezentacja "na żywo")
- Metody sprawdzania poprawności algorytmu
- Metoda niezmienników i półniezmienników, metoda szufladkowania Dirichleta
- Problemy klasy P, NP, NPC
- Problemy nierozstrzygalne
- Maszyna Turinga i jej odmiany
- Automaty skończone
- Heurystyka - heurystyczne techniki projektowania algorytmów
- Heurystyka: przeszukiwanie lokalne
- Heurystyka: algorytmy zachłanne
- Heurystyka: symulowane wyżarzanie
- Heurystyka: przeszukiwanie tabu
- Heurystyka: algorytmy genetyczne
- Algorytmy probabilistyczne
- Algorytmy zachłanne
- Metoda "dziel i zwyciężaj"
- Programowanie dynamiczne i metoda spamiętywania (najdłuższy wspólny podciąg, problem plecakowy)
- Drzewa BST
- Drzewa czerwono-czarne
- Grafy
- Algorytmy przeszukiwania grafów
- Słowniki
- Kryptografia (kodowanie symetryczne, asymetryczne, łamanie szyfrów)
- Prezentacja możliwości bibloteki STL standardu C++ (prezentacja "na żywo")
- Algorytmy geometryczne (problem przynależności, otoczka wypukła, metoda zamiatania…)
- Kolejka priorytetowa
- Kopiec binarny
- Minimalne drzewo rozpinające
- System składu tekstu LaTeX (+ Beamer).
Zalecana literatura:
- Jacek Krzaczkowski - Algorytmika dla początkujących
- Donald E. Knuth - Sztuka programowania
- Rytter Wojciech, Diks Krzysztof, Banachowski Lech - Algorytmy i struktury danych
- Thomas H. Cormen, Charles E. Leiserson, Roland L. Rivest, Clifford Stein - Wprowadzenie do algorytmów
- Piotr Wróblewski - Algorytmy, struktury danych i techniki programowania
- David Harel - Rzecz o istocie informatyki - Algorytmika
- Christos H. Papadimitriou - Computational Complexity