1 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΚΕΦΑΛΑΙΟ 3ο: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ ΜΕΡΟΣ 2 ο : ΣΤΟΙΒΑ & ΟΥΡΑ ΙΣΤΟΣΕΛΙΔΑ ΜΑΘΗΜΑΤΟΣ: http://eclass.sch.gr/courses/el594100/
ΣΤΟΙΒΑ 2 Μια στοίβα δεδομένων, μοιάζει με οποιαδήποτε άλλη στοίβα αντικειμένων στον πραγματικό κόσμο Μπορούμε να τοποθετήσουμε ή να αφαιρέσουμε αντικείμενα μόνο από την κορυφή της στοίβας Το τελευταίο αντικείμενο που τοποθετείται στη στοίβα εξάγεται πρώτο, και το πρώτο αντικείμενο που τοποθετήθηκε στη στοίβα, μπορεί να εξαχθεί αφού πρώτα εξαχθούν όλα τα προηγούμενα Τελευταίο μέσα, πρώτο έξω (LIFO Last In, First Out)
ΛΕΙΤΟΥΡΓΙΕΣ ΣΤΟΙΒΑΣ 3 Ώθηση (push) στοιχείου στην κορυφή της στοίβας Απώθηση (pop) στοιχείου από την κορυφή της στοίβας
ΕΛΕΓΧΟΣ ΛΕΙΤΟΥΡΓΙΩΝ 4 Η λειτουργία της ώθησης, πρέπει οπωσδήποτε να ελέγχει εάν η στοίβα είναι γεμάτη, οπότε συμβαίνει υπερχείλιση (overflow) της στοίβας Αντίστοιχα, η λειτουργία της απώθησης, πρέπει να ελέγχει αν υπάρχει τουλάχιστον ένα στοιχείο στη στοίβα, γιατί εάν η στοίβα είναι άδεια τότε συμβαίνει υποχείλιση (underflow) της στοίβας
ΥΛΟΠΟΙΗΣΗ ΣΤΟΙΒΑΣ ΜΕ ΠΙΝΑΚΕΣ 5 Η υλοποίηση μιας στοίβας με πίνακα είναι πολύ απλή Χρήση ενός μονοδιάστατου πίνακα μεγέθους ν (το μέγιστο δυνατό μέγεθος στοίβας) Χρειαζόμαστε μια επιπλέον μεταβλητή (Top), η οποία θα μας δείχνει τη θέση του πίνακα στην οποία βρίσκεται η κορυφή της στοίβας (το τελευταίο στοιχείο δηλαδή) Για να εξαχθεί ένα στοιχείο (απώθηση): Εξάγουμε το στοιχείο Stack[Top] Top Top - 1 Για να εισαχθεί στοιχείο (ώθηση): Top Top +1 Τοποθετούμε το νέο στοιχείο στη θέση Stack[Top] ΠΡΟΣΟΧΗ ΣΤΟΝ ΕΛΕΓΧΟ ΕΑΝ ΜΠΟΡΟΥΝ ΝΑ ΕΚΤΕΛΕΣΤΟΥΝ ΟΙ ΛΕΙΤΟΥΡΓΙΕΣ!!!
ΟΥΡΑ 6 Ανάλογα με τη στοίβα, η ουρά δεδομένων, είναι μια ουρά αναμονής αντίστοιχη με οποιαδήποτε άλλη πραγματική ουρά (π.χ. ουρά σε ταμείο τράπεζας) Η σειρά εξόδου από την ουρά (η σειρά εξυπηρέτησης δηλαδή) είναι η σειρά με την οποία μπήκαν στην ουρά, δηλαδή το πρώτο αντικείμενο που μπήκε στην ουρά θα βγει πρώτο, και το τελευταίο θα βγει μετά από όλα τα προηγούμενα Πρώτο μέσα, πρώτο έξω (First In, First Out FIFO)
ΛΕΙΤΟΥΡΓΙΕΣ ΟΥΡΑΣ 7 Εισαγωγή (enqueue) στοιχείου στο πίσω άκρο της ουράς Εξαγωγή (dequeue) στοιχείου από το εμπρός άκρο της ουράς
ΥΛΟΠΟΙΗΣΗ ΟΥΡΑΣ ΜΕ ΠΙΝΑΚΕΣ 8 Υλοποιείται με ένα μονοδιάστατο πίνακα Απαιτούνται δύο δείκτες για την υλοποίηση της ουράς: Ένας δείκτης να δείχνει το πρώτο στοιχείο προς εξαγωγή (front) Ένας δείκτης να δείχνει το τελευταίο στοιχείο, το οποίο μόλις εισήλθε στην ουρά(back) Κατά την εξαγωγή του στοιχείου: εξάγεται το στοιχείο Q[front] front front + 1 Κατά την εισαγωγή στοιχείου: rear rear +1, εισάγουμε το στοιχείο στη θέση Q[rear]
9 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΚΕΦΑΛΑΙΟ 3ο: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ ΜΕΡΟΣ 3 ο : ΑΝΑΖΗΤΗΣΗ - ΤΑΞΙΝΟΜΗΣΗ
ΑΝΑΖΗΤΗΣΗ ΣΤΟΙΧΕΙΟΥ ΣΕ ΠΙΝΑΚΑ 10 Ένα από τα πιο σημαντικά ζητήματα στον προγραμματισμό Χρησιμότητα σε πληθώρα εφαρμογών Οι μέθοδοι αναζήτησης, εξαρτώνται κυρίως από το εάν ο πίνακας είναι ταξινομημένος ή όχι Επιπλέον, σημαντική παράμετρος για τον καθορισμό του τρόπου αναζήτησης, είναι το εάν τα περιεχόμενα του πίνακα είναι όλα διάφορα μεταξύ τους ή όχι. Τα στοιχεία του πίνακα μπορεί να είναι αριθμητικά ή αλφαριθμητικά
Σχολιασμός 11 Υπάρχει μεγάλη συζήτηση για την έννοια της αναζήτησης. Θεωρητικά, ένας μαθητής μπορεί να σκεφτεί και να κατασκευάσει έναν αλγόριθμο που υλοποιεί την αναζήτηση από μόνος του, εφόσον έχει κατανοήσει τη φιλοσοφία και τη δομή των πινάκων. Επομένως τι προσφέρει η συστηματική μελέτη της αναζήτησης ως αυτοτελές θέμα; Μπορούμε να απαντήσουμε συνοπτικά ότι: Συντελεί στην «κωδικοποίηση» της διαδικασίας αναζήτησης αποσαφηνίζοντας έννοιες Συντελεί, με τη χρήση διαφορετικών μεθόδων αναζήτησης, στη διευκρίνιση και το διαχωρισμό μεταξύ των διαφορετικών πιθανών ειδών αναζήτησης που μπορεί να εμφανιστούν, αλλά και στον τρόπο με τον οποίο χειριζόμαστε την κάθε μία από αυτές. Εφόσον μια άσκηση δεν ζητά ρητά την υλοποίηση της σειριακής αναζήτησης, ο κάθε μαθητής έχει την ευχέρεια να αναζητεί στοιχεία σε πίνακες με όποιο τρόπο κρίνει προσφορότερο/ευκολότερο.
ΣΕΙΡΙΑΚΗ Ή ΓΡΑΜΜΙΚΗ ΜΕΘΟΔΟΣ ΑΝΑΖΗΤΗΣΗΣ 12 Η πιο απλή μέθοδος αναζήτησης Μη ταξινομημένος πίνακας Ξεκινώντας από το πρώτο στοιχείο του πίνακα, ελέγχουμε διαδοχικά τα στοιχεία του, μέχρι να βρούμε κάποιο που να έχει τιμή ίδια με αυτήν που αναζητούμε Η μέθοδος επιστρέφει 0 εάν δεν βρέθηκε στοιχείο, ή τη θέση του πίνακα στην οποία βρέθηκε το στοιχείο που αναζητούσαμε
ΣΕΙΡΙΑΚΗ Ή ΓΡΑΜΜΙΚΗ ΑΝΑΖΗΤΗΣΗ - 1 13 Αλγόριθμος Sequential_Search Δεδομένα // n, table, key // position 0 Για i από 1 μέχρι n Αν table[i]=key τότε position i Τέλος_αν Τέλος_επανάληψης Αν position= 0 τότε Εμφάνισε Δε βρέθηκε το στοιχείο Αλλιώς Εμφάνισε Το στοιχείο βρέθηκε στη θέση, position Τέλος_αν Τέλος Sequential_Search
ΣΕΙΡΙΑΚΗ Ή ΓΡΑΜΜΙΚΗ ΑΝΑΖΗΤΗΣΗ - 2 14 Αλγόριθμος Sequential_Search Δεδομένα // n, table, key // done ψευδής position 0 i 1 Όσο (done=ψευδής) και (i<=n) επανάλαβε Αν table[i]=key τότε done αληθής position i αλλιώς i i+1 Τέλος_αν Τέλος_επανάληψης Αποτελέσματα //done, position // Τέλος Sequential_Search
ΠΑΡΑΤΗΡΗΣΕΙΣ ΣΤΗ ΓΡΑΜΜΙΚΗ ΑΝΑΖΗΤΗΣΗ 15 Αν κάποιο στοιχείο υπάρχει στον πίνακα παραπάνω από μια φορά, πρέπει να τροποποιήσουμε τον αλγόριθμο, να αφαιρέσουμε τη μεταβλητή done, έτσι ώστε να συνεχίζεται η αναζήτηση μέχρι το τέλος του πίνακα
ΠΟΛΛΑΠΛΗ ΕΜΦΑΝΙΣΗ ΣΤΟΙΧΕΙΟΥ 16 Αλγόριθμος Sequential_Search Δεδομένα // n, table, key // position 0 i 1 Όσο (i<=n) επανάλαβε Αν table[i]=key τότε position i Εμφάνισε «Το στοιχείο βρέθηκε στη θέση», position Τέλος_αν i i+1 Τέλος_επανάληψης Τέλος Sequential_Search
ΑΝΑΖΗΤΗΣΗ ΠΛΗΘΟΥΣ ΕΜΦΑΝΙΣΕΩΝ ΣΤΟΙΧΕΙΟΥ ΣΕ ΠΙΝΑΚΑ 17 count 0 Για i από 1 μέχρι 50 Αν table[i]=key τότε count count + 1 Τέλος_αν Τέλος_επανάληψης Αν count>0 τότε Εμφάνισε Το στοιχείο υπάρχει στον πίνακα, count, φορές Αλλιώς Εμφάνισε Το στοιχείο δεν υπάρχει στον πίνακα Τέλος_αν
18 ΣΕΙΡΙΑΚΗ ΑΝΑΖΗΤΗΣΗ ΣΕ ΤΑΞΙΝΟΜΗΜΕΝΟ ΠΙΝΑΚΑ Εάν τα στοιχεία του πίνακα είναι ταξινομημένα, τότε ο αλγόριθμος πρέπει να σταματήσει, όταν συναντήσει ένα στοιχείο με τιμή μεγαλύτερη από την αναζητούμενη τιμή
19 ΣΕΙΡΙΑΚΗ ΑΝΑΖΗΤΗΣΗ ΣΕ ΤΑΞΙΝΟΜΗΜΕΝΟ ΠΙΝΑΚΑ Αλγόριθμος Sequential_Search Δεδομένα // n, table, key // position 0 i 1 Όσο (table[i]<=key) και (i<=n) επανάλαβε Αν table[i]=key τότε position i Εμφάνισε «Το στοιχείο βρέθηκε στη θέση», position Τέλος_αν i i+1 Τέλος_επανάληψης Τέλος Sequential_Search
ΠΑΡΑΔΕΙΓΜΑΤΑ 20 Πίνακας 9 αταξινόμητων αριθμών Αναζητούμε το στοιχείο 56 Απαιτούνται 4 προσπελάσεις Αναζητούμε το στοιχείο 11 Απαιτούνται 9 προσπελάσεις, δηλαδή η σάρωση ολόκληρου του πίνακα
ΑΝΑΖΗΤΗΣΗ ΣΕ ΤΑΞΙΝΟΜΗΜΕΝΟ ΠΙΝΑΚΑ 21 Ο ίδιος πίνακας ταξινομημένος Αναζητούμε το στοιχείο 56 Απαιτούνται 7 προσπελάσεις Αναζητούμε το στοιχείο 11 Απαιτούνται 3 προσπελάσεις, δεδομένου ότι το 12 είναι μεγαλύτερο από το 11, και επομένως δεν έχει νόημα να συνεχιστεί η αναζήτηση
ΤΑΞΙΝΟΜΗΣΗ 22 Από τις πιο σημαντικές λειτουργίες σε μια δομή, είναι η τοποθέτηση των κόμβων της δομής σε μια σειρά Η διαδικασία αυτή ονομάζεται ταξινόμηση (sorting) ή διάταξη (ordering) Η πιο συνήθης διάταξη, είναι η αύξουσα τάξη (ascending sequence) δηλαδή η ταξινόμηση από τη μικρότερη τιμή προς τη μεγαλύτερη. Ο απώτερος σκοπός της ταξινόμησης, είναι να διευκολυνθεί η μετέπειτα αναζήτηση των στοιχείων μέσα στη δομή αυτή. Η χρησιμότητα της ταξινόμησης, πρακτικά αποδεικνύεται σε οποιαδήποτε μορφή αναζήτησης δεδομένων που ανακαλούμε από τον πραγματικό κόσμο (αναζήτηση τηλεφώνων από κατάλογο, λεξικά, βιβλιοθηκονομικά συστήματα, κτλ)
ΤΥΠΙΚΟΣ ΟΡΙΣΜΟΣ ΤΑΞΙΝΟΜΗΣΗΣ 23 Δοθέντων των στοιχείων a 1,a 2,...,a n η ταξινόμηση συνίσταται στη μετάθεση (permutation) της θέσης των στοιχείων, ώστε να τοποθετηθούν σε μία σειρά a k1,a k2,...,a kn έτσι ώστε, δοθείσης μίας συνάρτησης διάταξης (ordering function), f, να ισχύει: f(a k1 ) <= f(a k2 ) <=... <= f(a kn )
ΤΑΞΙΝΟΜΗΣΗ ΕΥΘΕΙΑΣ ΑΝΤΑΛΛΑΓΗΣ 24 Η ταξινόμηση με τη μέθοδο της ευθείας ανταλλαγής (straight exchange sort), βασίζεται στην αρχή της σύγκρισης και της ανταλλαγής θέσεως δύο διαδοχικών στοιχείων του πίνακα, μέχρις ότου διαταχθούν όλα τα στοιχεία. Γίνονται διαδοχικές προσπελάσεις κάθε φορά, και μετακινείται η μικρότερη τιμή του πίνακα προς τις πρώτες θέσεις.
ΤΑΞΙΝΟΜΗΣΗ ΦΥΣΣΑΛΙΔΑΣ 25 Αν θεωρήσουμε τον πίνακα κατακόρυφο αντί για οριζόντιο, και κάθε τιμή ενός στοιχείου πίνακα, μια φυσσαλίδα με βάρος ανάλογο με την τιμή του στοιχείου, τότε ο αλγόριθμος ευθείας ανταλλαγής, τοποθετεί σταδιακά τις φυσσαλίδες, στο κατάλληλο επίπεδο βάρους, οπότε στο τέλος η ελαφρύτερη φυσσαλίδα βρίσκεται στην κορυφή, και η βαρύτερη στο κατώτερο μέρος του πίνακα
ΤΑΞΙΝΟΜΗΣΗ ΦΥΣΣΑΛΙΔΑΣ 26
ΑΛΓΟΡΙΘΜΟΣ ΤΑΞΙΝΟΜΗΣΗΣ ΦΥΣΣΑΛΙΔΑΣ 27 Αλγόριθμος Φυσσαλίδα Δεδομένα // table, n // Για i από 2 μέχρι n Για j από n μέχρι i με_βήμα 1 Αν table[j-1] > table[j] τότε temp table [j-1] table[j-1] table[j] table[j]temp Τέλος_αν Τέλος_επανάληψης Τέλος_επανάληψης Αποτελέσματα // table // Τέλος Φυσσαλίδα Οι τρεις αυτές εντολές, ΜΟΝΟ σε αλγόριθμο (και όχι σε πρόγραμμα) μπορούν να αντικατασταθούν από την εντολή: αντιμετάθεσε table[j], table [j-1]
28 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΚΕΦΑΛΑΙΟ 3ο: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ ΜΕΡΟΣ 4 ο : ΔΥΝΑΜΙΚΕΣ ΔΟΜΕΣ
ΔΥΝΑΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ 29 Δομές στις οποίες η αποθήκευση των κόμβων δεν γίνεται σε συνεχόμενες θέσεις μνήμης. Οι δυναμικές δομές δεν έχουν σταθερό μέγεθος και το μέγεθός τους μπορεί να μεταβληθεί κατά τη διάρκεια του προγράμματος Οι σπουδαιότερες είναι: Λίστες Δένδρα Γράφοι
ΔΕΙΚΤΕΣ (POINTERS) 30 Ιδιαίτερος τύπος που είναι διαθέσιμος στις περισσότερες σύγχρονες γλώσσες προγραμματισμού Δεν λαμβάνει αριθμητικές ή άλλες τιμές, αλλά οι τιμές που λαμβάνει είναι διευθύνσεις στην κύρια μνήμη. Δηλαδή κάθε δείκτης «δείχνει» σε μια θέση μνήμης. Χρησιμοποιούνται για τη σύνδεση των διαφόρων στοιχείων μιας δυναμικής δομής δεδομένων. Οι δομές που χρησιμοποιούν δείκτες καλούνται δυναμικές γιατί η υλοποίησή τους γίνεται με τέτοιο τρόπο ώστε να μη χρειάζεται να προκαθορίζεται το μέγιστο πλήθος κόμβων τους. Αυτό προσφέρει μεγαλύτερη ευελιξία (σε σύγκριση με τη στατική δομή του πίνακα) καθώς το μέγεθος τους μπορεί να επεκταθεί και να συρρικνωθεί κατά τη διάρκεια της εκτέλεσης του προγράμματος
ΛΙΣΤΕΣ 31 Λίστα: Μια σειρά από κόμβους συνδεδεμένους μεταξύ τους. Πρόβλημα: Οι κόμβοι δε βρίσκονται σε συνεχόμενες θέσεις στη μνήμη Λύση: Σύνδεση των διαφορετικών κόμβων της λίστας μεταξύ τους με δείκτες (pointers) που δείχνουν - παραπέμπουν στη θέση που βρίσκεται το στοιχείο της λίστας με το οποίο συνδέονται.
ΔΟΜΗ ΚΟΜΒΟΥ ΛΙΣΤΑΣ 32 ΔΕΔΟΜΕΝΑ ΔΕΙΚΤΗΣ Σε κάθε κόμβο μιας δομής όπως η λίστα, υπάρχει εκτός από το πεδίο των δεδομένων, ένα ακόμη πεδίο που είναι ο δείκτης της λίστας Το πεδίο των δεδομένων μπορεί να περιέχει μια ή περισσότερες αλφαριθμητικές ή αριθμητικές πληροφορίες.
ΛΕΙΤΟΥΡΓΙΕΣ ΛΙΣΤΑΣ 33 Εισαγωγή κόμβου μεταξύ 2 ου και 3 ου στοιχείου στη λίστα 1. Ο δείκτης του δεύτερου κόμβου αλλάζει ώστε να δείχνει το νέο κόμβο. 2. Στο νέο κόμβο, ο δείκτης δείχνει τη θέση που ήταν το 3 ο στοιχείο της λίστας (το οποίο πλέον είναι 4 ο ), δηλαδή εκεί που έδειχνε ο δείκτης του 2 ου πριν αλλάξει. Οι κόμβοι διατηρούν τη λογική τους σειρά. Οι φυσικές θέσεις στη μνήμη μπορεί να είναι τελείως διαφορετικές
ΛΕΙΤΟΥΡΓΙΕΣ ΛΙΣΤΑΣ (2) 34 Διαγραφή του 3 ου κόμβου της λίστας 1. Για τη διαγραφή, αρκεί να αλλάξει τιμή ο δείκτης του 2 ου στοιχείου, και να δείχνει απευθείας το 4 ο στοιχείο (εκεί που δείχνει το 3 ο στοιχείο δηλαδή), προσπερνώντας τελείως το 3 ο στοιχείο. 2. Ο διαγραμμένος κόμβος χαρακτηρίζεται πλέον ως «αχρηστο δεδομένο» και ο χώρος που καταλαμβάνει στη μνήμη γίνεται διαθέσιμος για οποιαδήποτε άλλη χρήση.
ΔΕΝΤΡΑ (trees) 35 Βασικό χαρακτηριστικό είναι η «δενδροειδής» δομή, δηλαδή ότι από έναν κόμβο, δεν υπάρχει μόνο ένας επόμενος Όλοι οι κόμβοι ξεκινούν από έναν αρχικό κόμβο, τη ρίζα. Οι κόμβοι που ξεκινούν από εκεί αποκαλούνται παιδιά της ρίζας. Τα «παιδιά» μπορεί να έχουν και δικά τους «παιδιά» κτλ Υλοποιούνται με τη χρήση δεικτών Μπορούν να υλοποιηθούν και με στατικές δομές (πίνακες)
ΓΡΑΦΟΙ 36 Ένας γράφος αποτελείται από ένα σύνολο κόμβων (ή σημείων ή κορυφών) και ένα σύνολο γραμμών (ή ακμών ή τόξων) τα οποία ενώνουν μερικούς ή όλους τους κόμβους. Αποτελεί την πιο γενική δομή δεδομένων Όλες οι προηγούμενες περιπτώσεις, μπορούν να θεωρηθούν εκδοχές γράφου. Χρησιμοποιούνται για την αναπαράσταση πολλών προβλημάτων και καταστάσεων της καθημερινότητας. Π.χ. οι πόλεις είναι τα σημεία ενός γράφου και ακμές οι οδικές συνδέσεις μεταξύ τους. Μεγάλη πληθώρα προβλημάτων σχετίζεται με γράφους, γι αυτό και έχει αναπτυχθεί η Θεωρία Γράφων.