Ταξινομώντας τον πίνακα σε φθίνουσα σειρά ως προς τις πωλήσεις, μπορούμε να δούμε ποιοι ήταν οι καλύτεροι πωλητές. Ζωή Μάνος Δημήτρης Κατερίνα Γιάννα Πωλήσεις Μαρτίου Πωλητής Πωλήσεις (χιλιάδες κουτιά) 7.2 5.3 4.5 3.6 2.8 Το πρόβλημα με τις γραμμικές λίστες (και συνεπώς με τους πίνακες) είναι ότι η προσθαφαίρεση στοιχείων έχει μεγάλο κόστος: Γιαναπροσθέσομεέναστοιχείοστη θέση i, ενός πίνακα Α[Ν] (i<n), πρέπει να μετατοπίσομε όλα τα στοιχεία του πίνακα από το i και μετά μία θέση προς τα δεξιά για να δημιουργηθεί μια κενή θέση στη θέση i. Κατ αντιστοιχία, αφού σβήσομε ένα στοιχείο στη θέση i, πρέπει να μετατοπίσομε όλα τα στοιχεία από το i+1 και μετά αριστερά κατά μία θέση! Αν συμβολίσουμε την αρχική λίστα των πωλήσεων με Π, τότε Π = [4.5, 7.2, 5.3, 3.6, 2.8] με Π 0 =4.5, Π 1 =7.2, Π 2 =5.3, Π 3 =3.6, και Π 4 =2.8. Λέμε επίσης ότι το Π είναι ένα διάνυσμα, ήένας μονοδιάστατος πίνακας.
Δ2. Stacks (στοίβες) Σε μορφή στοίβας, η λίστα Π γράφεται: 4.5 7.2 5.3 3.6 2.8 Οι πράξεις που μπορούμε να κάνομε σε μια στοίβα είναι δύο: PUSH: Πρόσθεση δεδομένων POP: Αφαίρεση δεδομένων Η PUSH προσθέτει δεδομένα πάντα στην κορυφή της στοίβας ενώ η POP αφαιρεί δεδομένα πάντα από την κορυφή της. 4.4 4.5 4.5 4.5 7.2 7.2 7.2 7.2 5.3 PUSH(4.4) 5.3 POP 5.3 POP 5.3 3.6 3.6 3.6 3.6 2.8 2.8 2.8 2.8 Το σύστημα αυτό αποθήκευσης δεδομένων λέγεται: LIFO = Last-In-First-Out Δ2. Queues (ουρές) Μιαουράδιαφέρειαπόμιαστοίβαστοότι δεδομένα αφαιρούνται μεν από την κορυφή, αλλά προσθέτονται στο τέλος. Οι επιτρεπόμενες πράξεις είναι πάλι οι PUSH και POP. Προσέξτε όμως τη διαφορετική συμπεριφορά της PUSH σε σχέση με τη στοίβα. 4.5 4.5 7.2 7.2 7.2 5.3 5.3 5.3 5.3 PUSH(4.4) 3.6 POP 3.6 POP 3.6 3.6 2.8 2.8 2.8 2.8 4.4 4.4 4.4 Το σύστημα αυτό αποθήκευσης δεδομένων λέγεται: FILO = Last-In-Last-Out
Δ.3 Πίνακες Βοηθούν την επεξεργασία μεγάλου πλήθους πληροφοριών του ίδιου τύπου. Φανταστείτε το πρόγραμμα που θα γράφατε αν θέλατε να βρείτε τον μέγιστο 100 αριθμών! Χρησιμοποιούν δείκτες για την επεξεργασία ενός συγκεκριμένου στοιχείου του πίνακα. Παραδείγματα Integer A[5]; Ηδήλωσηαυτήορίζειένανμονοδιάστατο πίνακα ακεραίων (μία γραμμή) με 10 στοιχεία: Α[0], Α[1], Α[2], Α[3], και Α[4] Real Β[2,3]; Η δήλωση αυτή ορίζει έναν δισδιάστατο πίνακα πραγματικών με 2 γραμμές και 3 στήλες, που αποτελείται από τα εξής στοιχεία: Α[0,0] Α[0,1] Α[0,2] Α[1,0] Α[1,1] Α[1,2] Όμως, οι πίνακες αποθηκεύονται στη μνήμη του Η/Υ σαν γραμμικές λίστες, π.χ. ο πίνακας 1 7 2 3 0 4 αποθηκεύεται ως [1, 7, 2, 3, 0, 4] Τότε όλοι οι πίνακες είναι μονοδιάστατοι; Παράδειγμα 1 με πίνακες Άσκηση1: Διαβάστε Ν αριθμούς από ένα αρχείο Filename και υπολογίστε τον μέσο όρο τους Algorithm Askhsh1(FileName, dummy, Data[]) BEGIN FOR i=0 TO i=n-1, STEP=1 DO Data[N]:= READ(File); ENDFOR Print, Mesos Oros =, MeanValue(Data) END Function MeanValue(Real Data[]): Real BEGIN SUM = 0; FOR i=0 TO i= DIM(Data)-1, STEP=1 DO SUM:=SUM + Data[i]; ENDFOR MeanValue := SUM / N; END Σημείωση: Γράφοντας το πρόγραμμα αυτό σε Pascal θα διαπιστώσετε ότι θα χρειαστείτε ένα επιπλέον loop. Γιατί;;
Παράδειγμα 2 με πίνακες Άσκηση2: Το αρχείο FileName περιέχει τον παρακάτω πίνακα ακεραίων. Διαβάστε τους σε έναν δισδιάστατο πίνακα και υπολογίστε το μέσο όρο τους: 0 5 7 9 14 25 42 0 7 44 33 21 21 45 53 2 34 8 50 1 3 2 100 21 33 1 72 Algorithm Askhsh2(FileName, dummy, Data[]) BEGIN FOR i=0 TO i=2, STEP=1 DO FOR j=0 TO j=8, STEP=1 DO Data[i,j]:= READ(File); ENDFOR ENDFOR SUM = 0; FOR i=0 TO i=2, STEP=1 DO FOR j=0 TO j=8, STEP=1 DO SUM := SUM + Data[i,j]; ENDFOR ENDFOR PRINT, Mesos Oros =, SUM/27; END Linked Lists (Συνδεδεμένες λίστες) Σε αντίθεση με τους πίνακες, όπου η δομή των δεδομένων αντιπροσωπεύει και τον (γραμμικό) τρόπο αποθήκευσης τους, οι Συνδεμένες Λίστες χρησιμοποιούν pointers (δείκτες) για να συνδέσουν τα δεδομένα σε μια σειρά. Ένας pointer δεν είναι παρά ένας αριθμός στη μνήμη που δείχνει σε κάποια θέση της μνήμης που περιέχει δεδομένα. Πωλητής Δημήτρης Ζωή Μάνος Γιάννα Κατερίνα Ζωή Πωλήσεις 4.5 7.2 5.3 2.8 3.6 Μάνος Θέση στη Μνήμη 3(*) 41 50 7 22 Δημήτρης Κατερίνα Pointer (αρχική λίστα) 41 50 7 22 Null Γιάννα
Γιαναταξινομήσομεταστοιχείατηςλίσταςσε αλφαβητική σειρά, δεν μεταφέρομε δεδομένα στη μνήμη, απλά αλλάζομε τους pointers! Η ταξινόμηση σε φθίνουσα σειρά πωλήσεων γίνεται πάλι με pointers! Πωλητής Δημήτρης Θέση στη Μνήμη 3 Pointer (αλφαβητικά) 41 Πωλητής Δημήτρης Πωλήσεις 4.5 Πωλήσεις 4.5 Θέση στη Μνήμη 3 Pointer (αλφαβητικά) 22 Ζωή 7.2 41 22 Ζωή 7.2 41 (*) 50 Μάνος 5.3 50 Null Μάνος 5.3 50 3 Γιάννα 2.8 7(*) 3 Γιάννα 2.8 7 Null Κατερίνα 3.6 22 50 Κατερίνα 3.6 22 7 Μάνος Κατερίνα Μάνος Κατερίνα Ζωή Δημήτρης Γιάννα Ζωή Δημήτρης Γιάννα
Τα δεδομένα στους πίνακες που είδαμε (δηλαδή τα ζεύγη Όνομα:Πωλήσεις) λέγονται records (εγγραφές) Κάθε record περιλαμβάνει fields (πεδία). Στο συγκεκριμένο παράδειγμα έχομε δύο πεδία, το όνομα και τις πωλήσεις για το μήνα Μάρτιο. Ας υποθέσουμε ότι το κάθε record περιέχει ένα σύνολο από δεδομένα (π.χ. όνομα, πωλήσεις κατά μήνα για τα τελευταία 2 χρόνια). Προσέξτε ότι αυτό που πραγματικά θέλουμε να αποθηκεύσουμε σε κάθε record είναι ο pointer στον επόμενο πωλητή, πράγμα που δεν συμβαίνει στους πίνακες που είδαμε μέχρι τώρα. Για την ταξινόμηση σε φθίνουσα σειρά πωλήσεων έχουμε: Μάνος 3 Κατερίνα 7 Ζωή 50 Δημήτρης 22 41 Γιάννα Null