Δομές Δεδομένων (Data Structures) Διδάσκων: Αν. καθηγητής Χρήστος Μακρής 2610-996968 makri@ceid.upatras.gr Διδάσκων με βάση Π.Δ. 407: Ανδρέας Καναβός Kanavos@ceid.upatras.gr Διδάσκων (ΕΔΙΠ): Άρης Ηλίας aristeid@ceid.upatras.gr
Διδασκαλία Μαθήματος 4 ώρες την εβδομάδα (θεωρία + ασκήσεις). Τρίτη 13-15 (Β) και Πέμπτη 13-15 (Β). Εργασία συμπληρωματική του βαθμού. Η εργασίες παραδίδονται Ιανουάριο/Σεπτέμβριο. Ο βαθμός της εργασίας μπορεί να κρατηθεί μέχρι το Σεπτέμβριο.
Υπολογισμός βαθμού (1) Το μάθημα περιλαμβάνει τελική γραπτή εξέταση και εργαστηριακές ασκήσεις (project). Οι ασκήσεις είναι ατομικές Η παράδοση των εργαστηριακών ασκήσεων είναι απαραίτητη για τoυς φοιτητές 2ου έτους. Για τους φοιτητές μεγαλυτέρων ετών είναι προαιρετική. Οι εργαστηριακές ασκήσεις μπορούν να παραδοθούν Ιούνιο ή Σεπτέμβριο. Οι βαθμοί των ασκήσεων θα προσμετρήσουν στην τελική βαθμολογία εφόσον ο βαθμός της τελικής γραπτής εξέτασης είναι >= 5.
Υπολογισμός βαθμού (2) Ανάλογα με το ποσοστό ολοκλήρωσης της εργασίας, και όταν αυτό είναι ικανοποιητικό, αυτή μπορεί να προσθέσει μέχρι και 1.5 βαθμό στον βαθμό της γραπτής εξέτασης εφόσον παραδοθεί στην τρέχουσα περίοδο (Εξεταστική Ιουνίου) ενώ αν παραδοθεί τον Σεπτέμβριο μπορεί να προσθέσει μέχρι και 1 βαθμό. Θεωρείται ότι έχει παραδοθεί εργασία αν ο προσθετικός βαθμός που ανακοινωθεί είναι μεγαλύτερος του 0 (0-1,5) και έχει υλοποιήσει >=50% της εργασίας. Η βαθμολογία της εργασίας έχει ισχύ μόνο για το τρέχον ακ.έτος στο οποίο έχει παραδοθεί.
Διδακτικό βιβλίο Διδακτικό Βιβλίο: Α. Τσακαλίδης: Δομές Δεδομένων, Εκδόσεις Πανεπιστημίου Πατρών, 2008. Βιβλία από ΕΥΔΟΞΟ: ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ: ΤΑ ΒΑΣΙΚΑ ΕΡΓΑΛΕΙΑ, KURT MEHLHORN, PETER SANDERS Δομές Δεδομένων, 2η Έκδοση, Μποζάνης Παναγιώτης Δ. ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
Εισαγωγικά Δομή Δεδομένων= η συγκεκριμένη υλοποίηση ενός συχνά εμφανιζόμενου Αφηρημένου Τύπου Δεδομένων. Αφηρημένος Τύπος Δεδομένων είναι ένα σύνολο μαζί με μία συλλογή πράξεων στα στοιχεία του συνόλου. Παραδείγματα Δομών -- Λεξικό (βασικές πράξεις η εισαγωγή/διαγραφή στοιχείων και ο έλεγχος ανήκει/δεν ανήκει) – Διαφοροποίηση από έλεγχο για Predecessor -- Ουρές Προτεραιότητας (βασικές πράξεις η ένθεση στοιχείων, η εύρεση και διαγραφή του ελαχίστου)
Μοντέλα Μηχανής Μοντέλο Μηχανής Δεικτών (Pointer Machine)= η μνήμη αποτελείται από συλλογή εγγραφών, με κάθε εγγραφή να αποτελείται από ένα σύνολο από κελιά. Κάθε κελί έχει ένα τύπο (pointer, integer, real) και η προσπέλαση κελιών γίνεται με χρήση δεικτών. RAM Μοντέλο Υπολογισμού= η μνήμη αποτελείται από ένα πίνακα από κελιά, όπου κάθε κελί προσπελαύνεται με τη διεύθυνσή του. Υποθέτουμε ότι κάθε κελί μπορεί να περιέχει αριθμούς αυθαίρετου μεγέθους και ότι οι βασικές αριθμητικές πράξεις και πράξεις δεικτών παίρνουν σταθερό χρόνο (uniform cost assumption). Μετρικές Εκτίμησης Απόδοσης Χωρική, χρονική πολυπλοκότητα (διαφοροποίηση για τα δύο μοντέλα υπολογισμού).
RAM Μοντέλο Υπολογισμού Βασικό θεωρητικό μοντέλο υπολογισμού: Άπειρη μνήμη Ομοιόμορφο κόστος προσπέλασης 4 καταχωρητές: 1 συσσωρευτή A, καταχωρητές δείκτη γ1, γ2, γ3.
Χρονική Πολυπλοκότητα Ανάλυση μέσης περίπτωσης (average case analysis)= μία πιθανοτική κατανομή τίθεται στις πράξεις ενός αφηρημένου τύπου δεδομένων και το μέσο κόστος των πράξεων υπολογίζεται. Ανάλυση Χειρότερης Περίπτωσης (worst case analysis)= υπολογίζονται πολυπλοκότητες χειρότερης περίπτωσης για κάθε πράξη. Ανάλυση Επιμερισμένης Πολυπλοκότητας= υπολογίζεται το συνολικό κόστος μίας ακολουθίας πράξεων και επιμερίζεται το κόστος σε καθεμία πράξη.
Eκτίμηση Πολυπλοκότητας Ορισμός: f(n) = O(g(n) αν και μόνο αν υπάρχουν θετικές σταθερές c και n0 τέτοιες ώστε f(n) ≤ cg(n) για όλα τα n ≥ n0 Ορισμός: f(n) = Ω(g(n) αν και μόνο αν υπάρχουν θετικές σταθερές c και n0 τέτοιες ώστε f(n) ≥ cg(n) για όλα τα n ≥ n0 Ορισμός: f(n) = Θ(g(n) αν και μόνο αν υπάρχουν θετικές σταθερές c1, c2 και n0 τέτοιες ώστε c1g(n) ≤ f(n) ≤ c2g(n) για όλα τα n ≥ n0
Bασική πηγή: Δομές Δεδομένων, Απ. Παπαδόπουλος http://delab.csd.auth.gr/courses/c_ds/
Bασική πηγή: Δομές Δεδομένων, Απ. Παπαδόπουλος http://delab.csd.auth.gr/courses/c_ds/
Aναδρομικές Σχέσεις Αναδρομικές Σχέσεις Παράδειγμα Πρώτης Τάξης γραμμικές μη-γραμμικές an=nan-1-1 Δεύτερης Τάξης Γραμ. με μεταβλητούς συντελεστές an=an-1+2an-2 K τάξης an=F(an-1, …,an-k) Πλήρης ιστορίας Διαίρει και Βασίλευε an=a[n/2] +a[n/2]+n
Γραμμικές Σχέσεις με σταθερούς συντελεστές c0an+c1an-1+…+ cran-r =f(n) Η λύση άθροισμα μίας ομογενούς λύσης και μίας ειδικής. an=an(h)+an(p) Εάν a1 μία ρίζα χαρακτηριστικής εξίσωσης τότε όλες οι ρίζες σχηματίζουν τη λύση: an(h)=A1a1n+A2a2n+…+ Ararn και (A1nk-1+ A2nk-2 +…+ Ak-1n+Ak)a1n
Γραμμικές Σχέσεις Aναδρομής πρώτης τάξης Μη γραμμικές σχέσεις αναδρομής Αντικατάσταση Αλλαγή μεταβλητής Συνδυάσμός λύσεων Δένδρο αναδρομής
Γενική Μέθοδος Έστω a>=1 και b>1 σταθερές, f(n) ασυμπτωτικά θετική συνάρτηση και Tn=aTn/b+f(n) αναδρομική σχέση ορισμένη σε μη αρνητικούς ακεραίους τότε: Αν f(n)=O(nlogba-ε) για ε>0 τότε Τn= Θ(nlogba) Αν f(n)=Θ(nlogba) για ε>0 τότε Τn= Θ(nlogbalogn) Αν f(n)=Ω(nlogba-ε) για ε>0 τότε Τn= Θ(nlogba) και αν af(n/b)<=f(n) για μία σταθερά c και για μεγάλο n τότε Tn=Θ(f(n)).
Δομημένοι τύποι Βασικοί τύποι δεδομένων ακέραιος, πραγματικός, χαρακτήρας, δείκτης Βασικές δομές δεδομένων Πίνακας Εγγραφή Λίστα Στοίβα Ουρά
Λίστα first(): O(1) last(): O(1) insert_after(pointer,data): O(1) Υλοποίηση με πίνακα ή με δείκτες. first(): O(1) last(): O(1) insert_after(pointer,data): O(1) remove(pointer) find(data): O(n) size(): O(1) catenate_with(list): O(1)
Στοίβα is_empty(): O(1) push(data): O(1) pop(): O(1) top(): O(1) Υλοποίηση με πίνακα ή με λίστα. Όταν υλοποίηση με λίστα χρήση: insert_after(tail,), remove(tail), last(), size().
Ουρά is_empty(): O(1) push(data): O(1) pop(): O(1) first(): O(1) Υλοποίηση με πίνακα ή με λίστα. Όταν υλοποίηση με λίστα χρήση: insert_after(tail,), remove(head), last(), size().
Υλοποίηση με πίνακα Στοίβα: Πίνακας Κ και ένας δείκτης Τop αρχικά ίσος με 0. push(data): Top=Top+1; K[Top]=data; pop(): if Top==0 error; x=K[Top]; Top=Top-1; Ουρά: Πίνακας S και δύο δείκτες Front και End. Εάν Front<End, η ουρά είναι S[Front]…S[End-1] Eάν Front=End η ουρά είναι άδεια. push(data): S[End]=data; End=(End+1) mod n; if (Front=End) then error pop(): if (Front=End) then Error; x=S[Front]; Front=(Front+1) mod n;
Αρχικοποίηση σε σταθερό χρόνο A[1; N] ο πίνακας για αρχικοποίηση. Χρησιμοποιούμε πίνακα B[1; N] και στοίβα S[1; N], A[i] έχει αρχικοποιηθεί <-> 1<= B[i]<= t ΚΑΙ S[B[i]] = i Αρχικοποίηση A[i] συνεπώς t=t+1, B[i] =t, and S[t]= i.
Δέντρο Το δέντρο είναι ένα άκυκλο συνεκτικό και μη κατευθυνόμενο γράφημα. Για οποιουσδήποτε δύο κόμβους υπάρχει ένα μοναδικό μονοπάτι Πλήθος ακμών είναι ίσο με πλήθος κόμβων μείον ένα. |Ε|=|V|-1. Υλοποίηση με πίνακα ή με δείκτες.
Ορολογία Ρίζα Πρόγονοι Απόγονοι Πατέρας Παιδιά Βαθμός κόμβου Βαθμός δένδρου Διαδρομή (path) Μήκος διαδρομής Βάθος Ύψος Φυλλοπροσανατολισμένο Κομβοπροσανατολισμένο ρίζα A B C D F E G
Δυαδικά Δένδρα Δυαδικά δένδρα: έχουν βαθμό 2. Σε κάθε κόμβο: Αριστερό υποδένδρο - δεξιό υποδένδρο Πλήρες δυαδικό δένδρο: έχει το μέγιστο αριθμό κόμβων σε κάθε επίπεδο πλην ίσως του τελευταίου (αν στο τελευταίο δεν έχει το μέγιστο αριθμό κόμβων, οι κόμβοι πρέπει να είναι όσο το δυνατό αριστερά). Αναπαράσταση Συνεχόμενη αναπαράσταση (με πίνακα) Η ρίζα μπαίνει στη θέση 0. Αν ένας κόμβος είναι στη θέση k, το αριστερό παιδί του θα είναι στη θέση 2*k και το δεξιό παιδί του θα είναι στη θέση 2*k+1. Συνδεδεμένη αναπαράσταση (η πιο συνήθης μορφή) Χρήση 2 δεικτών (left, right)
Άσκηση Θεωρήστε ένα δυαδικό δένδρο όπου κάθε κόμβος έχει δύο παιδιά ή κανένα. Αποδείξτε ότι το πλήθος των εσωτερικών κόμβων είναι ίσο με το πλήθος των φύλλων μείον ένα.
Μέθοδοι διέλευσης δένδρου Προδιάταξη: Επεξεργάσου ρίζα Εφάρμοσε το ίδιο σε υποδένδρα L1,L2, …,Lk Μεταδιάταξη Επισκέψου τα υποδένδρα L1,L2, …,Lk Ενδοδιάταξη – συμμετρική διάταξη: Επισκέψου το αριστερό υποδένδρο L1 Επισκέψου το δεξιό υποδένδρο L2 Κατά σειρά επιπέδων διαπέραση (level-order): Διασχίζουμε τα επίπεδα του δένδρου, στη σειρά από επάνω προς τα κάτω, και σε κάθε επίπεδο επισκεπτόμαστε τους κόμβους από αριστερά προς τα δεξιά.
Διαπεράσεις Δυαδικών Δένδρων // προδιατεταγμένη διαπέραση void preorder(TreeNode *t) { if (t) { visit(t); preorder(t->left); preorder(t->right); // Ρ Α Δ } // ενδοδιατεταγμένη διαπέραση void inorder(TreeNode *t){ inorder(t->left); visit(t); inorder(t->right); // Α Ρ Δ // μεταδιατεταγμένη διαπέραση void postorder(TreeNode *t){ postorder(t->left); postorder(t->right); visit(t); // Α Δ Ρ
Διαπεράσεις Δυαδικών Δένδρων Άσκηση Πόσες και ποιές διαπεράσεις απαιτούνται για να ανακατασκευάσουμε το αρχικό δυαδικό δένδρο;
Διαπεράσεις Δυαδικών Δένδρων Ανακατασκευή δυαδικού δένδρου Αν έχουμε ΜΟΝΟ μεταδιαπέραση, προδιαπέραση δεν είναι εφικτός ο προσδιορισμός αριστερού και δεξιού υποδένδρου, ενώ αν έχουμε ΜΟΝΟ ενδοδιαπέραση δεν μπορούμε να προσδιορίσουμε τη ρίζα. Συνεπώς μία διαπέραση δεν αρκεί. Ομοίως αν έχουμε δύο διαπεράσεις από μεταδιαπέραση, προδιαπέραση είναι αδύνατο να προσδιορίσουμε αριστερό και δεξιό υποδένδρο. Για παράδειγμα, δένδρο με δύο μόνο κόμβους έχει τις ίδιες μεταδιαπεράσεις, προδιαπεράσεις ανεξάρτητα αν το μοναδικό φύλλο είναι αριστερό ή δεξιό παιδί της ρίζας.
Διαπεράσεις Δυαδικών Δένδρων Ανακατασκευή δυαδικού δένδρου ΟΜΩΣ, αν έχουμε μία διαπέραση από μεταδιαπέραση, προδιαπέ-ραση ΚΑΙ την ενδοδιαπέραση, τότε με την πρώτη διαπέραση μπορούμε να προσδιορίσουμε τη ρίζα και με την ενδοδιαπέραση να προσδιορίσουμε τα στοιχεία του αριστερού και δεξιού υποδένδρου. Μετά μπορούμε να προσδιορίσουμε τις ΑΝΤΙΣΤΟΙΧΕΣ ΔΙΑΠΕΡΑΣΕΙΣ αριστερού και δεξιού υποδένδρου, σαρώνοντας τις αρχικές διαπεράσεις, και επαναλαμβάνοντας την ίδια διαδικασία να προσδιορίσουμε, από επάνω προς τα κάτω, όλο το δένδρο. ΣΥΝΕΠΩΣ ΔΥΟ ΔΙΑΠΕΡΑΣΕΙΣ είναι αρκετές αρκεί η μία από τις δύο να είναι η ενδοδιαπέραση.
Πράξεις σε φυλλοπροσανατολισμένα SEARCH(x) v<-ρίζα while (v!=φυλλο) { Εντόπισε υποδέντρο: Ηi-1(v)<x<=Hi(v) v<- i-οστός γιος του v } if (πληροφορία(v)=x) then βρεθηκε else δεν βρέθηκε INSERT(x) v<-φύλλο που τελειώνει η Search(x) if (πληροφορία(v)=x) then μη κάνεις τίποτα αλλιώς αντικατέστησε το v με min(x,cont(v) min(x,cont(v) max(x,cont(v)
DELETE(x) v<-το φύλλο στο οποίο τελειώνει η Search(x) if (πληροφορία(v)!=x) then μη κάνεις τίποτα else u<-o κοντινότερος πρόγονος του v με βαθμό >=2 Σβήσε την i-οστή πλευρά του u και ένα από τα Ηi-1(v),Hi(v) if degree(u)=1 then αντικατέστησε τον δείκτη από τον πατέρα του u προς τον u, με τον δείκτη στο γιο του u