Αλγόριθμοι και Πολυπλοκότητα
Topic outline
- Γενικά
Γενικά
Διδάσκοντες
- Άρης Παγουρτζής, Αναπληρωτής Καθηγητής (pagour@cs.ntua.gr)
- Δώρα Σούλιου, Ε.ΔΙ.Π (dsouliou@mail.ntua.gr)
- Νίκος Λεονάρδος, postdoc (nleon@cs.ntua.gr)
Πρόσθετες διαλέξεις για μεταπτυχιακούς (σελίδα μεταπτυχιακού μαθήματος):- Στάθης Ζάχος, Καθηγητής (zachos@cs.ntua.gr)
- Δημήτρης Σακαβάλας, postdoc (sakaval@corelab.ntua.gr)
Βοηθοί Διδασκαλίας
- Αντώνης Αντωνόπουλος, Υ.Δ. (aanton@corelab.ntua.gr)
- Λουκάς Κάβουρας, Υ.Δ.
- Αγγελική Μαθιουδάκη, Υ.Δ.
- Στρατής Σκουλάκης, Υ.Δ. (sskoul@corelab.ntua.gr)
- Αγγελική Χαλκή, Υ.Δ.(achalki@corelab.ntua.gr)
Βοηθοί Εργαστηρίου και Γραπτών Ασκήσεων
- Κωνσταντίνος Αμεράνης
- Ευαγγελία Γεργατσούλη
- Νίκος Ζαρίφης
- Βασίλης Κοντονής
- Παναγιώτης Κωστοπαναγιώτης
- Ανδρέας Ματζόρι
- Αλέξανδρος Τσιγώνιας
Διαλέξεις
- κάθε Δευτέρα 15:00-17:00 (Αμφιθέατρο 1, νέο κτήριο Ηλεκτρολόγων)
- κάθε Πέμπτη 17:00-19:00 (Αμφιθέατρο 1, νέο κτήριο Ηλεκτρολόγων)
Ώρες Γραφείου
- κάθε Τρίτη 14:00-15:00 στο εργαστήριο 1.1.3 (CoReLab) ή στο γρ. 1.1.14 του κτηρίου Ηλεκτρολόγων.
- κάθε Πέμπτη 16:00-17:00 στο εργαστήριο 1.1.3 (CoReLab) ή στο γρ. 1.1.14 του κτηρίου Ηλεκτρολόγων.
- Υλικό
Υλικό
Διαφάνειες Μαθήματος
- Διάλεξη 2/10/2017: Διαδικαστικά-Οργανωτικά. Εισαγωγή - Βασικές Έννοιες.
- Διάλεξη 5/10/2017: Ασυμπτωτικός Συμβολισμός.
- Διάλεξη 9/10/2017: Δομές Δεδομένων. Ουρές Προτεραιότητας: Σωρός. Heapsort. Κάτω φράγμα ταξινόμησης με συγκρίσεις.
- Διάλεξη 12/10/2017: Ταξινόμηση σε γραμμικό χρόνο: counting sort, radix sort (διαφάνειες από το μάθημα του ΜΙΤ - δείτε επιπλέον: 1, 2, 3). Διαχείριση συνόλων: Union - Find.
- Διάλεξη 16/10/2017: Μέθοδος Διαίρει-και-Βασίλευε: mergesort, δένδρα αναδρομής (διαφ. 1-14).
- Διάλεξη 19/10/2017: Μέθοδος Διαίρει-και-Βασίλευε: Master Theorem, απόδειξη και εφαρμογές, πολλαπλασιασμός αριθμών και πινάκων (διαφ. 15-24).
- Διάλεξη 23/10/2017: Μέθοδος Διαίρει-και-Βασίλευε: πράξεις μεγάλων αριθμών, αριθμητική υπολοίπων, ανταλλαγή κλειδιού Diffie-Hellman. Αριθμοί Fibonacci (διαφ. 25-31).
- Διάλεξη 30/10/2017: Ταξινόμηση Quicksort: ανάλυση χειρότερης και μέσης περίπτωσης. Πιθανοτική Quicksort. Χωρική πολυπλοκότητα. Animated slides.
- Διάλεξη 2/11/2017: Το πρόβλημα της επιλογής: πιθανοτικός και ντετερμινιστικός αλγόριθμος.
- Διάλεξη 6/11/2017: Άπληστοι αλγόριθμοι: επιλογή δραστηριοτήτων, χρωματισμός διαστημάτων, κλασματικό σακίδιο. Βελτιστότητα υπο-λύσεων και άπληστης επιλογής.
- Διάλεξη 9/11/2017: Κωδικοποίηση Huffman: άπληστος αλγόριθμος, prefix-free κώδικες. Συζήτηση λύσεων 1ης σειράς γραπτών και 1ης σειράς προγραμματιστικών ασκήσεων.
- Διάλεξη 13/11/2017: Δυναμικός προγραμματισμός: διωνυμικοί συντελεστές, διακριτό πρόβλημα σακιδίου (0-1 Knapsack). Ψευδοπολυωνυμικοί αλγόριθμοι. (Διαφ. 1-13).
- Διάλεξη 20/11/2017: Δυναμικός προγραμματισμός. Βελτιωμένες μέθοδοι ΔΠ για 0-1 Knapsack: αναδρομή με απομνημόνευση, μέθοδος Nemhauser-Ullmann. Προβλήματα αθροίσματος υποσυνόλου και διαμέρισης. (Διαφ. 14-23)
- Διάλεξη 23/11/2017: Παραδείγματα δυναμικού προγραμματισμού: ελάχιστες διαδρομές σε DAG, μέγιστη αύξουσα υπακολουθία, διορθωτική απόσταση. (Διαφ. 1-86)
- Διάλεξη 30/11/2017: Αλγόριθμοι δυναμικού προγραμματισμού: αλυσιδωτός πολλαπλασιασμός πινάκων, πρόβλημα σακιδίου με επανάληψη, πρόβλημα πλανόδιου πωλητή. Διαφ: Παραδείγματα δυναμικού προγραμματισμού (87-112 & 146-170) και Δυναμικός προγραμματισμός (24-41).
- Διάλεξη 4/12/2017: Αλγόριθμοι γράφων. Αναζήτηση κατά Πλάτος (BFS). Αναζήτηση κατά Βάθος (DFS), τοπολογική διάταξη (Διαφ. 1-14).
- Διάλεξη 7/12/2017: Αλγόριθμοι γράφων. Ισχυρά συνεκτικές συνιστώσες μέσω DFS (Δαφ. 15-19). Συντομότερες διαδρομές: σ.δ. από μία αφετηρία, αλγόριθμος Bellmann-Ford, σ.δ. σε DAG (Διαφ. 1-16).
- Διάλεξη 11/12/2017: Συντομότερες διαδρομές. Αλγόριθμος Dijkstra. All-pairs shortest paths: αλγόριθμος Floyd-Warshall (Διαφ. 17-35). Ελάχιστα συνδετικά δένδρα: αλγόριθμοι Prim, Kruskal, Boruvka.
- Διάλεξη 18/12/2017: Το πρόβλημα Μέγιστης Ροής - Ελάχιστης Τομής. Αλγόριθμος Ford-Fulkerson, βελτιώσεις Edmonds-Karp. Αναγωγή του προβλήματος Μέγιστου Ταιριάσματος στο πρόβλημα Μέγιστης Ροής.
- Διάλεξη 19/12/2017: (Έκτακτο μάθημα) Συζήτηση λύσεων 2ης σειράς γραπτών και 2ης σειράς προγραμματιστικών ασκήσεων.
- Διάλεξη 21/12/2017: Μηχανές Turing και Υπολογισιμότητα. Έλεγχος παλίνδρομων: άνω φράγματα σε ΤΜ με 1 και 2 ταινίες. Πολυπλοκότητα επικοινωνίας (communication complexity): ιδιότητα τετραγώνου, κάτω φράγματα για έλεγχο ισότητας και παλίνδρομων. (Σημειώσεις Ν. Λεονάρδου.)
- Διάλεξη 8/1/2018: Πολυπλοκότητα, αναγωγές, πληρότητα (διαφ. 1-10). Συζήτηση κάτω φράγματος πολλαπλασιασμού και αναφορά άνω φραγμάτων. Αναγωγή ύπαρξης τριγώνου σε γράφο στον τετραγωνισμό πίνακα. Αναγωγή πολλαπλασιασμού πινάκων στον τετραγωνισμό πίνακα. Αναγωγή ταξινόμησης στην κατασκευή Huffman code. (Σημειώσεις Ν. Λεονάρδου.)
- Διάλεξη 11/1/2018: Προβλήματα ικανοποιησιμότητας λογικών προτάσεων: SAT, kCNF, 3CNF, DNF in P, 2CNF in P (Πολυπλοκότητα, αναγωγές, πληρότητα διαφ. 11-12). Αλγόριθμοι για το πρόβλημα Vertex cover: ακριβής, παραμετρικός, προσεγγιστικός (σημειώσεις Ν. Λεονάρδου).
- Διάλεξη 18/1/2018: Μη-ντεντερμινισμός, NP-πληρότητα. (Δείτε και διαφ. Στ. Νικολόπουλου.)
Σημειώσεις - Συμπληρωματικό Υλικό
- Προγραμματιστικές Ασκήσεις: Μια απλή συνάρτηση σε C για να διαβάζετε γρήγορα την είσοδο όταν αυτή αποτελείται από μη αρνητικούς ακέραιους και τα testcases είναι πολύ μεγάλα.
- Σύντομη Εισαγωγή στη Θεωρία Γραφημάτων (σημειώσεις του Δ. Φωτάκη). Για τις βασικές έννοιες της Θεωρίας Γραφημάτων δείτε ακόμη τις ακόλουθες διαφάνειες: Εισαγωγή στη Θεωρία Γραφημάτων, και Βασικές Έννοιες της Θεωρίας Γραφημάτων: 1η, 2η, και 3η σειρά.
- Συμπληρωματικές σημειώσεις του Δ. Φωτάκη. Καλύπτουν μόνο ένα μέρος της ύλης του μαθήματος.
- Εξαιρετικές σημειώσεις του Jeff Erickson σε δυναμικό προγραμματισμό (με πολλά παραδείγματα και πολλές ασκήσεις).
- Ένα ενδιαφέρον άρθρο από τον Bernard Chazelle: The Algorithm: Idiom of Modern Science.
- Ένα ενδιαφέρον άρθρο από τον Jeff Ullman σχετικά με την θεωρητική και την πειραματική αξιολόγηση των αλγορίθμων: Experiments as Research Validation – Have We Gone too Far?
- Ένα review από τους Andrew Goldberg και Robert Tarjan των γνωστών αποδοτικών αλγόριθμων για το πρόβλημα της Μέγιστης Ροής. Το review είναι εξαιρετικά ενδιαφέρον, το ίδιο και το video για τη σημασία και τις εφαρμογές του προβλήματος.
Προτεινόμενες Ασκήσεις (με τις λύσεις τους) και Παραδείγματα
- 1η σειρά: Ασυμπτωτικός συμβολισμός, αναδρομικές σχέσεις, ταξινόμηση.
- 2η σειρά: Άπληστοι αλγόριθμοι, δυναμικός προγραμματισμός.
- 3η σειρά: Αλγόριθμοι γραφημάτων, Ελάχιστο Συνδετικό Δέντρο.
- 4η σειρά: Συντομότερα Μονοπάτια, Μέγιστη Ροή, Αναγωγές.
- 5η σειρά: Παραδείγματα αναγωγών (διαφάνειες).
Βιβλιογραφία
- Thomas Cormen, Charles Leiserson, Ronald Rivest and Cliff Stein: "Introduction to Algorithms", 3rd edition, MIT Press, 2009.
- J. Kleinberg, E. Tardos: "Algorithm Design", Addison-Wesley, 2005.
- S. Dasgupta, C. H. Papadimitriou, and U. V. Vazirani: "Algorithms", MacGraw-Hill, 2006 (Μπορείτε να βρείτε draft έκδοση του βιβλίου αυτού εδώ).
- J. Edmonds. How to Think About Algorithms. Cambridge University Press, 2008.
- G. Brassard, P. Bratley: "Algorithmics: Theory and Practice", Prentice-Hall.
- Sara Baase, Allen Van Gelder, "Computer Algorithms: Introduction to Design and Analysis", 3rd edition, Addison Wesley Longman, 2000.
- Alfred V. Aho, John E. Hopcroft, "The Design and Analysis of Computer Algorithms", Addison-Wesley Series in Computer Science and Information Processing, 1974.
- Dexter C. Kozen, "The Design and Analysis of Algorithms", Springer, 1991.
- A. Levitin: "Ανάλυση και Σχεδίαση Αλγορίθμων", Εκδόσεις Τζιόλα, 2007.
- G. J. E. Rawlings: "Αλγόριθμοι: Ανάλυση και Σύγκριση", Εκδόσεις Κριτική, 2004.
- Ασκήσεις
Ασκήσεις
Γραπτές Ασκήσεις
1η σειρά: προθεσμία παράδοσης 27/10. Λύσεις.
2η σειρά: προθεσμία παράδοσης 22/11. Λύσεις.
3η σειρά: προθεσμία παράδοσης 27/12. Λύσεις.
4η σειρά: προθεσμία παράδοσης 12/2.
Προγραμματιστικές Ασκήσεις
1η σειρά: προθεσμία παράδοσης 5/11. Testcases. Λύσεις.
2η σειρά: προθεσμία παράδοσης 3/12. Testcases. Λύσεις.
3η σειρά: προθεσμία παράδοσης 7/1. Testcases.
4η σειρά: προθεσμία παράδοσης 12/2. Testcases.
Παρατηρήσεις για τις ασκήσεις
- Οι προγραμματιστικές ασκήσεις υποβάλλονται (source code) στον grader, και αξιολογούνται ηλεκτρονικά. Η προθεσμία υποβολής λήγει τα μεσάνυχτα της ημέρας παράδοσης. Για την υποβολή, θα χρησιμοποιήσετε τα login name και password που έχετε για το moodle του μαθήματος. Τα προγράμματά σας πρέπει να είναι σε C/C++, να διαβάζουν την είσοδο από το standard input, και να τυπώνουν την έξοδο στο standard output. Μια υποβολή θεωρείται επιτυχής (και συνεχίζει στο στάδιο της αξιολόγησης) αν "περάσει" επιτυχώς τα επιλεγμένα test cases για το αντίστοιχο ερώτημα. Η αξιολόγηση γίνεται με αντίστοιχα (κοινά για όλους, αλλά διαφορετικά από αυτά που ελέγχονται κατά την υποβολή) test cases, μετά την λήξη της προθεσμίας. Με κάθε άσκηση, θα δίνεται και ένας αριθμός test cases (με τις απαντήσεις τους), που μπορείτε να χρησιμοποιήσετε για προκαταρκτικό έλεγχο των λύσεων σας.
- Στις γραπτές ασκήσεις να γράφετε ονοματεπώνυμο και αριθμό μητρώου. Η υποβολή γίνεται αποκλειστικά στο moodle. Η προθεσμία λήγει στις 05:59 της επομένης της ημέρας παράδοσης. Εάν δοθεί παράταση θα ανακοινωθεί εδώ.
- Δεν γίνεται δεκτή η παράδοση ασκήσεων με e-mail.
- Συνεργασία επιτρέπεται και μάλιστα ενθαρρύνεται (εάν γίνεται σωστά, π.χ. αφού αφιερώσετε ικανό χρόνο ατομικής προσπάθειας), αλλά τελικά κάθε φοιτητής πρέπει να διατυπώσει μόνος του τη λύση. Πανομοιότυπες διατυπώσεις θα εκλαμβάνονται ως αντιγραφή και δεν θα προσμετράται ο βαθμός τους, ενώ πιθανόν να υπάρξουν συνέπειες για όλες τις σειρές ασκήσεων.
- Όλες οι σειρές ασκήσεων, γραπτές και προγραμματιστικές, θα παρουσιαστούν και στο εργαστήριο σε ημερομηνία που θα ανακοινωθεί αργότερα.
- Για απορίες πάνω στις ασκήσεις και στη θεωρία μπορείτε να έρχεστε στο CoReLab (κτ. ΗΜΜΥ 1.1.3) στις ώρες γραφείου.