ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ (ΠΑΤΡΑ) ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Γιάννης Κουτσονίκος Επίκουρος Καθηγητής
Οργάνωση Δεδομένων Δομή Δεδομένων: τεχνική οργάνωσης των δεδομένων με σκοπό την υποστήριξη ενός συνόλου λειτουργιών με τον καλύτερο δυνατό τρόπο. Η επιλογή της δομής δεδομένων και του αλγορίθμου επηρεάζουν το χρόνο εκτέλεσης ενός προγράμματος, ο οποίος μπορεί να κυμαίνεται από λίγα δευτερόλεπτα έως μερικά λεπτά ή ώρες. Μία λύση λέγεται αποδοτική, εάν επιλύει το πρόβλημα εντός των περιορισμών που υπάρχουν ως προς τους πόρους (κυρίως): χρόνος και χώρος. 2
Επιλογή Δομής Δεδομένων Επιλέγουμε μία δομή δεδομένων ως εξής: 1. Αναλύουμε το πρόβλημα για να καθορίσουμε τους περιορισμούς πόρων, στους οποίους πρέπει να υπόκειται μια λύση. 2. Καθορίζουμε τις βασικές λειτουργίες που πρέπει να υποστηρίζονται: Όλα τα δεδομένα εισάγονται από την αρχή ή υπάρχουν εισαγωγές που παρεμβάλλονται μεταξύ άλλων λειτουργιών; Μπορούν τα δεδομένα να διαγραφούν; Όλα τα δεδομένα υφίστανται επεξεργασία σε μια καθορισμένη σειρά ή επιτρέπεται τυχαία προσπέλαση; 3. Επιλέγουμε τη δομή (ή τις δομές) δεδομένων που ικανοποιεί (ικανοποιούν) καλύτερα αυτούς τους περιορισμούς. 3
Απόδοση Αλγορίθμων - Πολυπλοκότητα Η εκτίμηση της απόδοσης ενός αλγορίθμου στοχεύει: 1. Στην επιλογή του κατάλληλου αλγορίθμου για την επίλυση ενός προβλήματος, 2. Στη σύγκριση διαφορετικών αλγορίθμων, 3. Στον προσδιορισμό αν ένας αλγόριθμος είναι βέλτιστος ή όχι. Για την εκτίμηση της απόδοσης, το κόστος ενός αλγορίθμου υπολογίζεται με βάση π.χ. τον αριθμό συγκρίσεων, αντιμεταθέσεων ή άλλων πράξεων/λειτουργιών και όχι με βάση το χρόνο εκτέλεσης σε κάποιο υπολογιστικό σύστημα. 4
Απόδοση Αλγορίθμων - Πολυπλοκότητα Το κόστος μίας μεθόδου εκφράζεται ως συνάρτηση του μεγέθους της εισόδου και μετρά το πλήθος κάποιων βασικών λειτουργιών που εκτελούνται (π.χ. συγκρίσεις μεταξύ στοιχείων, αντιμεταθέσεις, κλπ.). Εστιάζουμε στο κόστος χειρότερης περίπτωσης (αναφέρεται και ως πολυπλοκότητα χειρότερης περίπτωσης). Παράδειγμα: έστω n το πλήθος των στοιχείων ενός μονοδιάστατου πίνακα που αποθηκεύει ακεραίους αριθμούς. Τότε, αν ο πίνακας δεν είναι ταξινομημένος, για να εντοπίσουμε το μέγιστο στοιχείο απαιτούνται στη χειρότερη περίπτωση n-1 συγκρίσεις. 5
Συμβολισμός Ο (κεφαλαίο όμικρον) Η συνάρτηση πολυπλοκότητας ενός αλγορίθμου εκφράζεται με τον συμβολισμό O, στον οποίο παραλείπονται οι σταθεροί όροι, καθώς και οι όροι μικρότερου βαθμού. Παραδείγματα Έστω ότι f(n) είναι η συνάρτηση υπολογισμού του πλήθους των πράξεων που εκτελεί κάποιος αλγόριθμος, όπου n τα στοιχεία εισόδου. Εάν f(n) = 3n 2 τότε η f(n) είναι O(n 2 ) Εάν f(n) = 13n 2 + 1000 τότε η f(n) είναι O(n 2 ) Εάν f(n) = 100n 3 + 3n 2 τότε η f(n) είναι O(n 3 ) 6
κόστος (π.χ. πλήθος συγκρίσεων) Πολυπλοκότητες Αλγορίθμων 120 100 80 n log(n) n log(n) n*n 60 40 20 0 1 2 3 4 5 6 7 8 9 10 πλήθος στοιχείων εισόδου 7
Πολυπλοκότητα Δυαδικής Αναζήτησης // Επιστροφή της θέσης του στοιχείου με τιμή x // στον ταξινομημένο πίνακα a μεγέθους n. int BinarySearch(int a[], int n, int x) { int left = 0; int right = n-1; // όρια πίνακα while (left <= right) { // σταμάτα όταν τα // όρια αναστραφούν // έλεγχος του μεσαίου στοιχείου int middle = (left + right) / 2; } // αναζήτηση στο δεξιό ή αριστερό μισό, αντίστοιχα if (x == a[middle]) return middle; // βρέθηκε if (x > a[middle]) left = middle + 1; else right = middle - 1; } return -1; // δεν βρέθηκε 8
Πολυπλοκότητα Δυαδικής Αναζήτησης Αναζήτηση του στοιχείου 45 Πόσα στοιχεία εξετάζουμε στη χειρότερη περίπτωση; Ισοδύναμο ερώτημα: Πόσες φορές μπορούμε να διαιρούμε στη μέση έναν πίνακα με n στοιχεία, έτσι ώστε ο τελικός πίνακας να έχει ένα μόνο κελί; 9
Πολυπλοκότητα Δυαδικής Αναζήτησης Έστω t το πλήθος των διαιρέσεων και χωρίς βλάβη της γενικότητας έστω ότι το πλήθος n των στοιχείων είναι δύναμη του 2. Μετά από κάθε διαίρεση το πλήθος των στοιχείων μειώνεται στο μισό, συνεπώς το πλήθος των στοιχείων θα είναι ίσο με 1, μετά από t διαιρέσεις όπου: n(1/2) t =1 => 2 t =n => t=log 2 n. Για το συγκεκριμένο παράδειγμα n=16 συνεπώς t=4. 10
Τύποι Δεδομένων Ατομικοί - με απλές τιμές (ακέραιοι, πραγματικοί, λογικοί, χαρακτήρες). Κάθε ατομικός τύπος ορίζεται από το όνομά του (π.χ. integer), το πεδίο τιμών του (π.χ. -32768 έως 32767) και τις επιτρεπόμενες πράξεις (π.χ. πρόσθεση, αφαίρεση, κλπ.). Δομημένοι - με σύνθετες τιμές (πίνακες, εγγραφές, λίστες, δένδρα). Αποτελούνται από επιμέρους τιμές (στοιχεία, πεδία, κόμβοι) και διαθέτουν ένα οργανωτικό σχήμα. Οι συνηθέστερες πράξεις - λειτουργίες σε δομές δεδομένων είναι: η διαπέραση (προσπέλαση και επεξεργασία στοιχείου/κόμβου), η αναζήτηση (εύρεση στοιχείου/κόμβου με κάποια τιμή), η εισαγωγή (πρόσθεση ενός νέου στοιχείου/κόμβου), η διαγραφή (αφαίρεση υπάρχοντος στοιχείου/κόμβου) και η ταξινόμηση (διάταξη στοιχείου/κόμβου με κάποια σειρά). 11
Πίνακες Μία ή περισσότερες διαστάσεις Κάθε διάσταση έχει όρια (π.χ. 0 έως 9). Κάθε στοιχείο χαρακτηρίζεται από τη θέση του στον πίνακα, που αποτελείται από τόσες τιμές όσες και οι διαστάσεις. Ομοειδή στοιχεία Όλα συγκεκριμένου τύπου (ακέραιοι, εγγραφές, κλπ.). Στατική δομή Πρέπει να δηλωθεί εξ αρχής το μέγεθος του πίνακα. Γραμμική δομή Υπάρχει «λογική» διάταξη των στοιχείων, δηλαδή κάθε στοιχείο έχει ένα επόμενο (πλην του τελευταίου) και ένα προηγούμενο (πλην του πρώτου). Αποθήκευση στοιχείων σε συνεχόμενες θέσεις Τυχαία προσπέλαση (χρόνος ανεξάρτητος της θέσης). Είναι οι βασικότερες δομές όπου στηρίζονται πιο πολύπλοκοι αλγόριθμοι και δομές δεδομένων. 12
Πίνακες Βασικό χαρακτηριστικό των πινάκων: Τα στοιχεία είναι αποθηκευμένα στη μνήμη σε συνεχόμενες θέσεις, με αποτέλεσμα να μπορούμε να υποστηρίξουμε τυχαία προσπέλαση σε οποιοδήποτε στοιχείο του πίνακα. Συνάρτηση Απεικόνισης Πίνακα (ΣΑΠ): μας δίνει τη θέση ενός στοιχείου του πίνακα στη μνήμη, με βάση τη θέση του, τον τύπο των στοιχείων του πίνακα και τη διεύθυνση του πρώτου στοιχείου. Αν η διεύθυνση του πρώτου στοιχείου είναι η L 0 και κάθε στοιχείο καταλαμβάνει (βάσει του τύπου των στοιχείων) c bytes, τότε: Θέση του στοιχείου a[i] σε μονοδιάστατο πίνακα a, N στοιχείων: L i = L 0 + i*c (στη γλώσσα C, το πρώτο στοιχείο είναι στη θέση 0) Θέση του στοιχείου b[i][j] σε δισδιάστατο πίνακα b, M x N στοιχείων που είναι αποθηκευμένα κατά γραμμές: L ij = L 0 + i*n*c + j*c (στη γλώσσα C, το πρώτο στοιχείο είναι στη θέση 0,0) 13
πίνακας μίας διάστασης με ακεραίους Πίνακες 1 2 5 2 3 6 9 8 πίνακας μίας διάστασης με εγγραφές 1 Mary 25 2 John 21 3 Kate 30 4 Bill 44 5 Jack 31 6 Jason 50 πίνακας δύο διαστάσεων (3 x 5) με ακεραίους 5 4 6 7 5 4 4 2 2 1 5 6 1 1 2 14
Συνδεδεμένες Λίστες Ομοειδή στοιχεία Αποτελούνται από 2 μέρη: πληροφορία και δείκτη. Η πληροφορία μπορεί να είναι ατομική ή ομαδική (εγγραφή). Δυναμική δομή Μπορούμε να προσθαφαιρούμε στοιχεία χωρίς πρόβλημα. Γραμμική δομή Υπάρχει «λογική» διάταξη των στοιχείων, δηλαδή κάθε στοιχείο έχει ένα επόμενο (πλην του τελευταίου) και ένα προηγούμενο (πλην του πρώτου). Αποθήκευση στοιχείων σε διάσπαρτες θέσεις Σειριακή προσπέλαση (ξεκινάμε πάντα από την αρχή και μετακινούμαστε μέσω των δεικτών στον επόμενο κόμβο). Διαγραφή στοιχείου με αλλαγή τιμής ενός δείκτη 15
Συνδεδεμένη λίστα με ακεραίους Συνδεδεμένες Λίστες 1 2 5 2 3 6 9 8 first Κάθε κόμβος έχει ένα δείκτη next στον επόμενο κόμβο last Διπλά συνδεδεμένη λίστα με εγγραφές (σε αύξουσα σειρά ονομάτων) 1 Bill 25 2 Jack 21 3 Jason 30 4 John 44 5 Kate 31 6 Mary 50 first Κάθε κόμβος έχει ένα δείκτη next στον επόμενο κόμβο και ένα δείκτη previous στον προηγούμενο κόμβο last 16
Συνδεδεμένες Λίστες Παράδειγμα εισαγωγής στοιχείου (σε αύξουσα σειρά ονομάτων, αρχικά γνωστά x και z) 1 Bill 25 2 Jack 21 3 Jason 30 4 John 44 5 Kate 31 6 Mary 50 x y first 10 Jim 30 z last y = x->next x -> next = z z -> previous = x y -> previous = z z -> next = y 17
Στοίβα Λογική LIFO (Last-In First-Out). Υποστηρίζονται δύο βασικές λειτουργίες: εισαγωγή (push) εξαγωγή (pop) Υλοποιείται συνήθως με πίνακα (όπου η κεφαλή T αυξομειώνεται κατά 1 σε κάθε εισαγωγή ή διαγραφή), αλλά και με συνδεδεμένη λίστα. Χρησιμοποιείται όταν θέλουμε να επεξεργαστούμε κάποια στοιχεία με αντίστροφη σειρά από αυτή που τα εισάγουμε (π.χ. στη μετατροπή δεκαδικού σε δυαδικό, όπου κάνουμε διαιρέσεις και παίρνουμε τα υπόλοιπα από το τέλος προς την αρχή). 18
Στοίβα Παράδειγμα 7 10 5 10 5 5 push(5) push(10) push(7) pop() pop() 19
Βασικές Εφαρμογές Στοίβας κλήση υποπρογραμμάτων αναπαράσταση και εκτίμηση αριθμητικών εκφράσεων οπισθοδρόμηση (backtracking) 20
Ουρά Λογική FIFO (First-In First-Out) Υποστηρίζονται δύο βασικές λειτουργίες: εισαγωγή στο τέλος (insert) διαγραφή από την αρχή (delete). Υλοποιείται συνήθως με πίνακα, όπου υπάρχει μετρητής - δείκτης της θέσης εξαγωγής (first ή front) και μετρητής - δείκτης της θέσης εισαγωγής (last ή rear), αλλά και με συνδεδεμένη λίστα σε περίπτωση που δεν θέλουμε να περιορίσουμε το πλήθος των στοιχείων που θα εισαχθούν στη δομή. 21
Βασικές Εφαρμογές Oυράς διαχείριση πόρων σε λειτουργικά συστήματα και δίκτυα επεξεργασία αιτήσεων πελατών, εργασιών, και παραγγελιών σε εμπορικές εφαρμογές προσομοίωση συστημάτων 22
Δένδρα Αποτελούνται από κόμβους και ακμές που τους συνδέουν. Κάθε κόμβος έχει παιδιά (πλην των φύλλων) και ένα μόνο γονέα (πλην της ρίζας). Ορολογία Διαδρομή (path) από ένα κόμβο Ν x σε ένα άλλο κόμβο Ν y είναι μια ακολουθία κόμβων όπου πρώτος είναι ο Ν x, τελευταίος ο Ν y και κάθε άλλος κόμβος είναι παιδί του προηγουμένου. Μήκος (length) μιας διαδρομής είναι ο αριθμός των ακμών που περιλαμβάνονται σ αυτήν. Επίπεδο (level) ή βάθος (depth) ενός κόμβου είναι το μήκος της μοναδικής διαδρομής από τη ρίζα στον κόμβο αυτό. Ύψος (height) ενός δένδρου είναι το μέγιστο βάθος των (τερματικών) κόμβων του. Βαθμός (degree) ενός κόμβου είναι ο αριθμός των παιδιών του. Βαθμός ενός δένδρου είναι ο μέγιστος των βαθμών των κόμβων του. 23
Δυαδικά Δένδρα Δυαδικά δένδρα: έχουν βαθμό 2. Σε κάθε κόμβο: Αριστερό υποδένδρο - δεξιό υποδένδρο Πλήρες δυαδικό δένδρο: έχει το μέγιστο αριθμό κόμβων σε κάθε επίπεδο πλην ίσως του τελευταίου (αν στο τελευταίο δεν έχει το μέγιστο αριθμό κόμβων, οι κόμβοι πρέπει να είναι όσο το δυνατό αριστερά). Αναπαράσταση Συνεχόμενη αναπαράσταση (με πίνακα) Η ρίζα μπαίνει στη θέση 0. Αν ένας κόμβος είναι στη θέση k, το αριστερό παιδί του θα είναι στη θέση 2*k+1 και το δεξιό παιδί του θα είναι στη θέση 2*k+2. Συνδεδεμένη αναπαράσταση (η πιο συνήθης μορφή) Χρήση 2 δεικτών (left, right) 24
Δυαδικά Δένδρα Δομή ενός κόμβου σε συνδεδεμένη αναπαράσταση Δεδομένα Left Right Ρίζα αριστερού υποδένδρου Ρίζα δεξιού υποδένδρου αριστερό υποδένδρο Δεξιό υποδένδρο 25
Διαπεράσεις Δυαδικών Δένδρων Κάθε διαδικασία επίσκεψης όλων των κόμβων ενός δένδρου, ακριβώς μία φορά τον καθένα, λέγεται διαπέραση ή διάσχιση (traversal). Προδιατεταγμένη διαπέραση (pre-order): Για κάθε κόμβο, επισκεπτόμαστε πρώτα τον ίδιο τον κόμβο, έπειτα τους κόμβους του αριστερού του υποδένδρου και στη συνέχεια τους κόμβους του δεξιού του υποδένδρου. Μεταδιατεταγμένη διαπέραση (post-order): Για κάθε κόμβο, επισκεπτόμαστε πρώτα τους κόμβους του αριστερού του υποδένδρου, έπειτα τους κόμβους του δεξιού του υποδένδρου και στη συνέχεια τον ίδιο τον κόμβο. Ενδοδιατεταγμένη διαπέραση (in-order): Για κάθε κόμβο, επισκεπτόμαστε πρώτα τους κόμβους του αριστερού του υποδένδρου, έπειτα τον ίδιο τον κόμβο και στη συνέχεια τους κόμβους του δεξιού του υποδένδρου. 26
Διαπεράσεις Δυαδικών Δένδρων Προδιατεταγμένη (ΡΑΔ): x, b, w, c, e, g, f, h, z Μεταδιατεταγμένη (ΑΔΡ): w, b, g, e, h, z, f, c, x Ενδοδιατεταγμένη (ΑΡΔ): b, w, x, g, e, c, h, f, z b x c w e f g h z 27
Ειδικά Δυαδικά Δένδρα Δυαδικά Δένδρα Αναζήτησης Το αριστερό υποδένδρο κάθε κόμβου έχει τιμές μικρότερες από την τιμή του κόμβου. Το δεξιό υποδένδρο κάθε κόμβου έχει τιμές μεγαλύτερες από την τιμή του κόμβου. Χρησιμοποιούνται στην αναζήτηση στοιχείων, όπου ενδέχεται να βελτιώσουν σημαντικά το χρόνο (αντίστοιχα με τη δυαδική αναζήτηση σε ταξινομημένο πίνακα). Η δυαδική αναζήτηση σε ταξινομημένο πίνακα παίρνει Ο(log n) χρόνο και αυτό επιτυγχάνεται και στα ισοζυγισμένα δυαδικά δένδρα αναζήτησης. Με ενδοδιατεταγμένη διαπέραση παίρνουμε τα στοιχεία ταξινομημένα κατά αύξουσα σειρά. Δένδρα - Σωροί Πλήρη δυαδικά δένδρα. Στο σωρό ελαχίστων, η τιμή κάθε κόμβου είναι μικρότερη από τις τιμές των παιδιών του. Στο σωρό μεγίστων, η τιμή κάθε κόμβου είναι μεγαλύτερη από τις τιμές των παιδιών του. 28
εισαγωγή στοιχείων: 8, 4, 12, 2, 6, 14, 18, 13 Δυαδικά Δένδρα Αναζήτησης 8 4 12 2 6 14 13 18 29
Παράδειγμα Αναζήτησης Αναζήτηση του στοιχείου 5 8 4 12 2 6 14 Δεν βρέθηκε 13 18 30
Δυαδικά Δένδρα Αναζήτησης Άσκηση: αναζητήστε ένα προς ένα όλα τα στοιχεία του δένδρου. Καταγράψτε το πλήθος των απαιτούμενων συγκρίσεων μεταξύ στοιχείων. στοιχείο συγκρίσεις 8 1 4 2 2 3 6 3 12 2 14 3 13 4 18 4 8 4 12 2 6 14 13 18 31
Δυαδικά Δένδρα Αναζήτησης Διαγραφές 1. Ο κόμβος που διαγράφεται δεν έχει υποδένδρα. 2. Ο κόμβος που διαγράφεται έχει μόνο ένα υποδένδρο. 3. Ο κόμβος που διαγράφεται έχει δύο υποδένδρα. 32
Δυαδικά Δένδρα Αναζήτησης Διαγραφές Οι πρώτες δύο περιπτώσεις είναι πιο εύκολες. Έστω ότι διαγράφουμε έναν κόμβο t που δεν έχει υποδένδρα (παιδιά). Τότε απλά διαγράφουμε τον κόμβο και θέτουμε το δείκτη του γονιού σε NULL. Αν ο κόμβος που διαγράφεται έχει μόνο ένα υποδένδρο (παιδί), τότε μετά τη διαγραφή του κόμβου t, τη θέση του παίρνει η ρίζα του υποδένδρου (παιδιού) του t και ενημερώνεται κατάλληλα ο δείκτης του γονιού του t. 33
Δυαδικά Δένδρα Αναζήτησης Διαγραφή του 18: ο κόμβος που περιέχει το 18 δεν έχει υποδένδρα 8 8 4 12 4 12 2 6 14 2 6 14 13 18 13 34
Δυαδικά Δένδρα Αναζήτησης Διαγραφή του 12: ο κόμβος που περιέχει το 12 έχει μόνο δεξιό υποδένδρο 8 8 4 12 4 14 2 6 14 2 6 13 13 35
Δυαδικά Δένδρα Αναζήτησης Διαγραφή κόμβου που έχει δύο υποδένδρα. Τη θέση του στοιχείου που διαγράφεται θα πάρει είτε το μεγαλύτερο στοιχείο του αριστερού υποδένδρου είτε το μικρότερο στοιχείο του δεξιού υποδένδρου. x 36
Δυαδικά Δένδρα Αναζήτησης Διαγραφή του 8 Αντικατάσταση με το μεγαλύτερο του αριστερού υποδένδρου 8 6 4 12 4 12 2 6 14 2 14 13 18 13 18 37
Δυαδικά Δένδρα Αναζήτησης Διαγραφή του 8 Αντικατάσταση με το μικρότερο του δεξιού υποδένδρου 8 12 4 12 4 2 6 14 2 6 14 13 18 12 13 18 4 14 2 6 13 18 38
Δένδρο - Σωρός Είναι ένα πλήρες δυαδικό δένδρο που υποστηρίζει τις εξής βασικές λειτουργίες: Εύρεση ελαχίστου (ή μεγίστου) σε σταθερό χρόνο. Εισαγωγή στοιχείου σε χρόνο O(logn), όπου n το πλήθος των στοιχείων του σωρού. Διαγραφή ελαχίστου (ή μεγίστου) σε χρόνο O(logn). Να συγκρίνετε τους χρόνους αυτούς με τους αντίστοιχους του ταξινομημένου πίνακα. 39
Δένδρο - Σωρός Σωρός ελαχίστων (minheap) Το δένδρο-σωρός αναπτύσσεται από επάνω προς τα κάτω και από αριστερά προς τα δεξιά. Μόνο το τελευταίο επίπεδο μπορεί να μην είναι πλήρως συμπληρωμένο. 6 9 7 Το στοιχείο ενός κόμβου είναι μικρότερο από τα στοιχεία των παιδιών του. 12 11 20 8 10 Το ελάχιστο στοιχείο βρίσκεται πάντα στη ρίζα του δένδρου. 40
Δένδρο - Σωρός Διαδικασία εισαγωγής Το νέο στοιχείο τοποθετείται σε ένα νέο κόμβο στο τέλος του σωρού. Στη συνέχεια, λαμβάνουν χώρα αντιμεταθέσεις ώστε το νέο στοιχείο να τοποθετηθεί τελικά στο σωστό επίπεδο. Το νέο στοιχείο μπορεί να φτάσει μέχρι τη ρίζα του σωρού. 41
Δένδρο - Σωρός Παράδειγμα: εισαγωγή του 5 1 2 6 6 9 7 9 7 11 20 8 10 5 20 8 10 12 5 12 11 5 4 6 3 6 7 5 7 9 20 8 10 9 20 8 10 12 11 12 11 42
Δένδρο - Σωρός Διαδικασία διαγραφής ελαχίστου Παίρνουμε το τελευταίο στοιχείο του σωρού και το τοποθετούμε στη ρίζα. Στη συνέχεια, λαμβάνουν χώρα αντιμεταθέσεις ώστε το στοιχείο που μπήκε στη ρίζα να τοποθετηθεί τελικά στο σωστό επίπεδο. Το στοιχείο που τοποθετήθηκε στη ρίζα μπορεί να φτάσει μέχρι το τελευταίο επίπεδο του σωρού. Το μέγεθος (=πλήθος στοιχείων) του σωρού μειώνεται κατά ένα. 43
Δένδρο - Σωρός Παράδειγμα: διαγραφής ελαχίστου 5 1 2 11 6 7 6 7 9 20 8 10 9 20 8 10 12 11 12 6 4 6 3 9 7 11 7 11 20 8 10 9 20 8 10 12 12 44
Αποθήκευση σωρού σε πίνακα Δένδρο - Σωρός 5 6 7 9 20 8 10 12 11 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5 6 7 9 20 8 10 12 11 Τα παιδιά του κόμβου που βρίσκεται στη θέση i του πίνακα βρίσκονται στις θέσεις 2i+1 και 2i+2. Ο γονέας του κόμβου που βρίσκεται στη θέση i του πίνακα βρίσκεται στη θέση (i-1)/2 45
Δένδρο - Σωρός Σωρός μεγίστων (maxheap) Το δένδρο-σωρός αναπτύσσεται από επάνω προς τα κάτω και από αριστερά προς τα δεξιά. Μόνο το τελευταίο επίπεδο μπορεί να μην είναι πλήρως συμπληρωμένο. 20 11 12 Το στοιχείο ενός κόμβου είναι μεγαλύτερο από τα στοιχεία των παιδιών του. 9 6 8 10 Το μέγιστο στοιχείο βρίσκεται πάντα στη ρίζα του δένδρου. 7 46
76 22 64 Άσκηση για δένδρο-σωρό Δίνεται η εξής δενδρική δομή: 14 12 17 38 49 21 19 31 10 15 48 3 74 62 1. Αποτελεί η δομή αυτή δένδρο-σωρό; Αιτιολογήστε την απάντησή σας. 2. Θεωρήστε ότι το δένδρο σαρώνεται με την ενδοδιατεταγμένη διαπέραση και τα δεδομένα των κόμβων του εισάγονται, με διαδοχικές λειτουργίες push, σε μια στοίβα. Στη συνέχεια, τα δεδομένα εξάγονται από τη στοίβα με διαδοχικές λειτουργίες pop και εισάγονται σε μια νέα δομή δένδρου σωρού. Να δείξετε το νέο δένδρο σωρό μετά από την εισαγωγή των στοιχείων 15, 76, 19, 14, 74. 3. Να γίνει διαγραφή της ρίζας στο τελικό δένδρο-σωρό που προκύπτει μετά την εισαγωγή όλων των δεδομένων του ερωτήματος 2. Απεικονίστε το τελικό δένδρο που προκύπτει μετά τις αλλαγές που συντελούνται λόγω της διαγραφής. 47
Απάντηση 1. Όχι, το δένδρο αυτό δεν αποτελεί δομή σωρού γιατί ενώ είναι πλήρες δυαδικό δένδρο, οι κόμβοι γονείς με τις τιμές 14, 49, 12, 38 είναι μικρότεροι από τους κόμβους παιδιά δηλαδή (14<49, 14<21), (49<74, 49<62), (12<19, 12<31) και (38<48). 2. Τα δεδομένα που προκύπτουν κατά την εφαρμογή της ενδοδιατεταγμένης διαπέρασης στο δεδομένο δένδρο είναι τα εξής (με αυτή τη σειρά): 74,49,62,14,21,22,19,12,31,76,10,17,15,64,48,38,3. Συνεπώς, η στοίβα έχει την μορφή του διπλανού σχήματος: 3 38 48 64 15 17 10 76 31 12 19 22 21 14 62 49 74 48
64 Εισαγωγή 15 48 38 3 15 64 64 48 38 48 38 3 15 17 10 76 19 17 10 Εισαγωγή 76 76 64 3 76 76 38 64 38 48 15 17 10 48 15 17 10 3 3 49
Εισαγωγή 19 76 64 38 48 15 17 10 3 31 12 19 76 64 38 48 19 17 10 3 31 12 15 50
Εισαγωγή 14 76 64 38 48 19 22 10 3 31 12 15 17 21 14 76 64 38 48 19 22 14 3 31 12 15 17 21 10 51
Εισαγωγή 74 76 76 64 62 64 62 49 19 22 38 48 31 12 15 17 21 10 14 3 74 74 19 22 49 31 12 15 17 21 3 48 38 10 14 76 76 64 62 74 62 49 19 22 38 64 19 22 38 74 31 12 15 17 21 10 14 49 31 12 15 17 21 10 14 3 48 3 48 52
Διαγραφή της ρίζας: 74 76 48 62 74 62 64 19 22 38 49 31 12 15 17 21 10 14 64 19 22 38 3 49 31 12 15 17 21 3 48 10 14 74 64 62 48 19 22 38 48 49 31 12 15 17 21 10 14 3 74 62 74 64 19 22 38 49 31 12 15 17 21 10 14 64 62 3 49 19 22 38 48 31 12 15 17 21 10 14 3 53
Βασικές Εφαρμογές Δένδρων αναζήτηση σε διατεταγμένες λίστες και διάταξη αλγόριθμοι συμπίεσης δεδομένων αναπαράσταση και εκτίμηση αριθμητικών εκφράσεων αναπαράσταση οντολογιών αποθήκευση και δεικτοδότηση συμβολοσειρών 54
Διάταξη ή Ταξινόμηση Αποτελεί βασική λειτουργία στα συστήματα επεξεργασίας δεδομένων. Είσοδος: σύνολο στοιχείων που βρίσκονται σε έναν πίνακα. Έξοδος: ταξινομημένος πίνακας σε αύξουσα ή φθίνουσα διάταξη. Επειδή η ταξινόμηση χρησιμοποιείται συχνά για την επίλυση δυσκολότερων προβλημάτων θα πρέπει να εκτελείται γρήγορα. 55
Διάταξη Γνωστότεροι αλγόριθμοι διάταξης: με επιλογή (selection sort) με εισαγωγή (insertion sort) με ανταλλαγή ή φυσαλίδας (exchange sort ή bubble sort) με συγχώνευση (mergesort) με χρήση σωρού (heapsort) γρήγορη ταξινόμηση (quicksort) 56
Διάταξη με Επιλογή Από τις πλέον κατανοητές «διαισθητικά». Διαίρεσε τον πίνακα σε έναν ταξινομημένο υποπίνακα και σε έναν μη-ταξινομημένο. Για αύξουσα ταξινόμηση, σε κάθε πέρασμα, το μικρότερο στοιχείο του μη-ταξινομημένου υποπίνακα τοποθετείται στην αρχή του. Για φθίνουσα ταξινόμηση, σε κάθε πέρασμα, το μεγαλύτερο στοιχείο του μη-ταξινομημένου υποπίνακα τοποθετείται στην αρχή του. 57
Διάταξη με Επιλογή Σε κάθε πέρασμα, Βρες το μικρότερο στοιχείο στη μη ταξινομημένη λίστα Αντάλλαξε το επιλεγμένο στοιχείο με το στοιχείο στην αρχή της μη-ταξινομημένης λίστας Σημείωση: εναλλακτικά ο αλγόριθμος βρίσκει κάθε φορά το μεγαλύτερο στοιχείο και το τοποθετεί στο τέλος. 58
Αλγόριθμος Διάταξης με Επιλογή Το μικρότερο στοιχείο τοποθετείται στην αρχή. for (i=0; i<n-1; ++i) { min = A[i]; pos = i; for (k=i+1; k<n; ++k) if (A[k] < min) { min = A[k]; pos = k; } A[pos] = A[i]; A[i] = min; } 59
Διάταξη με Επιλογή Βρες το ελάχιστο 9 2 1 5 7 6 3 4 Τοποθέτησε το ελάχιστο στην αρχή 1 2 9 5 7 6 3 4 Βρες το ελάχιστο 1 2 9 5 7 6 3 4 Τοποθέτησε το ελάχιστο στην αρχή 1 2 9 5 7 6 3 4 Βρες το ελάχιστο 1 2 9 5 7 6 3 4 Τοποθέτησε το ελάχιστο στην αρχή 1 2 3 5 7 6 9 4 ταξ. υποπίνακας μη ταξ. υποπίνακας Σχολιάστε για το πλήθος συγκρίσεων που απαιτούνται 60
Διάταξη Φυσαλίδας Αλγόριθμος αύξουσας διάταξης Έστω ο πίνακας A με n στοιχεία. Σε κάθε πέρασμα, συγκρίνονται δύο γειτονικά στοιχεία, έστω στις θέσεις i και i+1. Εάν Α[i] > A[i+1], τότε αντιμεταθέτουμε τα δύο στοιχεία. Στο i-οστό πέρασμα (i=1,2,,n-1), βρίσκεται το i-οστό μικρότερο στοιχείο και τοποθετείται στην i-οστή θέση του πίνακα. 61
Αλγόριθμος Διάταξης Φυσαλίδας Το μικρότερο στοιχείο τοποθετείται στην αρχή. for (i=1; i<n; ++i) for (k=n-1; k>=i; --k) if (A[k] < A[k-1]) { temp = A[k-1]; A[k-1] = A[k]; A[k] = temp; } 62
Το μικρότερο στοιχείο τοποθετείται στην αρχή. Πρώτο πέρασμα: το στοιχείο 1 τοποθετείται στην αρχή του πίνακα. Ερώτηση: Πόσες συγκρίσεις/αντιμεταθέσεις πραγματοποιούνται στη χειρότερη περίπτωση στο πρώτο πέρασμα; Πόσες στο δεύτερο; Πόσες συνολικά συγκρίσεις θα εκτελεστούν σε σχέση με το μέγεθος (n) του πίνακα; Διάταξη Φυσαλίδας 9 2 1 5 7 6 3 4 9 2 1 5 7 6 3 4 9 2 1 5 7 3 6 4 9 2 1 5 7 3 6 4 9 2 1 5 3 7 6 4 9 2 1 5 3 7 6 4 9 2 1 3 5 7 6 4 9 2 1 3 5 7 6 4 9 1 2 3 5 7 6 4 9 1 2 3 5 7 6 4 1 9 2 3 5 7 6 4 63
Γρήγορη Διάταξη Η «γρήγορη» διάταξη βασίζεται στην αρχή του «Διαίρει και Βασίλευε». Στον προγραμματισμό της χρησιμοποιούμε την τεχνική της «αναδρομής». Είναι αισθητά πιο αποδοτική από τις προηγούμενες δύο. 64
Γρήγορη Διάταξη Διαίρει: διάλεξε ένα στοιχείο «άξονα» του πίνακα. Με βάση αυτό, χώρισε τον πίνακα στα δύο: στον αριστερό υποπίνακα βάλε όλα τα μικρότερα στοιχεία και στο δεξιό όλα τα μεγαλύτερα από το στοιχείο-άξονα Αναδρομή: Αναδρομικά κάνε το ίδιο στους δύο υποπίνακες. Βασίλευε: Βάλε στη σειρά τον αριστερό υποπίνακα, το στοιχείο-άξονα και τέλος τον δεξιό υποπίνακα. Σημείωση: στην απλή εκδοχή της quicksort ως στοιχείο-άξονας επιλέγεται συνήθως το πρώτο στοιχείο του κάθε υποπίνακα. 65
Γρήγορη Διάταξη 1) Επιλογή: Διάλεξε το στοιχείο-άξονα 2) Διαίρει: Βάλτο σε θέση ώστε αριστερά να είναι τα μικρότερα και δεξιά τα μεγαλύτερα 3) Βασίλευε: ταξινόμησε αναδρομικά 66
Γρήγορη Διάταξη Ο αλγόριθμος διαχωρισμού του πίνακα σε μεγαλύτερα και σε μικρότερα στοιχεία είναι ο εξής: Διαπερνάμε τον πίνακα ταυτόχρονα από τα δύο άκρα προς το κέντρο του με τη βοήθεια δύο δεικτών. Ο αριστερός δείκτης σταματά όταν συναντήσει στοιχείο μεγαλύτερο από το στοιχείο-άξονα, ενώ ο δεξιός όταν συναντήσει στοιχείο μικρότερο ή ίσο από αυτό. Όταν σταματήσουν και οι δύο, γίνεται εναλλαγή των στοιχείων που σταμάτησαν και κατόπιν η διαπέραση συνεχίζεται. Τα (2) και (3) επαναλαμβάνονται μέχρις ότου οι δείκτες διασταυρωθούν, οπότε σταματά η διαπέραση και γίνεται εναλλαγή του στοιχείου-άξονα με το στοιχείο που δείχνει ο δεξιός δείκτης. 67