Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 3. Στοίβες & Ουρές 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 19/10/2017
Ανακεφαλαίωση: Πίνακες Οι δομές δεδομένων που είδαμε ως τώρα (πίνακες) είναι κατάλληλες για αναπαράσταση δεδομένων σαν αυτά που βρίσκονται σε μια βάση δεδομένων Παράδειγμα: Αρχεία προσωπικού, αποθήκη, οικονομικά δεδομένα, κτλ. ηλαδή δεδομένα που υφίστανται στον πραγματικό κόσμο Τέτοιες δομές διευκολύνουν την πρόσβαση στα δεδομένα Αποδοτική εισαγωγή, διαγραφή, και αναζήτηση δεδομένων Δομές Δεδομένων, 3ο Εξάμηνο 2
Δομές Δεδομένων ως Προγραμματιστικά Εργαλεία Οι δομές δεδομένων που θα εξετάσουμε στη συνέχεια χρησιμοποιούνται ως προγραμματιστικά εργαλεία Αποτελούν εννοιολογικές αναπαραστάσεις που υποβοηθούν στην ανάπτυξη προγραμμάτων ημιουργούνται για να επιτελέσουν μια συγκεκριμένη λειτουργία κατά τη διάρκεια εκτέλεσης ενός προγράμματος Όταν ολοκληρωθεί η λειτουργία, η δομή δε χρησιμεύει πλέον, και καταστρέφεται Δομές Δεδομένων, 3ο Εξάμηνο 3
Περιορισμένη Προσπέλαση Σε έναν πίνακα, η προσπέλαση ενός αντικειμένου μπορεί να γίνει είτε άμεσα (εφόσον η θέση του είναι γνωστή), π.χ. A[12] είτε διατρέχοντας τον πίνακα κελί-κελί ώσπου να βρεθεί, π.χ. με ένα βρόχο (loop) for(int i=0 ; i < A.length ; i++) {... A[i]... } Στις δομές που θα εξετάσουμε τώρα η προσπέλαση είναι περιορισμένη Μόνο ένα αντικείμενο μπορεί να διαβαστεί ή να διαγραφεί μια δεδομένη χρονική στιγμή Η διεπαφή (interface) των δομών αυτών είναι σχεδιασμένη ώστε να επιβάλλει την περιορισμένη πρόσβαση Δομές Δεδομένων, 3ο Εξάμηνο 4
Πιο Αφηρημένες Δομές Οι στοίβες και οι ουρές είναι πιο αφηρημένες δομές από τους πίνακες Ορίζονται ουσιαστικά από το interface τους Ο εσωτερικός μηχανισμός που τις υλοποιεί δεν είναι ορατός στο χρήστη τους Παράδειγμα Μία στοίβα μπορεί να υλοποιηθεί με χρήση πίνακα ή με συνδεδεμένη λίστα Δομές Δεδομένων, 3ο Εξάμηνο 5
Στοίβες (Stacks)
Στοίβα (Stack) LIFO (Last In, First Out) δομή δεδομένων H στοίβα περιορίζει την προσπέλαση στo στοιχείο που εισήχθη πιο πρόσφατα Η δομή στοίβα μπορεί να υλοποιηθεί με έναν πίνακα και έναν δείκτη στο στοιχείο της κορυφής της. topofstack Δομές Δεδομένων, 3ο Εξάμηνο 7
Μερικές Εφαρμογές Στοιβών Έλεγχος ισορροπίας παρενθέσεων και αγκύλων σε μία έκφραση Συντακτική ανάλυση εκφράσεων, όπως 3*(4+5) Βοηθητική δομή για αλγόριθμους εξέτασης κόμβων δέντρου ή αναζητήσεις στις κορυφές ενός γράφου Μικροεπεξεργαστές χρησιμοποιούν αρχιτεκτονική που στηρίζεται σε στοίβες Υπολογιστές τσέπης Δομές Δεδομένων, 3ο Εξάμηνο 8
Αναλογία με Φυσικό Κόσμο Μια στοίβα με ταχυδρομικές επιστολές Εξέταση των επιστολών από πάνω προς τα κάτω Μια στοίβα από πιάτα Πλύσιμο των πιάτων από πάνω προς τα κάτω Βασικές ενέργειες μιας στοίβας Τοποθέτηση στοιχείου στην κορυφή μιας στοίβας Ονομάζεται εισαγωγή (push) Απομάκρυνση στοιχείου από την κορυφή Ονομάζεται εξαγωγή (pop) Δομές Δεδομένων, 3ο Εξάμηνο 9
Παράδειγμα Λειτουργιών Στοίβας Δομές Δεδομένων, 3ο Εξάμηνο 10
Υλοποίηση Στοίβας top δείκτης στην κορυφή της στοίβας Κενή στοίβα: top = -1 stackarray πίνακας στον οποίο αποθηκεύονται τα στοιχεία της στοίβας maxsize μέγεθος πίνακα που υλοποιεί τη στοίβα Δομές Δεδομένων, 3ο Εξάμηνο 11
October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 12
Δομές Δεδομένων, 3ο Εξάμηνο 13
Δομές Δεδομένων, 3ο Εξάμηνο 14
Χειρισμός Λαθών Τι θα συμβεί κατά την εισαγωγή στοιχείου σε πλήρη στοίβα; Τι θα συμβεί κατά την εξαγωγή στοιχείου από κενή στοίβα; Στη συγκεκριμένη υλοποίηση ο χειρισμός των λαθών αφήνεται στο χρήστη if (! thestack.isfull() ) thestack.push(item); else System.out.println( Error ); Άλλες λύσεις: εσωτερικός έλεγχος λαθών στην κλάση με χρήση exception Δομές Δεδομένων, 3ο Εξάμηνο 15
Παράδειγμα Εφαρμογής Στοίβας Οι μεταγλωττιστές (compilers) χρειάζεται να ελέγχουν εάν υπάρχει ισορροπία στα σύμβολα σε διάφορες εκφράσεις ( should be matched with ) [ should be matched with ] /* should be matched with */, etc Examples of mismatches: a = b + (c d) * (e f)); while (m < (n[8] + a) { Λείπει ) p = 7; /* initializes p */ r =6; } Δομές Δεδομένων, 3ο Εξάμηνο 16
Αλγόριθμος Balance Checker read character ch; while not end of file if ch is (, or [, or { push(ch); else if ch is ), ], or } { pop symbol from stack; if ch and popped symbol not matching return error; } else if ch is anything else, ignore read next character ch from file; if stack is empty return success; else return error; Δομές Δεδομένων, 3ο Εξάμηνο 17
Δομές Δεδομένων, 3ο Εξάμηνο 18
Δομές Δεδομένων, 3ο Εξάμηνο 19
Πολυπλοκότητα Λειτουργιών Στοίβας Τα στοιχεία εισάγονται και ανακτώνται από μια στοίβα σε σταθερό χρόνο O(1) Είναι ανεξάρτητο του μεγέθους της στοίβας (N) Και οι δύο λειτουργίες είναι πολύ αποδοτικές (γρήγορες) εν απαιτούνται συγκρίσεις στοιχείων ή μετακινήσεις στοιχείων, που εμπεριέχουν κόστος Όμως δεν υπάρχει δυνατότητα απευθείας ανάκτησης ενός συγκεκριμένου στοιχείου από τη στοίβα ανάκτησης του i-οστού στοιχείου Δομές Δεδομένων, 3ο Εξάμηνο 20
Ουρές (Queues)
Ουρά (Queue) FIFO (First In, First Out) δομή δεδομένων Μία γραμμή αναμονής που αυξάνεται προσθέτοντας στοιχεία στο τέλος της και μικραίνει αφαιρώντας στοιχεία από την αρχή της Αντίθετα με τη στοίβα και τα δύο άκρα χρησιμοποιούνται Δομές Δεδομένων, 3ο Εξάμηνο 22
Αναλογία με Φυσικό Κόσμο Ουρά αναμονής για επιβίβαση σε μέσο μαζικής μεταφοράς Πακέτα δεδομένων που περιμένουν τη σειρά τους να μεταδοθούν στο Internet Ουρά εκτυπωτή με εργασίες εκτύπωσης που αναμένουν επεξεργασία Ουρά αποθήκευσης χαρακτήρων/συμβόλων που πληκτρολογούνται σε επεξεργαστή κειμένου Δομές Δεδομένων, 3ο Εξάμηνο 23
Βασικές Ενέργειες σε μια Ουρά Εισαγωγή στοιχείου Τοποθετείται πίσω στην ουρά Αφαίρεση στοιχείου Απομακρύνεται από μπροστά από την ουρά rear front Δομές Δεδομένων, 3ο Εξάμηνο 24
Αναπαράσταση Ουράς front αρχή της ουράς, η θέση στην οποία θα γίνει η επόμενη εξαγωγή rear τέλος της ουράς, τελευταία θέση στην οποία έχουμε εισάγει κάποιο στοιχείο rear+1 η επόμενη θέση στην οποία θα γίνει εισαγωγή Κενή ουρά front = 0, nitems = 0, rear = -1 Δομές Δεδομένων, 3ο Εξάμηνο 25
Αναπαράσταση Ουράς front rear Δομές Δεδομένων, 3ο Εξάμηνο 26
Παράδειγμα Λειτουργίας Ουράς Δομές Δεδομένων, 3ο Εξάμηνο 27
Υλοποίηση Ουράς με Κυκλικό Πίνακα Μπορεί να υλοποιηθεί χρησιμοποιώντας πίνακα Μη αποδοτική εάν μετακινούμε όλα τα στοιχεία μετά από κάθε κλήση της remove() Σπατάλη χώρου εάν δεν χρησιμοποιούμε όλα τα κελιά Για να αντιμετωπίσουμε το πρόβλημα διαχείρισης χώρου Μπορούμε να φανταστούμε την ουρά σαν έναν κυκλικό πίνακα ιατηρούμε 2 δείκτες: έναν για την αρχή (front) και έναν για το τέλος της ουράς (rear) Δομές Δεδομένων, 3ο Εξάμηνο 28
Παράδειγμα Λειτουργίας Ουράς με Κυκλικό Πίνακα (Αναδίπλωση) Όταν οι δείκτες back, front που δείχνουν στο τέλος και στην αρχή της ουράς αντίστοιχα φτάσουν στο τέλος του πίνακα Επαναορίζουμε τους δείκτες ώστε να δείχνουν και οι δύο στην αρχή October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 29
Βασικές Λειτουργίες Ουράς insert(val): εισάγει το αντικείμενο val στο τέλος της ουράς remove(): απομακρύνει το πρώτο στοιχείο από την ουρά peekfront(): επιστρέφει το πρώτο στοιχείο της ουράς isempty(): ελέγχει εάν η ουρά είναι άδεια isfull(): ελέγχει εάν η ουρά είναι γεμάτη size(): αριθμός στοιχείων στην ουρά Δομές Δεδομένων, 3ο Εξάμηνο 30
October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 31
October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 32
October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 33
Πολυπλοκότητα Λειτουργιών Ουράς (σε πλήρη αντιστοιχία με τη στοίβα) Τα στοιχεία εισάγονται και ανακτώνται από μια ουρά σε σταθερό χρόνο O(1) Είναι ανεξάρτητο του μεγέθους της ουράς (N) Και οι δύο λειτουργίες είναι πολύ αποδοτικές (γρήγορες) εν απαιτούνται συγκρίσεις στοιχείων ή μετακινήσεις στοιχείων, που εμπεριέχουν κόστος Όμως δεν υπάρχει δυνατότητα απευθείας ανάκτησης ενός συγκεκριμένου στοιχείου από την ουρά ανάκτησης του i-οστού στοιχείου Δομές Δεδομένων, 3ο Εξάμηνο 34
Ουρές Προτεραιότητας (Priority Queues) Δομές Δεδομένων, 3ο Εξάμηνο 35
Ουρές Προτεραιότητας: Εισαγωγή Μια ουρά προτεραιότητας είναι μια πιο εξειδικευμένη δομή δεδομένων σε σχέση με τη στοίβα ή την ουρά Όπως και στην ουρά, τα στοιχεία αφαιρώνται από την αρχή Όμως, τα στοιχεία ταξινομούνται (κατά την εισαγωγή) έτσι, ώστε το στοιχείο με το χαμηλότερο (ή το υψηλότερο) κλειδί να βρίσκεται πάντα μπροστά Δομές Δεδομένων, 3ο Εξάμηνο 36
Ουρές Προτεραιότητας: Εισαγωγή Τα στοιχεία τοποθετούνται στην ουρά με βάση την σημαντικότητά τους. Θεωρούμε ότι το στοιχείο με το μικρότερο (μεγαλύτερο) κλειδί έχει μεγαλύτερη προτεραιότητα Ο στόχος μας είναι να προσπελάσουμε το σημαντικότερο στοιχείο στη συλλογή απομακρύνουμε το στοιχείο από τη συλλογή Δομές Δεδομένων, 3ο Εξάμηνο 37
Λειτουργίες Μία ουρά προτεραιότητας είναι ένας αφηρημένος τύπος δεδομένων (abstract data type ADT) που προσφέρει μεθόδους που επιτρέπουν Απομάκρυνση στοιχείου με την ελάχιστη ή μέγιστη τιμή κλειδιού (στοιχείο στην αρχή της ουράς) Εισαγωγή Δομές Δεδομένων, 3ο Εξάμηνο 38
Υλοποίηση Υλοποίηση ουράς προτεραιότητας Ταξινομημένος πίνακας Απομάκρυνση του μεγαλύτερου στοιχείου γρήγορα Ο(1) Εισαγωγή διαρκεί περισσότερο χρόνο Ο(Ν) Πρέπει να μετακινηθούν τα μισά στοιχεία του πίνακα (κατά μέσο όρο) ώστε να εισαχθεί το νέο στοιχείο στη σωστή θέση Σωρός (είδος δέντρου) Εκτελεί εισαγωγή και διαγραφή σε χρόνο Ο(logN) Δομές Δεδομένων, 3ο Εξάμηνο 39
Δομές Δεδομένων, 3ο Εξάμηνο 40
Δομές Δεδομένων, 3ο Εξάμηνο 41
Δομές Δεδομένων, 3ο Εξάμηνο 42
Δομές Δεδομένων, 3ο Εξάμηνο 43
Άσκηση 1: Υλοποίηση Ουράς με 2 Στοίβες Δομές Δεδομένων, 3ο Εξάμηνο 44
Άσκηση 1 Δομές Δεδομένων, 3ο Εξάμηνο 45
Άσκηση 1 Δομές Δεδομένων, 3ο Εξάμηνο 46
Άσκηση 2: Υλοποίηση Στοίβας με 2 Ουρές Δομές Δεδομένων, 3ο Εξάμηνο 47
Άσκηση 2 Δομές Δεδομένων, 3ο Εξάμηνο 48
Άσκηση 2 Δομές Δεδομένων, 3ο Εξάμηνο 49