Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 2. Πίνακες 45 23 28 95 71 19 30 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 12/10/2017
Πίνακες (Arrays) Είναι μία διαδεδομένη δομή αποθήκευσης δεδομένων η οποία περιέχει δεδομένα του ίδιου τύπου Αποθήκευση δεδομένων σε συνεχόμενες θέσεις στη μνήμη Προσπέλαση δεδομένων με βάση τη θέση τους στη μνήμη Το i-στοιχείο του πίνακα Α είναι Α[i] Μήτρα m x n είναι ένας πίνακας με m γραμμές και n στήλες Τα m και n αντιστοιχούν στις δύο διαστάσεις του πίνακα Ανάλογα με τις ανάγκες/απαιτήσεις μπορεί να χρησιμοποιούνται πολυδιάστατοι πίνακες Δομές Δεδομένων, 3ο Εξάμηνο 2
Πίνακες (Arrays): Βασικές Λειτουργίες Εισαγωγή Απλή: arr[10] = 77; Κρατείται ξεχωριστά το πλήθος των στοιχείων που έχουν εισαχθεί Αναζήτηση Στοιχείου με τιμή 77 Απαιτεί να διατρέξουμε το array έως ότου εντοπιστεί η θέση όπου είναι αποθηκευμένο το 77 ιαγραφή Αρχικά γίνεται αναζήτηση του στοιχείου προς διαγραφή Έπειτα, μετακινούνται όλα τα στοιχεία που βρίσκονται σε μεγαλύτερες θέσεις κατά μία θέση προς τα αριστερά εν είναι επιθυμητό να υπάρχουν κενές θέσεις στον πίνακα (είναι όμως δυνατό να υλοποιηθεί και με αυτό τον τρόπο) Δομές Δεδομένων, 3ο Εξάμηνο 3
Εισαγωγή Στοιχείου Εστω πίνακας a χωρητικότητας 10 θέσεων Ένα νέο στοιχείο εισάγεται στο πρώτο κενό κελί Κρατάμε το πλήθος των στοιχείων στον πίνακα Εισαγωγή στοιχείου 37 στη θέση 0: a[0] = 37 Εισαγωγή στοιχείου 22 στη θέση 1: a[1] = 22 Εισαγωγή στοιχείου 99 στη θέση 2: a[2] = 99 Η εισαγωγή στοιχείου σε πίνακα είναι γρήγορη, καθώς γίνεται σε σταθερό χρόνο Ο(1) 0 1 2 3 4 5 6 7 8 9 37 22 99 Δομές Δεδομένων, 3ο Εξάμηνο 4
Αναζήτηση Στοιχείου Η αναζήτηση στοιχείου γίνεται με βάση την τιμή του στοιχείου, έστω το 58 Για τον εντοπισμό του στοιχείου, διατρέχουμε τον πίνακα κελί-κελί από την πρώτη θέση μέχρι την τελευταία θέση στην οποία υπάρχει αποθηκευμένο στοιχείο Εάν συναντήσουμε το 58, σταματάμε (επιτυχής αναζήτηση) Μπορεί να μην το συναντήσουμε (αποτυχημένη αναζήτηση) Κατά μέσο όρο, η αναζήτηση εξετάζει Ν/2 στοιχεία (όπου Ν το πλήθος των στοιχείων) πολυπλοκότητα Ο(Ν) Στη χειρότερη περίπτωση θα εξετάσει Ν στοιχεία 0 1 2 3 4 5 6 7 8 9 37 22 99 42 11 58 67 71 Δομές Δεδομένων, 3ο Εξάμηνο 5
Διαγραφή Στοιχείου Η διαγραφή ενός στοιχείου απαιτεί πρώτα τον εντοπισμό του Αφού εντοπιστεί το στοιχείο και διαγραφεί, όλα τα επόμενα στοιχεία μεταφέρονται μία θέση κάτω, ώστε να καλυφθεί το κενό Η διαγραφή είναι πολυπλοκότητας Ο(Ν), αφού απαιτεί κατά μέσο όρο Αναζήτηση σε Ν/2 στοιχεία Μετακίνηση υπόλοιπων Ν/2 στοιχείων 0 1 2 3 4 5 6 7 8 9 37 22 99 42 11 58 67 71 27 16 0 1 2 3 4 5 6 7 8 37 22 99 42 11 67 71 27 16 Δομές Δεδομένων, 3ο Εξάμηνο 6
Το Ζήτημα των Διπλών Εγγραφών Κατά τη σχεδίαση μιας δομής δεδομένων πρέπει να προαποφασίσουμε εάν επιτρέπονται καταχωρήσεις διπλών εγγραφών (=δύο στοιχείων με την ίδια τιμή) Η ύπαρξη διπλοεγγραφών περιπλέκει τους αλγόριθμους αναζήτησης και διαγραφής Είτε εύρεση (διαγραφή) όλων των στοιχείων με τιμή Χ Είτε τερματισμός μετά την εύρεση (διαγραφή) του πρώτου Η εισαγωγή παραμένει η ίδια, όμως εάν δεν επιτρέπονται διπλοεγγραφές, τότε πρέπει ο αλγόριθμος εισαγωγής να ελέγχει κάθε υπάρχον στοιχείο πριν την εισαγωγή Δομές Δεδομένων, 3ο Εξάμηνο 7
Το Ζήτημα των Διπλών Εγγραφών Χωρίς διπλοεγγραφές Με διπλοεγγραφές Αναζήτηση Ν/2 συγκρίσεις Ν συγκρίσεις Εισαγωγή Ν συγκρίσεις, μία κίνηση ιαγραφή Ν/2 συγκρίσεις, Ν/2 κινήσεις Καμία σύγκριση, μία κίνηση Ν συγκρίσεις, περισσότερες από Ν/2 κινήσεις Δομές Δεδομένων, 3ο Εξάμηνο 8
Πίνακες στη Java: Δημιουργία Πίνακα Με χρήση του τελεστή new int[] intarray; intarray = new int[100]; // Ορίζει μια αναφορά στον πίνακα // ημιουργεί τον πίνακα και ορίζει το // intarray για να αναφέρεται σε αυτόν int[] intarray = new int[100]; Εύρεση μεγέθους πίνακα Με χρήση της length int arraylength = intarray.length; Δομές Δεδομένων, 3ο Εξάμηνο 9
Πίνακες στη Java: Προσπέλαση Στοιχείων Πίνακα Τα στοιχεία ενός πίνακα προσπελαύνονται μέσω ενός δείκτη μέσα σε αγκύλες temp = intarray[3]; intarray[7] = 66; // Πάρε τα περιεχόμενα του 4 ου στοιχείου // Βάλε το 66 στο 8 ο κελί Το πρώτο στοιχείο ενός πίνακα παίρνει το δείκτη 0, όχι 1 Εάν χρησιμοποιήσετε δείκτη μικρότερο του μηδέν ή μεγαλύτερο του μήκους του πίνακα μείον 1 java.lang.arrayindexoutofboundsexception Δομές Δεδομένων, 3ο Εξάμηνο 10
Πίνακες στη Java: Αρχικοποίηση Ένας πίνακας ακεραίων αρχικοποιείται με το 0 όταν δημιουργείται Αυτό μπορείτε να το αλλάξετε με τον εξής τρόπο int[] intarray = {0, 3, 6, 9, 12, 15, 18, 21, 24, 27}; Ένας πίνακας αντικειμένων περιέχει στοιχεία null, ώσπου αυτά να πάρουν τιμές autodata[] cararray = new autodata[4000]; Δομές Δεδομένων, 3ο Εξάμηνο 11
Δομές Δεδομένων, 3ο Εξάμηνο 12
October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 13
October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 14
Καλύτερη Οργάνωση του Προγράμματος σε Κλάσεις Ενσωμάτωση του πίνακα σε μία κλάση Η κλάση αυτή θα παρέχει μια διεπαφή μεθόδων υψηλού επιπέδου insert(), find(), delete() ε χρειάζεται ο χρήστης να ασχολείται με το δείκτη του πίνακα Άρα, ο χρήστης επικεντρώνεται στο τι (όχι στο πώς) πρόκειται να εισαχθεί, διαγραφεί και προσπελαστεί Δομές Δεδομένων, 3ο Εξάμηνο 15
October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 16
October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 17
Δομές Δεδομένων, 3ο Εξάμηνο 18
Δομές Δεδομένων, 3ο Εξάμηνο 19
Ταξινομημένοι Πίνακες Δομές Δεδομένων, 3ο Εξάμηνο 20
Ταξινομημένοι Πίνακες Ένας πίνακας στον οποίο τα δεδομένα διευθετούνται με αύξουσα (ή και φθίνουσα) σειρά κλειδιού Η μικρότερη τιμή κλειδιού βρίσκεται στο κελί με δείκτη 0 Κάθε κελί περιέχει τιμή μεγαλύτερη από το προηγούμενο κελί 0 1 2 3 4 5 6 7 8 9 11 22 37 42 58 67 71 83 Πώς γίνεται η αναζήτηση σε έναν ταξινομημένο πίνακα; Δομές Δεδομένων, 3ο Εξάμηνο 21
Γραμμική Αναζήτηση Μπορώ να εφαρμόσω την αναζήτηση όπως ακριβώς στην περίπτωση του μη ταξινομημένου πίνακα Για τον εντοπισμό του στοιχείου, διατρέχουμε τον πίνακα κελί-κελί από την πρώτη θέση μέχρι την τελευταία θέση στην οποία υπάρχει αποθηκευμένο στοιχείο Εάν συναντήσουμε το 58, σταματάμε (επιτυχής αναζήτηση) Μπορεί να μην το συναντήσουμε (αποτυχημένη αναζήτηση) Αυτός ο αλγόριθμος καλείται γραμμική αναζήτηση και έχει πολυπλοκότητα Ο(Ν), όπου Ν το πλήθος στοιχείων του πίνακα Ποτέ δεν εκτελώ γραμμική αναζήτηση σε ταξινομημένο πίνακα ιότι υπάρχει πιο αποδοτική μέθοδος αναζήτησης (δυαδική αναζήτηση) Δομές Δεδομένων, 3ο Εξάμηνο 22
Δυαδική Αναζήτηση Εφαρμόσιμη μόνο σε ταξινομημένους πίνακες Πολύ ταχύτερη από τη γραμμική αναζήτηση (ειδικά για μεγάλους πίνακες) Πώς λειτουργεί η εύρεση του στοιχείου με τιμή Χ; Χωρίζει το πλήθος των κελιών στη μέση, ελέγχει το κλειδί Μ του μεσαίου κελιού, και επαναλαμβάνει τη διαδικασία στο αριστερό κομμάτι (εάν Χ<Μ) ή στο δεξιό κομμάτι (εάν Χ>Μ) του πίνακα Π.χ. Αναζήτηση του 71 0 1 2 3 4 5 6 7 8 9 11 22 37 42 58 67 71 83 Δομές Δεδομένων, 3ο Εξάμηνο 23
Δυαδική Αναζήτηση Σε μια δυαδική αναζήτηση κάθε προσπάθεια χωρίζει το εύρος των πιθανών τιμών στη μέση Σε κάθε βήμα, υποδιπλασιάζεται το μέγεθος του πίνακα στο οποίο πρέπει να γίνει η αναζήτηση Το κόστος της δυαδικής αναζήτησης είναι λογαριθμικό Ο(logΝ) ως προς το μέγεθος του πίνακα Ν Σε σχέση με τη γραμμική αναζήτηση που έχει κόστος Ο(Ν): O(logN) < O(N) Δομές Δεδομένων, 3ο Εξάμηνο 24
Τυπική Απόδειξη Έστω ταξινομημένος πίνακας (π.χ., ακεραίων) μήκους L(0)=n. Εκτελούμε δυαδική αναζήτηση, που διαρκεί k επαναληπτικά βήματα. Στο i-οστό επαναληπτικό βήμα εκτελούμε σταθερό αριθμό στοιχειωδών πράξεων: O(1) σύγκρισεις του στοιχείου προς αναζήτηση με τα άκρα δύο υποπινάκων, μήκους L(i-1)/2. Στο i-οστό βήμα εξετάζουμε υποπίνακα μήκους L(i-1)/2: Δομές Δεδομένων, 3ο Εξάμηνο 25
Τυπική Απόδειξη Ο αλγόριθμος τερματίζει το πολύ όταν το μήκος του πίνακα που εξετάζουμε σε κάποιο βήμα είναι 1: δηλαδή όταν L(k)=1. Τότε: Δομές Δεδομένων, 3ο Εξάμηνο 26
Δομές Δεδομένων, 3ο Εξάμηνο 27
Δομές Δεδομένων, 3ο Εξάμηνο 28
October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 29
October 19, 2017 Δομές Δεδομένων, 3ο Εξάμηνο 30
Πλεονεκτήματα Ταξινομημένων Πινάκων Πολύ γρηγορότερος χρόνος αναζήτησης σε σχέση με μη ταξινομημένο πίνακα Όμως, η εισαγωγή διαρκεί παραπάνω διότι πρέπει όλα τα στοιχεία με υψηλότερη τιμή κλειδιού να μετακινηθούν για να δημιουργηθεί χώρος για το νέο στοιχείο που εισάγεται Οι διαγραφές είναι αργές και στα δύο είδη πινάκων, διότι πρέπει να μετακινηθούν στοιχεία για να καλύψουν το κενό του στοιχείου που διαγράφεται Οι ταξινομημένοι πίνακες είναι χρήσιμοι σε περιπτώσεις που οι αναζητήσεις είναι συχνές, ενώ οι εισαγωγές και οι διαγραφές δεν είναι Δομές Δεδομένων, 3ο Εξάμηνο 31
Ανάλυση Big-O Αλγόριθμος Χρόνος Εκτέλεσης Γραμμική Αναζήτηση O(N) υαδική Αναζήτηση O(logN) Εισαγωγή σε μη ταξινομημένο πίνακα O(1) Εισαγωγή σε ταξινομημένο πίνακα O(N) ιαγραφή σε μη ταξινομημένο πίνακα O(N) ιαγραφή σε ταξινομημένο πίνακα O(N) Δομές Δεδομένων, 3ο Εξάμηνο 32
Γιατί δε Χρησιμοποιούμε τους Πίνακες για όλα; Θέματα απόδοσης Μη ταξινομημένοι πίνακες Γρήγορη εισαγωγή Ο(1), όμως αργή αναζήτηση Ο(Ν) Ταξινομημένοι πίνακες Γρήγορη αναζήτηση Ο(logN), όμως αργή εισαγωγή Ο(Ν) Σταθερό μέγεθος πινάκων κατά τη δημιουργία Πρέπει να εκτιμήσουμε το πλήθος των στοιχείων που θα αποθηκευθούν, πριν τη χρήση του πίνακα Υπερεκτίμηση μεγέθους κατανάλωση μνήμης άσκοπα Υποτίμηση μεγέθους ο πίνακας δεν μπορεί να καλύψει τις ανάγκες αποθήκευσης στοιχείων Δομές Δεδομένων, 3ο Εξάμηνο 33
Πρόβλημα 1: Αναζήτηση Τυχαίου Στοιχείου σε Πίνακα Έστω πίνακας A που αποθηκεύει σύνολο n διαφορετικών στοιχείων. Έστω ένα στοιχείο, a, από αυτά, επιλεγμένο από την ομοιόμορφη κατανομή (με πιθανότητα 1/n). Πόσες συγκρίσεις κατά μέσο όρο απαιτεί η εύρεση της θέσης στον A όπου είναι αποθηκευμένο το στοιχείο a? Δομές Δεδομένων, 3ο Εξάμηνο 34
Πρόβλημα 1: Αναζήτηση Τυχαίου Στοιχείου σε Πίνακα Με πιθανότητα 1/n το a είναι το στοιχείο που βρίσκεται αποθηκευμένο στην i-οστή θέση του πίνακα A. Για να διαπιστωθεί αυτό απαιτούνται ακριβώς i συγκρίσεις. Αν T(a) είναι το πλήθος συγκρίσεων για την εύρεση του a: Δομές Δεδομένων, 3ο Εξάμηνο 35
Πρόβλημα 2: Πιο Αποδοτικοί Πίνακες Σε έναν πίνακα A, nθέσεων, έχουμε: Εισαγωγή: O(1). Αναζήτηση: O(n). ιαγραφή: O(n)(αναζήτηση + μετακίνηση στοιχείων). 1. Αν θέλουμε να αποθηκεύουμε σε έναν πίνακα οποιοδήποτε υποσύνολο των ακέραιων τιμών 0,1,2,,n-1, μπορούμε να βελτιώσουμε το χρόνο των πράξεων Αναζήτηση και ιαγραφή, χωρίς να αυξήσουμε τον χρόνο εισαγωγής? Αν ναι, πώς? Δομές Δεδομένων, 3ο Εξάμηνο 36
Πρόβλημα 2: Πιο Αποδοτικοί Πίνακες Δομές Δεδομένων, 3ο Εξάμηνο 37
Πρόβλημα 2: Πιο Αποδοτικοί Πίνακες 2. Θεωρούμε την «Τυφλή ιαγραφή», που παίρνει σαν όρισμα μια θέση, i, στον πίνακα και «διαγράφει» το στοιχείο A[i] θέτοντας A[i]=null. Πιστεύετε ότι μπορούμε να υποστηρίξουμε ταυτόχρονα Εισαγωγή και «Τυφλή ιαγραφή» σε χρόνο O(1) με χρήση ενός μόνο πίνακα? Με χρήση 2 πινάκων? Δομές Δεδομένων, 3ο Εξάμηνο 38
Πρόβλημα 2: Πιο Αποδοτικοί Πίνακες Δομές Δεδομένων, 3ο Εξάμηνο 39
Πρόβλημα 3: Κατασκευή Ομοιόμορφα Τυχαίας Μετάθεσης Να περιγραφεί αλγόριθμος (πρόγραμμα) που, δεδομένου ενός πίνακα X, με n στοιχεία, υπολογίζει έναν πίνακα A με τα ίδια στοιχεία τοποθετημένα σε τυχαία διάταξη, επιλεγμένη από την ομοιόμορφη κατανομή. ηλαδή, ο αλγόριθμος να παράγει οποιαδήποτε από τις n! υνατές μεταθέσεις των στοιχείων με πιθανότητα 1/n!. Δομές Δεδομένων, 3ο Εξάμηνο 40
Δομές Δεδομένων, 3ο Εξάμηνο 41
Δομές Δεδομένων, 3ο Εξάμηνο 42
Ανάλυση Κατασκευής Ομοιόμορφα Τυχαίας Μετάθεσης Οποιοδήποτε στοιχείο a: Επιλέγεται στην 1 η επανάληψη με πιθανότητα 1/n. εν επιλέγεται μέχρι και την 1η επανάληψη με πιθανότητα 1-1/n = (n-1)/n. Επιλέγεται στη 2 η επανάληψη με πιθανότητα εν επιλέγεται μέχρι και την 2η επανάληψη με πιθανότητα: Δομές Δεδομένων, 3ο Εξάμηνο 43
Ανάλυση Κατασκευής Ομοιόμορφα Τυχαίας Μετάθεσης Οποιοδήποτε στοιχείο a: Επιλέγεται στην i-οστή επανάληψη με πιθανότητα 1/n. εν επιλέγεται μέχρι και την i-οστή επανάληψη με πιθανότητα (n-i)/n. Άρα η πιθανότητα να βρεθεί ένα στοιχείο στη θέση i του A είναι 1/n. Δομές Δεδομένων, 3ο Εξάμηνο 44
Ανάλυση Κατασκευής Ομοιόμορφα Τυχαίας Μετάθεσης εδομένου ότι καταλήφθηκε η πρώτη θέση από ένα στοιχείο a, ποιά είναι η πιθανότητα να βρεθεί ένα στοιχείο a <>a σε κάποια από τις επόμενες θέσεις? Επαναλαμβάνουμε την ίδια ακριβώς ανάλυση για τις εναπομείνασες (n-1) θέσεις και βρίσκουμε ότι είναι 1/(n-1). Γενίκευση του επιχειρήματος: εδομένου ότι καταλήφθηκαν οι πρώτες k θέσεις από ένα υποσύνολο στοιχείων K, ποιά είναι η πιθανότητα να βρεθεί ένα στοιχείο a εκτός των K σε κάποια από τις επόμενες n-k θέσεις? Επαναλαμβάνουμε την ίδια ακριβώς ανάλυση για τις εναπομείνασες n-k θέσεις και βρίσκουμε ότι είναι 1/(n-k). Δομές Δεδομένων, 3ο Εξάμηνο 45
Ανάλυση Κατασκευής Ομοιόμορφα Τυχαίας Μετάθεσης Επομένως, ο αλγόριθμος επιστρέφει οποιαδήποτε δυνατή διάταξη με πιθανότητα: Δομές Δεδομένων, 3ο Εξάμηνο 46
Πρόβλημα 4: Τυχαιοποίση Αναζήτησης Έστω ότι θέλουμε να κατασκευάσουμε έναν πίνακα για την αποθήκευση n στοιχείων, για να υποστηρίξουμε την αναζήτηση της θέσης οποιουδήποτε από τα n στοιχεία στον πίνακα. ε γνωρίζουμε πιο στοιχείο θα αναζητηθεί. Πώς θα τοποθετήσουμε τα n στοιχεία στον πίνακα τυχαία, ώστε να ελαχιστοποιήσουμε το (ακριβές) μέσο πλήθος συγκρίσεων μιας αναζήτησης? Δομές Δεδομένων, 3ο Εξάμηνο 47
Προβλημα 4: Τυχαιοποίηση Αναζήτησης Επιλέγουμε τυχαία και ομοιόμορφα μια μετάθεση των n στοιχείων, από 1 x 2 x 3 x x n = n! μεταθέσεις. Κάθε μία μπορεί να επιλεγεί με πιθανότητα 1/n!. Έστω η αναζήτηση του στοιχείου a στον πίνακα A. Έστω A(i) το σύνολο των μεταθέσεων των στοιχείων, στις οποίες το a βρίσκεται στην i-οστή θέση του A. Το a είναι στην i-οστή θέση του A με πιθανότητα: Δομές Δεδομένων, 3ο Εξάμηνο 48
Πρόβλημα 4: Τυχαιοποίηση Αναζήτησης Αν T(a) είναι οι συγκρίσεις που απαιτούνται για την εύρεση του a: Δομές Δεδομένων, 3ο Εξάμηνο 49