Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον ΑΕΠΠ Κεφάλαιο 3: Δομές Δεδομένων και Αλγόριθμοι 3.2 Αλγόριθμοι + Δομές Δεδομένων = Προγράμματα 3.3 Πίνακες 3.4 Στοίβα 3.5. Ουρά 3.6 Αναζήτηση 3.7 Ταξινόμηση
3.2 Αλγόριθμοι + Δομές Δεδομένων = Προγράμματα (1/6) Τα δεδομένα ενός προβλήματος αποθηκεύονται: Στην κύρια μνήμη Στη δευτερεύουσα μνήμη Η αποθήκευση δε γίνεται τυχαία αλλά συστηματικά χρησιμοποιώντας μια δομή. Ορισμός: Δομή Δεδομένων είναι ένα σύνολο αποθηκευμένων δεδομένων που υφίστανται επεξεργασία από ένα σύνολο λειτουργιών.
3.2 Αλγόριθμοι + Δομές Δεδομένων = Προγράμματα (2/6) Βασικές Λειτουργίες επί των δομών δεδομένων: Προσπέλαση (access), πρόσβαση σε έναν κόμβο με σκοπό να εξετασθεί ή να τροποποιηθεί το περιεχόμενό του. Εισαγωγή (insertion), δηλαδή η προσθήκη νέων κόμβων σε μία υπάρχουσα δομή. Διαγραφή (deletion), που αποτελεί το αντίστροφο της εισαγωγής, δηλαδή ένας κόμβος αφαιρείται από μία δομή. Αναζήτηση (searching), κατά την οποία προσπελαύνονται οι κόμβοι μιας δομής, προκειμένου να εντοπιστούν ένας ή περισσότεροι που έχουν μια δεδομένη ιδιότητα.
3.2 Αλγόριθμοι + Δομές Δεδομένων = Προγράμματα (3/6) Βασικές Λειτουργίες επί των δομών δεδομένων (συνέχεια): Ταξινόμηση (sorting), όπου οι κόμβοι μιας δομής διατάσσονται κατά αύξουσα ή φθίνουσα σειρά. Αντιγραφή (copying), κατά την οποία όλοι οι κόμβοι ή μερικοί από τους κόμβους μίας δομής αντιγράφονται σε μία άλλη δομή. Συγχώνευση (merging), κατά την οποία δύο ή περισσότερες δομές συνενώνονται σε μία ενιαία δομή. Διαχωρισμός (separation), που αποτελεί την αντίστροφη πράξη της συγχώνευσης.
3.2 Αλγόριθμοι + Δομές Δεδομένων = Προγράμματα (4/6) Υπάρχει μεγάλη εξάρτηση μεταξύ της δομής δεδομένων και του αλγορίθμου που επεξεργάζεται τη δομή. Το πρόγραμμα πρέπει να θεωρεί τη δομή δεδομένων και τον αλγόριθμο ως μία αδιάσπαστη ενότητα. Wirth (1976): Αλγόριθμοι + Δομές Δεδομένων = Προγράμματα
3.2 Αλγόριθμοι + Δομές Δεδομένων = Προγράμματα (5/6) Κατηγορίες δομών δεδομένων: Στατικές (static): Αποθηκεύονται σε σταθερές και συνεχόμενες θέσεις της μνήμης. Το μέγεθός τους προσδιορίζεται κατά τη στιγμή του προγραμματισμού δεν μεταβάλλεται κατά τη διάρκεια εκτέλεσης του προγράμματος
3.2 Αλγόριθμοι + Δομές Δεδομένων = Προγράμματα (6/6) Κατηγορίες δομών δεδομένων: Δυναμικές (dynamic): Στηρίζονται στην τεχνική της δυναμικής παραχώρησης μνήμης (dynamic memory allocation). Δεν αποθηκεύονται σε συνεχόμενες θέσεις μνήμης. Δεν έχουν σταθερό μέγεθος (ο αριθμός των κόμβων τους αυξομειώνεται καθώς στη δομή εισάγονται νέα δεδομένα ή διαγράφονται κάποια άλλα). Υποστηρίζονται από όλες οι σύγχρονες γλώσσες προγραμματισμού
3.3 Πίνακες (1/4) Υλοποιούν στατικές δομές δεδομένων Περιέχουν στοιχεία του ίδιου τύπου (π.χ. ακέραιους ή πραγματικούς) Μπορεί να έχουν μία (μονοδιάστατοι πίνακες) ή περισσότερες διαστάσεις (δισδιάστατοι, τρισδιάστατοι κτλ) Σημείωση: Οι δισδιάστατοι πίνακες με ίσο αριθμό γραμμών και στηλών (ίσο μέγεθος των δύο διαστάσεων) ονομάζονται τετραγωνικοί
3.3 Πίνακες (2/4)
3.3 Πίνακες (3/4)
3.3 Πίνακες (4/4)
3.4 Στοίβα (1/2) Μία στοίβα δεδομένων μοιάζει με μια στοίβα πιάτων. Κάθε πιάτο που πλένεται τοποθετείται στην κορυφή (top) Για σκούπισμα επιλέγεται το πιάτο της κορυφής (top) Επεξεργασία: Τελευταίο μέσα, πρώτο έξω LIFO – Last-In-First-Out Βασικές Λειτουργίες στη Στοίβα: Ώθηση (push) στοιχείου στην κορυφή της στοίβας Πρέπει να ελέγχεται αν η στοίβα είναι γεμάτη (υπερχείλιση-overflow)) Απώθηση (pop) στοιχείου από την κορυφή της στοίβας Πρέπει να ελέγχεται αν η στοίβα έχει στοιχεία (υποχείλιση-underflow))
3.4 Στοίβα (2/2)
3.5 Ουρά (1/2) Οι ουρές είναι καθημερινό φαινόμενο: Οι ουρές είναι καθημερινό φαινόμενο: Π.χ. Ουρές ανθρώπων, οχημάτων, εργασιών Υπάρχει ειδικός κλάδος για τη μελέτη τους (Θεωρία Ουρών) Επεξεργασία: Πρώτο μέσα, πρώτο έξω FIFO – Last-In-First-Out Αυτός που στάθηκε πρώτος θα εξυπηρετηθεί πρώτος Βασικές Λειτουργίες στη Στοίβα: Εισαγωγή (enqueue) στοιχείου στο πίσω άκρο της ουράς Εξαγωγή (dequeue) στοιχείου από τo εμπρός άκρο της ουράς
3.5 Ουρά (2/2) Απαιτείται η χρήση δύο δεικτών: front και rear
3.6 Αναζήτηση (1/3) Η αναζήτηση (searching) είναι ένα μία από τις πιο συνηθισμένες λειτουργίες σε πίνακα. Η πιο απλή μορφή είναι η σειριακή (ή γραμμική) αναζήτηση (sequential search). Η σειριακή αναζήτηση είναι χρήσιμη όταν: ο πίνακας είναι μη ταξινομημένος ο πίνακας είναι μικρού μεγέθους (για παράδειγμα, n ≤ 20) η αναζήτηση σε ένα συγκεκριμένο πίνακα γίνεται σπάνια Υπάρχουν και άλλες μέθοδοι (π.χ. δυαδική αναζήτηση)
3.6 Αναζήτηση (2/3) Μη ταξινομημένος πίνακας: Αναζήτηση του 56: 4 προσπελάσεις Αναζήτηση μη υπαρκτού στοιχείου: 9 προσπελάσεις Ταξινομημένος πίνακας: Αναζήτηση μη υπαρκτού στοιχείου: Σταματάει μόλις ξεπεραστεί ο ζητούμενος αριθμός
3.6 Αναζήτηση (3/3) Χρησιμοποιείται η λογική μεταβλητή done: Αληθής αν το ζητούμενο στοιχείο βρεθεί αλλιώς ψευδής Η μεταβλητή position αποθηκεύει τη θέση που βρέθηκε το αναζητούμενο στοιχείο (αν αυτό βρεθεί)
3.7 Ταξινόμηση (1/4) Ταξινόμηση (sorting) ή Διάταξη (ordering)είναι η τακτοποίηση των κόμβων μίας δομής με μία ιδιαίτερη σειρά. Είναι μία πολύ σημαντική λειτουργία σε πολλές δομές δεδομένων και έχει πολλές εφαρμογές (π.χ. κατάλογοι, λεξικά, ονομαστικές καταστάσεις κ.α.) Η διάταξη των στοιχείων μπορεί να είναι αύξουσα ή φθίνουσα.
3.7 Ταξινόμηση (2/4) Υπάρχουν πολλοί αλγόριθμοι ταξινόμησης Πιο απλός και συνάμα πιο αργός ο Aλγόριθμος Ευθείας Ανταλλαγής ή Αλγόριθμος Φυσαλίδας (Bubblesort): Βασίζεται στην αρχή της σύγκρισης και ανταλλαγής ζευγών γειτονικών στοιχείων, μέχρις ότου διαταχθούν όλα τα στοιχεία. Κάθε φορά γίνονται διαδοχικές προσπελάσεις στον πίνακα και μετακινείται το μικρότερο κλειδί της ακολουθίας προς το αριστερό άκρο του πίνακα (ή προς τα πάνω αν ο πίνακας θεωρηθεί κάθετος).
3.7 Ταξινόμηση (3/4)
3.7 Ταξινόμηση (4/4) Τα στοιχεία του πίνακα δεν είναι απαραίτητα ακέραιοι Ο αλγόριθμος επιδέχεται διάφορες βελτιώσεις και τροποποιήσεις ώστε να γίνει κάπως πιο γρήγορος Αντιστρέφοντας την ανισότητα σύγκρισης η διάταξη γίνεται φθίνουσα