ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Τµήµα Πληροφορικής Φθινοπωρινό Εξάµηνο 2017-2018 Ευάγγελος Μαρκάκης Επικ. Καθηγητής
Δοµές Δεδοµένων Ένα βήµα µετά τη Java 1 και τη Java 2 Από τα σηµαντικότερα µαθήµατα του πυρήνα της Επιστήµης Υπολογιστών Μην το σκέφτεστε σαν προγραµµατιστικό µάθηµα (σίγουρα όχι σαν Java 3) Επίκεντρο του µαθήµατος: Σχεδίαση και ανάλυση, η υλοποίηση έρχεται στο τέλος Χρήσιµο και για επόµενα µαθήµατα: Αλγόριθµοι, Βάσεις Δεδοµένων, κτλ Δοµές Δεδοµένων 01-2
Τι θα µελετήσουµε? Πίνακες Β-δέντρα Δέντρα κόκκινου- µαύρου Δέντρα Σωροί Τυχαιοποιηµένα Δέντρα Ουρές προτεραιότητας Ουρές FIFO Δοµές Δεδοµένων 01-3
Τι είναι οι Δοµές Δεδοµένων? Δοµές Δεδοµένων 01-4
Τι είναι οι Δοµές Δεδοµένων? Webopedia: A scheme for organizing related pieces of information Wordnet: the organization of data (and its storage allocations in a computer) Wikipedia: a particular way of storing and organizing data in a computer so that it can be used efficiently. Wiktionary: An organization in software of data that allows more optimal searching, categorizing, or storage of information Δοµές Δεδοµένων 01-5
Αντικείµενο του µαθήµατος 1. Βασικές δοµές δεδοµένων Πίνακες, λίστες, ουρές, στοίβες, σωροί, δέντρα,... 2. Χρήση δοµών στην ανάπτυξη προγραµµάτων 3. Ρόλος δοµών στην αποδοτική υλοποίηση αλγορίθµων Θέµατα πολυπλοκότητας, χρήση χώρου/χρόνου Μια καλή ιδέα χρησιµοποιώντας τη λάθος δοµή µπορεί να χαραµισθεί 4. Ανεξαρτησία από γλώσσα προγραµµατισµού 5. Πρακτική εφαρµογή µέσω εργασιών σε Java Δοµές Δεδοµένων 01-6
Αντικείµενο του µαθήµατος Απαιτούµενες γνώσεις Στοιχειώδης γνώση τουλάχιστον 1 γλώσσας προγραµµατισµού Προαπαιτούµενα: Να έχετε περάσει ένα εκ των: Εισαγωγή στον Προγραµµατισµό Υπολογιστών (Java I) Προγραµµατισµός Υπολογιστών µε Java (Java II) Ισχύει για 2ετείς, 3ετείς και 4ετείς Δεν µαθαίνουµε Java σε αυτό το µάθηµα! Παράλληλη παρακολούθηση στο 3 ο εξάµηνο Προγραµµατισµός Υπολογιστών µε C++ Δοµές Δεδοµένων 01-7
Διαλέξεις Διδάσκων Β. Μαρκάκης (markakis AT gmail. com ή AT aueb. gr) Ώρες διαλέξεων Τρίτη 13:00-15:00 (Δ Οικ.) Πέµπτη 15:00-17:00 (Αµφ. Β) Τα περισσότερα slides είναι ήδη στο eclass Θα υπάρξουν όµως κάποιες αλλαγές Κάθε αρχείο θα ανανεώνεται µετά την αντίστοιχη διάλεξη µε τυχόν διορθώσεις/παρατηρήσεις Δοµές Δεδοµένων 01-8
Εργαστήρια Τα εργαστήρια ξεκινούν στις 9/10 Βοηθοί εργαστηρίων Νικόλαος Βίτσας Αντωνία Κυριακοπούλου Κατερίνα Παλτόγλου Θα γίνουν 9 εργαστήρια κατά τη διάρκεια του εξαµήνου Δοµές Δεδοµένων 01-9
Εργαστήρια Τα εργαστήρια είναι προαιρετικά Σύντοµες προγραµµατιστικές ασκήσεις + επανάληψη σχετικής ύλης Ίδιες µε τις προηγούµενες χρονιές Υλοποίηση βασικών δοµών δεδοµένων Επίλυση αποριών και παροχή βοήθειας για τις εργασίες Δοµές Δεδοµένων 01-10
Εργαστήρια Έχουµε 5 τµήµατα εργαστηρίων Τµήµα 1: Τρίτη 5-7, βοηθός: Κ. Παλτόγλου Τµήµα 2: Πέµπτη 9-11, βοηθός: Ν. Βίτσας Τµήµα 3: Πέµπτη 11-1, βοηθός: Ν. Βίτσας Τµήµα 4: Παρασκευή 9-11, βοηθός: Α. Κυριακοπούλου Τµήµα 5: Παρασκευή 11-1, βοηθός: Α. Κυριακοπούλου Όσοι σκοπεύετε να παρακολουθείτε τα εργαστήρια: πρέπει να δηλώσετε µέχρι τις 9/10 στο eclass (Οµάδες χρηστών) σε ποιο τµηµα επιθυµείτε να είστε Μην πηγαίνετε σε άλλο τµήµα παρά µόνο αν υπάρχει κώλυµα (λόγω δουλειάς, κτλ) µε το τµήµα στο οποίο θα γραφτείτε Δοµές Δεδοµένων 01-11
Επικοινωνία Ώρες γραφείου (πτέρυγα Αντωνιάδου, 4ος όροφος): Τρίτη 11:00-13:00, Παρασκευή 11:00 12:00 Θα ανακοινωθούν επίσης και ώρες γραφείου των βοηθών για παροχή βοήθειας και επίλυση αποριών στις εργασίες Για οποιαδήποτε απορία µπορείτε να στέλνετε email σε εµένα ή στους βοηθούς Μην ξεχνάτε το ονοµατεπώνυµό σας Αν δεν απαντήσω εντός 3 ηµερών, ξαναστείλτε... Δοµές Δεδοµένων 01-12
eclass Το υλικό του µαθήµατος (διαφάνειες, εργασίες, κτλ) θα διατίθεται µέσω του eclass: http://eclass.aueb.gr Γραφτείτε στο «Δοµές Δεδοµένων 2017-2018» Θα πρέπει να κοιτάτε τις ανακοινώσεις του µαθήµατος και το dias account σας τουλάχιστον 1 φορά την εβδοµάδα Ανακοινώσεις για τα εργαστήρια θα γίνονται επίσης µέσω του eclass Δοµές Δεδοµένων 01-13
Βαθµολόγηση Εργασίες: 3 µονάδες Τρεις εργασίες κατά τη διάρκεια του εξαµήνου 1 µονάδα η κάθε εργασία Οµάδες 2 ατόµων (ή µόνοι σας) Το επίπεδο δυσκολίας είναι τέτοιο ώστε να µπορούν να γίνουν και ατοµικά (προσπαθήστε όµως να είστε σε οµάδα) ΔΕΝ επιτρέπονται οµάδες µε πάνω από 2 άτοµα Για όσους δεν µπορέσουν να βρουν συνεργάτη, θα υπάρξει σχετική περιοχή συζητήσεων στο eclass, µε αυτόν τον σκοπό Οι βαθµοί εργασιών ισχύουν και για το Σεπτέµβρη αλλά όχι για τον επόµενο χρόνο Δοµές Δεδοµένων 01-14
Για τους πιο τολµηρούς... Μπορεί να υπάρξει και Εργασία 4: Για όσους έχουν χρόνο και όρεξη να δουν κάτι παραπάνω για τη χρήση των δοµών Προϋπόθεση να έχετε παραδώσει και τις 3 άλλες εργασίες Αξία = 0.5 µονάδες extra Η καλύτερη από τις εργασίες που θα παραδοθούν θα πάρει και κάποιο βραβείο! Δοµές Δεδοµένων 01-15
Βαθµολόγηση Τελικές εξετάσεις: 8 µονάδες (δηλαδή 1 bonus) Εξεταστέα ύλη είναι ό,τι καλύψουµε κατά τη διάρκεια του εξαµήνου Πώς υπολογίζεται ο τελικός βαθµός? Για να περάσετε το µάθηµα πρέπει στο τελικό διαγώνισµα να γράψετε τουλάχιστον 3.5 στα 8 Έστω x ο συνολικός βαθµός σας από τις εργασίες, x [0, 3] Έστω y ο βαθµός από το διαγώνισµα, y [0, 8] if y 3.5 then τελικός βαθµός = x + y else try again Δοµές Δεδοµένων 01-16
Βαθµολόγηση Πώς θα περάσω το µάθηµα? Μην αφήσετε το διάβασµα για το τέλος (η ύλη είναι αντικειµενικά µεγάλη, δεν θα προλάβετε) Ασχοληθείτε µε τις εργασίες Συνήθως όσοι ασχολούνται περνάνε Στατιστικά από τα τελευταία 2 χρόνια: περίπου 93% από τους φοιτητές που πέρασαν είχαν κανει τουλάχιστον µία απο τις εργασίες Περίπου 80% από τους φοιτητές που πέρασαν είχαν κανει τουλάχιστον δύο απο τις εργασίες Ρωτήστε ό,τι δεν καταλαβαίνετε, εκφράστε απορίες, προβληµατισµούς, σχόλια,... Προσπαθήστε πάντα να κατανοείτε την ιδέα πίσω από κάθε υλοποίηση που θα δείτε (η υλοποίηση σε Java είναι απλά το τελικό στάδιο, προέχει η σχεδίαση του κάθε αλγορίθµου) Δοµές Δεδοµένων 01-17
Σχετικά µε τις εργασίες... Σκοπός των εργασιών είναι η εξοικείωση µε τις βασικές δοµές δεδοµένων Κάθε εργασία επικεντρώνεται σε κάποια ή κάποιες δοµές και τη χρήση τους στην ανάπτυξη αλγορίθµων Για την επίλυση των εργασιών, µπορείτε να συζητάτε µεταξύ σας Όµως: Ο κώδικας πρέπει να γράφεται από κάθε οµάδα χωριστά!!! Δοµές Δεδοµένων 01-18
Σχετικά µε τις εργασίες... Μην βάζετε τον κώδικά σας στο GitHub ή σε άλλα open source repositories! Όλες οι εργασίες περνάνε από ειδικό πρόγραµµα που ελέγχει αντιγραφές (ελέγχονται αλλαγές ονοµάτων µεταβλητών, σχόλια, και πολλά άλλα χαρακτηριστικά) Δοµές Δεδοµένων 01-19
Προφορική εξέταση εργασιών Στο τέλος της εξεταστικής Ιανουαρίου θα γίνει η προφορική εξέταση όλων των εργασιών Η εξέταση είναι ατοµική ανεξαρτήτως αν κάποιος ήταν σε οµάδα ή όχι, και είναι πάνω σε όλες τις εργασίες που συµµετείχε ο κάθε φοιτητής Ζηταίται από κάθε φοιτητή να τρέξει τον κώδικά του και να απαντήσει σε ερωτήσεις σχετικά µε τις υλοποιήσεις που έκανε Απουσία στην προφορική εξέταση σηµαίνει ότι δεν κατοχυρώνεται ο βαθµός των εργασιών του Δοµές Δεδοµένων 01-20
Περιβάλλον υλοποίησης Τι περιβάλλον να χρησιµοποιήσω για την ανάπτυξη του κώδικα? (Java IDE s - Integrated Development Environments) Ό,τι θέλετε εσείς Eclipse NetBeans (υπάρχουν διάφορα άλλα) Command line Δοµές Δεδοµένων 01-21
Βιβλιογραφία Βασικό βιβλίο R. Sedgewick, Αλγόριθµοι σε Java, Μέρη 1-4, Κλειδάριθµος, 2005. Εναλλακτικό βιβλίο στη λίστα συγγραµµάτων R. Lafore, Αλγόριθµοι και Δοµές Δεδοµένων στη JAVA, Μ. Γκιούρδας, 2005. Άλλα βιβλία που µπορείτε να συµβουλευτείτε Σηµειώσεις Μάριου Συντιχάκη: Δοµές Δεδοµένων, 2005 (είναι ήδη διαθέσιµες στο eclass) M. Goodrich, R. Tamassia, Data Structures and Algorithms in Java, John Wiley & Sons, 2003. T. Cormen, C. Leiserson, R. Rivest, C. Stein, Introduction to Algorithms, 3 rd edition, MIT Press, 2009. M.Α. Weiss, Data Structures and Problem Solving Using Java, Addison- Wesley, 2002. Δοµές Δεδοµένων 01-22
Περιεχόµενο Εισαγωγή στους αλγόριθµους Προβλήµατα συνδετικότητας και αλγόριθµοι ένωσης εύρεσης (union-find) Υλοποίηση και ανάλυση αλγορίθµων Πίνακες, Συνδεδεµένες λίστες Στοίβες, Ουρές Δέντρα Προβλήµατα ταξινόµησης Βασικοί αλγόριθµοι (insertion sort, bubblesort, selection sort) Ταξινόµηση µε συγχώνευση (mergesort) Quicksort Σωροί, Ταξινόµηση µε σωρό (heapsort) Δοµές Δεδοµένων 01-23
Περιεχόµενο Προβλήµατα αναζήτησης Πίνακες συµβόλων Δενδρικές δοµές Δέντρα δυαδικής αναζήτησης Τυχαιοποιηµένα δέντρα Στρεβλά δέντρα Δέντρα κόκκινου µαύρου Β-δέντρα Κατακερµατισµός Δοµές Δεδοµένων 01-24
Σε τι διαφέρουν οι Δοµές Δεδοµένων από ένα απλό µάθηµα προγραµµατισµού? Πόροι ενός PC: Μνήµη Χρόνος εκτέλεσης Βασικός στόχος του µαθήµατος: Πώς να µάθουµε να χρησιµοποιούµε την κατάλληλη δοµή δεδοµένων για ένα πρόβληµα έτσι ώστε να µειώσουµε αισθητά το χρόνο εκτέλεσης ή να εξοικονοµήσουµε χώρο Ανεξάρτητα από τη γλώσσα προγραµµατισµού που χρησιµοποιούµε Ο προγραµµατισµός για τις Δοµές είναι απλά ένα εργαλείο Δοµές Δεδοµένων 01-25
Σχετικά µε τον προγραµµατισµό... Αν το να γράψετε ένα πρόγραµµα σας φαίνεται αποκρουστικό/µισητό/αδιανόητο/...: Δώστε άλλη µια ευκαιρία (πολλοί φοιτητές ανεβάζουν απόδοση στο 3 ο έτος) Αν εξακολουθεί να µην σας αρέσει, τότε ίσως είστε σε λάθος τµήµα... Πτυχίο στην Επιστήµη Υπολογιστών χωρίς κάποιες γνώσεις προγραµµατισµού είναι οξύµωρο! Τελικά θα πρέπει να σκεφτείτε τι σας αρέσει περισσότερο να σπουδάσετε Δοµές Δεδοµένων 01-26
Κάποιες προτάσεις... Αν δυσκολεύεστε/φοβάστε µε τον προγραµµατισµό: Αφιερώστε περισσότερο χρόνο Προσπαθήστε να λύσετε ασκήσεις µόνοι σας Δείτε το σαν παιχνίδι! Κάθε πρόγραµµα ουσιαστικά λύνει και κάποιο puzzle Κατά τη ρήση πολλών: Computer Science is nothing more than solving nice puzzles Δοµές Δεδοµένων 01-27
Έστω ένα n x n grid Α Ένα απλό παράδειγµα Πόσα shortest paths υπάρχουν από το Α στο Β? Β Δοµές Δεδοµένων 01-28
Ένα απλό παράδειγµα Παρόµοιες ερωτήσεις βρίσκουν εφαρµογές σε VLSI design καθώς και σε διάφορα άλλα είδη δικτύων Πόσο εύκολα µπορούµε να βρούµε την απάντηση? Δοµές Δεδοµένων 01-29
Ένα απλό παράδειγµα Θα λύσουµε ένα πιο γενικό πρόβληµα Έστω P[i, j] = αριθµός των κοντινότερων µονοπατιών που υπάρχουν από το Α προς το σηµείο µε συντεταγµένες (i, j) Δηλαδή µέχρι την i-οστή γραµµή και j-οστή στήλη Σύµβαση: το Α είναι στη γραµµή 0 και στήλη 0 Θα βρούµε όλα τα P[i, j] για 0 i, j n-1 Δοµές Δεδοµένων 01-30
Ένα απλό παράδειγµα Βασική ιδέα: Τα κοντινότερα µονοπάτια προς το (i, j) θα περάσουν αναγκαστικά είτε από το (i-1, j) είτε από το (i, j-1) (i-1, j)...... (i, j-1) (i, j) Εποµένως: P[i, j] = P[i-1, j] + P[i, j-1] Δοµές Δεδοµένων 01-31
Ένα απλό παράδειγµα Επίσης: Στα σηµεία της γραµµής 0 ή της στήλης 0 υπάρχει µόνο ένα κοντινότερο µονοπάτι από το Α προς αυτά. Με βάση αυτά: for (int i=0; i < n; i++) P[i,0] = 1; for (int j=0; j < n; j++) P[0,j] = 1; for (int i=1; i < n; i++) for (int j=1; j < n; j++) P[i,j] = P[i-1,j] + P[i,j-1]; 7 γραµµές κώδικα Μπορούµε και πιο απλά? Δοµές Δεδοµένων 01-32
Επόµενα µαθήµατα Προβλήµατα συνδετικότητας: Συνδέονται 2 κόµβοι ενός µεγάλου δικτύου? (δηλαδή υπάρχει µονοπάτι από τον ένα στον άλλο?) Χρήστες σε ένα κοινωνικό δίκτυο (facebook) Τρανζίστορ σε ένα µικροτσίπ Θα δούµε την επίλυση τέτοιων προβληµάτων µε αλγορίθµους ένωσης-εύρεσης (union-find) Δοµές Δεδοµένων 01-33
Επόµενο µάθηµα u v Συνδέεται το u µε το v? Δοµές Δεδοµένων 01-34
Άλλα παραδείγµατα χρήσης δοµών: Αναζήτηση Δοµές Δεδοµένων χρησιµοποιείτε καθηµερινά στη ζωή σας Π.χ. έστω ότι ψάχνετε το τηλέφωνο του Robert J. Smith. Αν είχατε απλώς µία (αταξινόµητη) λίστα µε όλα τα ονόµατα, για πληθυσµό Ν = 5 10 6, θέλετε Ν συγκρίσεις στη χειρότερη περίπτωση Σε έναν ταξινοµηµένο (τυπωµένο) τηλεφωνικό κατάλογο όλοι σας κάνετε περίπου logn συγκρίσεις Δοµές Δεδοµένων 01-35
Άλλα παραδείγµατα χρήσης δοµών: Αναζήτηση Μηχανές αναζήτησης Ίσως η πιο σηµαντική εφαρµογή των Δοµών στις µέρες µας Υπάρχουν πάνω από 10 12 σελίδες στο web Δεν υπάρχει κάποιος φυσικός τρόπος να ταξινοµήσουµε τις σελίδες Παρ όλα αυτά, η Google απαντά σε όλες τις ερωτήσεις σε χρόνο < 1 sec Χρήση έξυπνων αλγορίθµων για την εύρεση των πιο σχετικών και σηµαντικών σελίδων (τύπου PageRank) + χρήση κατάλληλων δοµών για την αποθήκευση και ανάκτηση των σελίδων Δοµές Δεδοµένων 01-36