3.4 Στοίβα (stack) (μόνο θεωρία) Η στοίβα είναι μια δομή δεδομένων, στην οποία το στοιχείο που εισάγεται τελευταίο, εξάγεται πρώτο. (Last In First Out) Ώθηση Απώθηση Ώθηση – Υπερχείλιση (overflow) Απώθηση – Υποχείλιση Υλοποίηση της στοίβας με πίνακα Ώθηση top ← top + 1 Stack[top] ← νέοΣτοιχείο Απώθηση Εξαγωγή του Stack[top] top ← top - 1 Πού βρίσκουν εφαρμογή οι στοίβες; Στα υποπρογράμματα (10ο κεφ), στο back κουμπί των πλοηγητών, στο undo, …
3.5 Ουρά (queue) (μόνο θεωρία) Η ουρά είναι μια δομή δεδομένων, στην οποία το στοιχείο που εισάγεται πρώτο, εξάγεται πρώτο. (Fist In First Out) Εισαγωγή Εξαγωγή Εισαγωγή– Υπάρχει χώρος; Εξαγωγή– Υπάρχει στοιχείο; Υλοποίηση της ουράς με πίνακα Εισαγωγή rear ← rear + 1 Queue[rear] ← νέοΣτοιχείο Πού βρίσκουν εφαρμογή οι ουρές; Στους εκτυπωτές, στους webservers, στα multitasking λειτουργικά συστήματα Εξαγωγή Εξαγωγή του Queue[front] front ← front + 1
3.6 Αναζήτηση σε μονοδιάστατο πίνακα Σειριακή (sequential) ή γραμμική (linear)μέθοδος Ζητούμενο είναι να απαντήσω αν υπάρxει ή δεν υπάρχει το key μέσα σε έναν πίνακα 10 στοιχείων 1η εκδοχή 2η εκδοχή Απαράδεκτη μέθοδος διότι ακόμα και αν βρει το key στο 1ο κελί, συνεχίζει την αναζήτηση μέχρι το τελευταίο στοιχείο του πίνακα! Στον προγραμματισμό δεν μας ενδιαφέρει μόνο να δώσουμε αλγόριθμο που «δουλεύει», αλλά απαιτούμε να είναι και αποδοτικός (efficient)!
3.6 Αναζήτηση σε μονοδιάστατο πίνακα Σειριακή (sequential) ή γραμμική (linear)μέθοδος Ο αλγόριθμος δουλεύει για πίνακες ακεραίων, πραγματικών ή χαρακτήρων; Ζητούμενο είναι να απαντήσω σε ποια θέση του πίνακα βρίσκεται το key, εφόσον υπάρxει βέβαια. 4η εκδοχή 3η εκδοχή Μπορώ να αποφύγω τη χρήση της έξτρα μεταβλητής pos; Αν το key υπάρχει πολλές φορές μέσα στον πίνακα;
3.6 Αναζήτηση σε μονοδιάστατο πίνακα Σειριακή (sequential) ή γραμμική (linear)μέθοδος Γιατί ο αλγόριθμος της σειριακής αναζήτησης δεν δουλεύει αποδοτικά για ταξινομημένους πίνακες; Έστω ο παρακάτω ταξινομημένος πίνακας 10 12 16 20 28 29 38 40 51 100 Δεν δουλεύει αποδοτικά, διότι αν το key δεν υπάρχει μέσα στον πίνακα, ο αλγόριθμός μας θα ψάξει μέχρι και το τελευταίο κελί, μην αξιοποιώντας έτσι την ιδιότητα του ταξινομημένου πίνακα!!! Π.χ. αν ψάχνω τον 22, έχει νόημα να ψάχνω ακόμα όταν συναντήσω τον 28; Μπορώ να τροποποιήσω τον αλγόριθμό μου ώστε να δουλεύει αποδοτικά και στους ταξινομημένους; Π.χ. αν ψάχνει τον 22, να σταματά την αναζήτηση όταν βρει τον 28; Ο αλγόριθμος της σειριακής αναζήτησης είναι ο απλούστερος αλλά ο λιγότερο αποδοτικός αλγόριθμος. Οπότε, ενδείκνυται μόνο στις περιπτώσεις όπου Ο πίνακας είναι μη ταξινομημένος Ο πίνακας είναι μικρού μεγέθους Η αναζήτηση στον πίνακα γίνεται σπάνια Δυαδική αναζήτηση
3.7 Ταξινόμηση/διάταξη μονοδιάστατου πίνακα Γιατί να ταξινομήσω μια δομή δεδομένων; Για να επιταχύνω την εύρεση ενός στοιχείου Για να εντοπίσω τα x μικρότερα ή μεγαλύτερα στοιχεία του πίνακα Δοθέντων των στοιχείων α1, α2, α3, …, αν η ταξινόμηση των στοιχείων συνίσταται στη μετάθεση της θέσης των στοιχείων, ώστε να τοποθετηθούν σε μία σειρά ακ1, ακ2, ακ3,…,ακν έτσι ώστε, δοθείσης μίας συνάρτησης διάταξης, να ισχύει: f(ακ1) ≤ f(ακ2) ≤ … ≤ f(ακν) Θα μελετήσουμε τον αλγόριθμο της ευθείας ανταλλαγής ο οποίος είναι ο πιο απλός αλλά και ο πιο αργός αλγόριθμος ταξινόμησης! Ο πλέον γρήγορος αλγόριθμος ταξινόμησης είναι η γρήγορη ταξινόμηση (quick sort)!
3.7 Ταξινόμηση/διάταξη μονοδιάστατου πίνακα Ταξινόμηση ευθείας ανταλλαγής/φυσαλίδας Θέλουμε να ταξινομήσουμε κατά αύξουσα σειρά τον πίνακα table 1ο 2ο 3ο 4ο 5ο 6ο 7ο 8ο 6 5 3 1 8 7 2 4 Αν και επεξεργάζεται μονοδιάστατο πίνακα, χρειάζεται 2 Για!
3.7 Ταξινόμηση/διάταξη μονοδιάστατου πίνακα Ταξινόμηση ευθείας ανταλλαγής/φυσαλίδας Θέλουμε να ταξινομήσουμε κατά αύξουσα σειρά τον παρακάτω πίνακα Συγκρίνονται ζεύγη αριθμών και, αν χρειαστεί, αντιμετατίθενται ώστε ο μεγαλύτερος να βρεθεί στο 2ο κελί Όταν τελειώνει μια σάρωση του πίνακα, το μεγαλύτερο στοιχείο οδηγείται στο τέλος Όταν ένας αριθμός τοποθετηθεί στο τέλος, τα κελιά αυτά κλειδώνουν και δεν συμμετέχουν στις επόμενες συγκρίσεις ζευγαριών