Δομές Δεδομένων. Ενότητα 4: Πίνακες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Σχετικά έγγραφα
Δομές Δεδομένων. Ενότητα 2: Περισσότερα για τους δείκτες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 3: Διαχείριση μνήμης. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 5: Στοίβες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 1: Βασικοί τύποι δεδομένων. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Δομές Δεδομένων. Ενότητα 6: Ουρές. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Δομές Δεδομένων Ενότητα 1

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

Δομές Δεδομένων. Ενότητα 8: Διπλά συνδεδεμένες λίστες. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Βάσεις Δεδομένων. Ενότητα 1: Εισαγωγή στις Βάσεις δεδομένων. Πασχαλίδης Δημοσθένης Τμήμα Ιερατικών σπουδών

Εισαγωγή στους Αλγορίθμους

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στους Αλγορίθμους

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός H/Y Ενότητα 3: Πίνακες αριθμών και χαρακτήρων. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Εισαγωγή στους Αλγορίθμους Ενότητα 8η

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός H/Y Ενότητα 6: Δομές (structures) Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 3: Constructors και destructors

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 7: Υπερφόρτωση τελεστών. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 5: Κληρονομικότητα. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 2: ΣΥΓΚΕΝΤΡΩΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΜΑΡΚΕΤΙΝΓΚ Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

Εισαγωγή στους Αλγορίθμους

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Λογιστική Κόστους Ενότητα 10: Ασκήσεις Προτύπου Κόστους Αποκλίσεων.

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 9: Ειδικά θέματα γλώσσας C/C++. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Διοικητική Λογιστική

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 2: Κλάσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

ΑΝΤΙΡΡΥΠΑΝΤΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΑΙΩΡΟΥΜΕΝΩΝ ΣΩΜΑΤΙΔΙΩΝ Ενότητα 2: Αιωρούμενα σωματίδια & Απόδοση συλλογής Αν. Καθ. Δρ Μαρία Α. Γούλα Τμήμα Μηχανικών

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους (1)

Εισαγωγή στους Αλγορίθμους Ενότητα 7η

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους

Εισαγωγή στον δομημένο προγραμματισμό

Συστήματα Αναμονής. Ενότητα 3: Στοχαστικές Ανελίξεις. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

ΑΝΑΛΥΣΗ ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΩΝ ΚΑΤΑΣΤΑΣΕΩΝ

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Οργάνωση και Διοίκηση Πωλήσεων

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

Οργάνωση και Διοίκηση Πωλήσεων Ενότητα 1: Ο ΡΟΛΟΣ ΤΩΝ ΠΩΛΗΣΕΩΝ ΣΤΟ ΠΛΑΙΣΙΟ ΤΗΣ ΣΤΡΑΤΗΓΙΚΗΣ ΜΑΡΚΕΤΙΝΓΚ

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Διοίκηση Έργου. Ενότητα 4: Μέθοδοι Χρονικού Προγραμματισμού Έργων. Σαμαρά Ελπίδα Τμήμα Διοίκησης Επιχειρήσεων (Κοζάνη)

Διδακτική της Πληροφορικής

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

ΟΙΚΟΝΟΜΕΤΡΙΑ. Ενότητα 3: Πολλαπλή Παλινδρόμηση. Αναπλ. Καθηγητής Νικόλαος Σαριαννίδης Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

Μηχανολογικό Σχέδιο Ι

Εισαγωγή στους Αλγορίθμους Ενότητα 10η

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

Συστήματα Αναμονής. Ενότητα 1: Εισαγωγή. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Συστήματα Αναμονής. Ενότητα 5: Ανέλιξη Poisson. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Εισαγωγικές έννοιες θεωρίας Συστημάτων Αυτομάτου Ελέγχου

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Ψηφιακή Επεξεργασία Εικόνων

Προγραμματισμός Ηλεκτρονικών Υπολογιστών 2 - Εργαστήριο

Αντικειμενοστρεφής Προγραμματισμός Ενότητα 6: Φιλικές συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός H/Y Ενότητα 2: Εντολές ελέγχου ροής. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Δομές Δεδομένων. Ενότητα 9: Αναδρομικότητα. Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Τεχνολογία Πολυμέσων. Ενότητα 8: Pool Table. Νικολάου Σπύρος Τμήμα Μηχανικών Πληροφορικής ΤΕ

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Ενότητα: Εισαγωγή ΚΥΡΟΠΟΥΛΟΣ ΚΩΝΣΤΑΝΤΙΝΟΣ. Τμήμα Διοίκηση Επιχειρήσεων (Κοζάνη)

Προγραμματισμός Ηλεκτρονικών Υπολογιστών 2 - Εργαστήριο

Ηλεκτρονικοί Υπολογιστές

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

ΟΙΚΟΝΟΜΕΤΡΙΑ. Ενότητα 1: Εκτιμητές και Ιδιότητες. Αναπλ. Καθηγητής Νικόλαος Σαριαννίδης Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εκκλησιαστικό Δίκαιο. Ενότητα 10η: Ιερά Σύνοδος της Ιεραρχίας και Διαρκής Ιερά Σύνοδος Κυριάκος Κυριαζόπουλος Τμήμα Νομικής Α.Π.Θ.

Διδακτική Πληροφορικής

Συστήματα Αναμονής. Ενότητα 7: Ουρά Μ/Μ/1. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Εισαγωγικές έννοιες θεωρίας Συστημάτων Αυτομάτου Ελέγχου Ενότητα 2 η : ΠΕΡΙΓΡΑΦΗ ΣΥΣΤΗΜΑΤΩΝ ΜΕ ΜΑΘΗΜΑΤΙΚΑ ΜΟΝΤΕΛΑ

Ειδικά Θέματα Δικτύων Ι

Συστήματα Πολυμέσων Ενότητα 5: Σαρωτές. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 4: Πηγές Δεδομένων- Δευτερογενή Στοιχεία. Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

Συστήματα Αναμονής. Ενότητα 4: Αλυσίδες Markov. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Συστήματα Αναμονής. Ενότητα 9: Ανέλιξη Γέννησης - Θανάτου. Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 1

Προγραμματισμός H/Y Ενότητα 7: Αρχεία. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Εισαγωγικές έννοιες θεωρίας Συστημάτων Αυτομάτου Ελέγχου Ενότητα 8 η : ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΠΡΟΓΡΑΜΜΑΤΙΖΟΜΕΝΩΝ ΛΟΓΙΚΩΝ ΕΛΕΓΚΤΩΝ

Τεχνικό Σχέδιο - CAD

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού Υπέρθερμου Ατμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

ΗΛΕΚΤΡΟΤΕΧΝΙΑ-ΗΛΕΚΤΡΟΝΙΚΗ ΕΡΓΑΣΤΗΡΙΟ

Σχεδίαση Δικτύων Υπολογιστών

Δομημένος Προγραμματισμός

ΗΛΕΚΤΡΟΝΙΚΗ ΙIΙ Ενότητα 6

Οικονομετρία Ι. Ενότητα 10: Διαγνωστικοί Έλεγχοι. Δρ. Χαϊδώ Δριτσάκη Τμήμα Λογιστικής & Χρηματοοικονομικής

Transcript:

Δομές Δεδομένων Ενότητα 4: Πίνακες Δρ. Γεώργιος Σίσιας Τμήμα Μηχανικών Πληροφορικής ΤΕ

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο TEI Δυτικής Μακεδονίας και στην Ανώτατη Εκκλησιαστική Ακαδημία Θεσσαλονίκης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3

Σκοποί ενότητας Σκοπός της παρούσας ενότητας είναι η παρουσίαση των δυναμικά δηλωμένων πινάκων τουλάχιστον μίας διάστασης. Για τις ανάγκες της παρούσας ενότητας θα χρειαστεί να έχετε ήδη μελετήσει την ενότητα με τίτλο "Διαχείριση μνήμης", όπου έχετε ήδη δει τον τρόπο δήλωσης μονοδιάστατων δυναμικών πινάκων. 4

Περιεχόμενα ενότητας Εισαγωγή στους πίνακες. Δήλωση πινάκων. Δέσμευση μνήμης. Παράδειγμα. Αποτελέσματα παραδείγματος. Παράδειγμα 2. Ερώτηση. Ασκήσεις. Βιβλιογραφία. 5

Εισαγωγή στους πίνακες (1/3) Οι πίνακες είναι συλλογές όμοιων αντικειμένων. Συνήθως απεικονίζονται με ορθογώνια που είναι χωρισμένα σε πολλά μικρά μέρη, όπου κάθε μικρό μέρος αναπαριστά ένα στοιχείο του πίνακα. Οι πίνακες μπορούν να είναι μονοδιάστατοι, δισδιάστατοι, τρισδιάστατοι, ή περισσότερων διαστάσεων. 6

Εισαγωγή στους πίνακες (2/3) Ενώ εμείς μπορούμε να έχουμε πρόσβαση σε πίνακες ανώτερης της μίας διάστασης, στην πράξη υλοποιούνται ως μονοδιάστατοι διαδοχικοί χώροι μνήμης στους οποίους αναφερόμαστε με έναν (1Δ), δύο (2Δ), τρεις (3Δ), ή περισσότερους δείκτες. Στην ουσία η χρήση περισσότερων της μίας διάστασης είναι για δική μας διευκόλυνση. Στην πραγματικότητα, όσον αφορά τον υπολογιστή, όλοι είναι μονοδιάστατοι. 7

Εισαγωγή στους πίνακες (3/3) Οι πίνακες μπορούν να χωριστούν σε στατικά και δυναμικά δηλωμένους. Μέχρι τώρα έχετε ήδη συναντήσει στατικούς πίνακες στο αντίστοιχο μάθημα του Προγραμματισμού Ι. Σκοπός της παρούσας ενότητας είναι η παρουσίαση των δυναμικά δηλωμένων πινάκων τουλάχιστον μίας διάστασης. Για τις ανάγκες της παρούσας ενότητας θα χρειαστεί να έχετε ήδη μελετήσει την ενότητα με τίτλο "Διαχείριση μνήμης", όπου έχετε ήδη δει τον τρόπο δήλωσης μονοδιάστατων δυναμικών πινάκων. 8

Δήλωση πινάκων (1/2) Η δήλωση και χρήση δυναμικών πινάκων περιλαμβάνει τα ακόλουθα: 1. Δυναμική δέσμευση της απαιτούμενης ποσότητας μνήμης. 2. Αρχικοποίηση του δεσμευμένου χώρου μνήμης. 3. Χρήση του δεσμευμένου χώρου μνήμης. 4. Αποδέσμευση της μνήμης στο τέλος, όταν δε χρειαζόμαστε πια το χώρο. 9

Δήλωση πινάκων (2/2) Η δήλωση πινάκων 2 ή περισσότερων διαστάσεων δε διαφέρει. Απλά ζητούμε περισσότερο χώρο. Στο Σχήμα 1 φαίνεται ένας πίνακας 10 10 στοιχείων. Σημείωση: Δεν αναφέρουμε τον τύπο του στοιχείου - υποθέτουμε ότι είναι TItem. 10

Δέσμευση μνήμης (1/6) Ο πίνακας αυτός έχει, γενικά, διαστάσεις W H. Ο χώρος που χρειαζόμαστε δίνεται από τον τύπο χώρος=w H sizeof(titem). Δηλαδή, το γινόμενο του πλήθους των στοιχείων που θέλουμε και του μεγέθους σε bytes του καθενός στοιχείου. Αν το στοιχείο ήταν απλός ακέραιος, τότε ο απαιτούμενος χώρος για την αποθήκευση του πίνακα θα ήταν 400 bytes (υποθέτοντας ότι ο ακέραιος είναι 32-bit). 11

Δέσμευση μνήμης (2/6) Όσον αφορά τα διαστήματα τιμών, οι έγκυρες τιμές των W και H είναι από 0 μέχρι και 9. Οποιοδήποτε στοιχείο του πίνακα μπορεί να περιγραφεί με δύο τιμές x και y. Η πρόσβαση στα δεδομένα με συντεταγμένες (x, y) γίνεται με τη βοήθεια της παρακάτω εξίσωσης: y W+x Έτσι, μπορούμε να γράψουμε το εξής: Array[y * W + x] = 0; Ώστε να δώσουμε αρχική τιμή 0 στο στοιχείο με συντεταγμένες (x, y). 12

Δέσμευση μνήμης (3/6) Η δήλωση 3Δ πίνακα είναι παρόμοια. Θεωρήστε την ύπαρξη D πινάκων όπως αυτόν που μόλις περιγράψαμε. Τώρα οι συντεταγμένες ενός στοιχείου δίνονται από την τριάδα (x, y, z). Η δέσμευση μνήμης γίνεται με τη βοήθεια του τύπου χώρος=w H D sizeof(titem), όπου D το βάθος του πίνακα (η 3η διάστασή του). 13

Δέσμευση μνήμης (4/6) Το πρώτο που μας ενδιαφέρει είναι να χρησιμοποιήσουμε τη «φέτα» στην οποία αναφερόμαστε με τη συντεταγμένη z. Κάθε φέτα έχει στοιχεία. Κάθε γραμμή έχει W στοιχεία, και κάθε στοιχείο μιας γραμμής βρίσκεται στη συντεταγμένη x. Έτσι προκύπτει ο τύπος: z W H+y W+x 14

Δέσμευση μνήμης (5/6) Εικόνα 1. Δέσμευση μνήμης. Πηγή: Διδάσκων (2015). 15

Δέσμευση μνήμης (6/6) Οι τύποι για 4 και 5 διαστάσεις αντίστοιχα, είναι: Element(x,y,z,t)=Array[t D W H+z W H+y W+x] Element(x,y,z,t,r)=Array[r T D W H+t D W H+z W H+y W+x] 16

Παράδειγμα (1/16) Το πρόγραμμα που ακολουθεί δείχνει τη δέσμευση, την αρχικοποίηση, και την αποδέσμευση πινάκων 1, 2, 3, 4, και 5 διαστάσεων. Στην πρώτη ενότητα του προγράμματος έχουμε απλά τη δήλωση του τύπου των στοιχείων των πινάκων. Στο συγκεκριμένο παράδειγμα είναι απλά ακέραιος. 17

Παράδειγμα (2/16) Στη δεύτερη ενότητα έχουμε τις συναρτήσεις που δεσμεύουν χώρο σύμφωνα με όσα έχουμε ήδη περιγράψει. Στην τρίτη ενότητα έχουμε τις συναρτήσεις αρχικοποίησης των πινάκων με τις παραπάνω διαστάσεις. Εδώ σημειώνουμε ότι η αρχικοποίηση των στοιχείων γίνεται με το βέλτιστο δυνατό τρόπο (σε λίγο θα επεκταθούμε σε αυτό). 18

Παράδειγμα (3/16) Στην τέταρτη ενότητα έχουμε δύο συναρτήσεις που τυπώνουν τις σχετικές αποστάσεις (offset) καθενός στοιχείου με βέλτιστο και χείριστο τρόπο. Στην πέμπτη ενότητα δοκιμάζουμε όσα έχουμε υλοποιήσει πιο πάνω. 19

Παράδειγμα (4/16) #include <stdio.h> #include <stdlib.h> /* ------------------------------------------------------------------------*/ // Section A. Type of item to be stored in the arrays. typedef int TItem; 20

Παράδειγμα (5/16) /* -------------------------------------------------------------------------- */ // Section B. Allocation of 1D, 2D, 3D, 4D, and 5D arrays. TItem* AllocateArray1D(size_t W) { return ( (TItem *) malloc(sizeof(titem) * W) ); } // AllocateArray1D TItem* AllocateArray2D(size_t W, size_t H) { return ( (TItem *) malloc(sizeof(titem) * W * H) ); } // AllocateArray2D 21

Παράδειγμα (6/16) TItem* AllocateArray3D(size_t W, size_t H, size_t D) { return ( (TItem *) malloc(sizeof(titem) * W * H * D) ); } // AllocateArray3D TItem* AllocateArray4D(size_t W, size_t H, size_t D, size_t T) { return ( (TItem *) malloc(sizeof(titem) * W * H * D * T) ); } // AllocateArray4D TItem* AllocateArray5D(size_t W, size_t H, size_t D, size_t T, size_t R) { return ( (TItem *) malloc(sizeof(titem) * W * H * D * T * R) ); } // AllocateArray5D 22

Παράδειγμα (7/16) /* -------------------------------------------------------------------------- */ // Section C. Functions for the optimal initialisation of // 1D, 2D, 3D, 4D, and 5D arrays. void InitArray1D(TItem *Array, size_t W) { size_t x; for ( x = 0; x < W; x++ ) { Array[x] = 0; } // for } // InitArray1D 23

Παράδειγμα (8/16) void InitArray2D(TItem *Array, size_t W, size_t H) { size_t x, y; for ( y = 0; y < H; y++ ) { for ( x = 0; x < W; x++ ) { Array[y * W + x] = 0; } // for } // for } // InitArray2D 24

Παράδειγμα (9/16) void InitArray3D(TItem *Array, size_t W, size_t H, size_t D) { size_t x, y, z; for ( z = 0; z < D; z++ ) { for ( y = 0; y < H; y++ ) { for ( x = 0; x < W; x++ ) { Array[z * W * H + y * W + x] = 0; } // for } // for } // for } // InitArray3D 25

Παράδειγμα (10/16) void InitArray4D(TItem *Array, size_t W, size_t H, size_t D, size_t T) { size_t x, y, z, t; for ( t = 0; t < T; t++ ) { for ( z = 0; z < D; z++ ) { for ( y = 0; y < H; y++ ) { for ( x = 0; x < W; x++ ) { Array[t * W * H * D + z * W * H + y * W + x] = 0; } // for }// for }// for }// for }// InitArray4D 26

Παράδειγμα (11/16) void InitArray5D(TItem *Array, size_t W, size_t H, size_t D, size_t T, size_t R) { size_t x, y, z, t, r; for ( r = 0; r < R; r++ ) { for ( t = 0; t < T; t++ ) { for ( z = 0; z < D; z++ ) { for ( y = 0; y < H; y++ ) { for ( x = 0; x < W; x++ ) { Array[r * W * H * D * T + t * W * H * D + z * W * H + y * W + x] = 0; }// for }// for }// for }// for }// for }// InitArray5D 27

Παράδειγμα (12/16) /* -------------------------------------------------------------------------- */ // Section D. Examples of optimal and worse-case access of arrays. void PrintOffsetsGood3D(TItem *Array, size_t W, size_t H, size_t D) { size_t x, y, z; for ( z = 0; z < D; z++ ) { for ( y = 0; y < H; y++ ) { for ( x = 0; x < W; x++ ) { printf("%u\n", sizeof(titem) * ( &(Array[z * W * H + y * W + x]) - Array )); } // for } // for } // for } // PrintOffsetsGood3D 28

Παράδειγμα (13/16) void PrintOffsetsBad3D(TItem *Array, size_t W, size_t H, size_t D) { size_t x, y, z; for ( x = 0; x < W; x++ ) { for ( y = 0; y < H; y++ ) { for ( z = 0; z < D; z++ ) { printf("%u\n", sizeof(titem) * ( &(Array[z * W * H + y * W + x]) - Array )); } // for } // for } // for } // PrintOffsetsBad3D 29

Παράδειγμα (14/16) /* -------------------------------------------------------------------------- */ // Section E. Testing of the above functions. void main() { TItem *Array1D, *Array2D, *Array3D, *Array4D, *Array5D; // Allocate memory for arrays. Array1D = AllocateArray1D(8); // 32 bytes. Array2D = AllocateArray2D(8, 8); // 256 bytes. Array3D = AllocateArray3D(8, 8, 8); // 2048 bytes, or 2 KB. Array4D = AllocateArray4D(8, 8, 8, 8); // 16384 bytes, or 16 KB. Array5D = AllocateArray5D(8, 8, 8, 8, 8); // 131072 bytes, or 128 KB. 30

Παράδειγμα (15/16) // Initialise arrays. InitArray1D(Array1D, 8); InitArray2D(Array2D, 8, 8); InitArray3D(Array3D, 8, 8, 8); InitArray4D(Array4D, 8, 8, 8, 8); InitArray5D(Array5D, 8, 8, 8, 8, 8); // Results of good and bad memory accesses. PrintOffsetsGood3D(Array3D, 8, 8, 8); printf("-------------------\n"); PrintOffsetsBad3D(Array3D, 8, 8, 8); 31

Παράδειγμα (16/16) // Deallocate arrays. free(array1d); free(array2d); free(array3d); free(array4d); free(array5d); } // main 32

Αποτελέσματα παραδείγματος (1/4) Προτείνουμε την εκτέλεση του παραπάνω προγράμματος από τη γραμμή εντολών, ως εξής: arrays.exe > results.txt Υποθέτοντας ότι το εκτελέσιμο του προγράμματος ονομάζεται arrays.exe (ή όπως αλλιώς το ονομάσατε εσείς). Έτσι η έξοδος του προγράμματος θα κατευθυνθεί στο αρχείο results.txt, ώστε να μπορέσετε να τη μελετήσετε, διότι είναι μακροσκελής. 33

Αποτελέσματα παραδείγματος (2/4) Θα διαπιστώσετε ότι στη βέλτιστη πρόσβαση στα στοιχεία του πίνακα οι σχετικές αποστάσεις καθενός στοιχείου από την αρχή του πίνακα είναι με αύξουσα σειρά. Στη χείριστη περίπτωση αυξάνουν για λίγο και ξεκινούν πάλι «σχεδόν» από την αρχή. Οι επεξεργαστές που έχουν κατασκευαστεί από τις αρχές του 2000 έχουν τη δυνατότητα να παρακολουθούν την πρόσβαση σε διευθύνσεις μνήμης με αύξουσα ή φθίνουσα σειρά. 34

Αποτελέσματα παραδείγματος (3/4) Έτσι μπορούν να «μαντεύουν» ποιο μπλοκ μνήμης θα χρειαστεί σε λίγο ο επεξεργαστής, ώστε να το προφορτώσουν από τη RAM στην κρυφή μνήμη (cache) του επεξεργαστή. Έτσι βελτιώνουν τις επιδόσεις. Ωστόσο, αν εμείς μεταπηδούμε ακανόνιστα σε διευθύνσεις μνήμης (όπως με το χείριστο τρόπο), ο επεξεργαστής αδυνατεί να μαντέψει σωστά το επόμενο μπλοκ μνήμης που θα χρειαστεί, καταργώντας έτσι ουσιαστικά την κρυφή μνήμη. 35

Αποτελέσματα παραδείγματος (4/4) Δηλαδή ο επεξεργαστής εργάζεται σαν να μην υπήρχε κρυφή μνήμη, και όλα τα δεδομένα που χρειάζεται τα φέρνει απευθείας από την κύρια μνήμη (RAM), η οποία είναι σημαντικά πιο αργή από την κρυφή. Ακολουθεί ένα πρόγραμμα που κάνει αυτά που μόλις περιγράψαμε. 36

Παράδειγμα 2 (1/9) Μην ενεργοποιήσετε τις βελτιστοποιήσεις του μεταγλωττιστή, διότι καταλαβαίνει ότι κάνουμε επαναλαμβανόμενες δοκιμές στον κώδικα και θα τις απλοποιήσει. Δείτε τους χρόνους επεξεργασίας στην περίπτωση της βέλτιστης και της χείριστης πρόσβασης. Το πρόγραμμα δημιουργεί 2Δ πίνακες με 16384 16384 στοιχεία των 4 bytes έκαστο. Αυτοί οι πίνακες έχουν μέγεθος 1 GB RAM. 37

Παράδειγμα 2 (2/9) Φροντίστε ώστε οι πίνακες να είναι πολύ μεγαλύτεροι από την κρυφή μνήμη του επεξεργαστή σας, ώστε να καταστεί έντονη η ανάγκη πρόσβασης στη μνήμη RAM, ειδάλλως όλα θα τρέξουν από την κρυφή μνήμη και δε θα παρατηρήσετε αυτά που επιδιώκουμε. Φροντίστε, επίσης, να μη χρειαστεί η χρήση του αρχείου μνήμης (pagefile), διότι τότε μπαίνει στο "παιχνίδι" και ο δίσκος (δηλαδή μη δηλώσετε τεράστιους πίνακες). 38

Παράδειγμα 2 (3/9) #include <stdio.h> #include <stdlib.h> #include <time.h> /* -------------------------------------------------------------------------- */ // // Section A. Type of item to be stored in the arrays. // typedef int TItem; 39

Παράδειγμα 2 (4/9) // Section B. Allocation and initialisation of 2D array. TItem* AllocateArray2D(size_t W, size_t H) { return ( (TItem *) malloc(sizeof(titem) * W * H) ); } // AllocateArray2D void InitArray2D(TItem *Array, size_t W, size_t H) { size_t x, y; int v = 0; for ( y = 0; y < H; y++ ) { for ( x = 0; x < W; x++ ) { Array[y * W + x] = v; v++; } // for } // for } // InitArray2D 40

Παράδειγμα 2 (5/9) // Section C. Optimal and non-optimal summation of all elements. int OptSum2D(TItem *Array, size_t W, size_t H) { size_t x, y; int Sum = 0; for ( y = 0; y < H; y++ ) { for ( x = 0; x < W; x++ ) { Sum += Array[y * W + x]; } // for } // for return ( Sum ); } // OptSum2D 41

Παράδειγμα 2 (6/9) int BadSum2D(TItem *Array, size_t W, size_t H) { size_t x, y; int Sum = 0; for ( x = 0; x < W; x++ ) { for ( y = 0; y < H; y++ ) { Sum += Array[y * W + x]; } // for } // for return ( Sum ); } // BadSum2D 42

Παράδειγμα 2 (7/9) /* -------------------------------------------------------------------------- */ #define N 10 void main() { clock_t Start, Stop; double Sec; int TotalSum = 0, Iter; TItem *MyArray; MyArray = AllocateArray2D(16384, 16384); // Allocate 1 GB RAM. 43

Παράδειγμα 2 (8/9) if ( MyArray == NULL ) { printf("failed to allocate array.\n\n"); exit(1); } // if InitArray2D(MyArray, 16384, 16384); Start = clock(); for ( Iter = 0; Iter < N; Iter++ ) { TotalSum += OptSum2D(MyArray, 16384, 16384); } // for 44

Παράδειγμα 2 (9/9) Stop = clock(); Sec = ( (double) ( Stop - Start ) / CLOCKS_PER_SEC ); printf("time to execute optimal sum: %.3lf sec.\n", Sec); Start = clock(); for ( Iter = 0; Iter < N; Iter++ ) { TotalSum += BadSum2D(MyArray, 16384, 16384); } // for Stop = clock(); Sec = ( (double) ( Stop - Start ) / CLOCKS_PER_SEC ); printf("time to execute non-optimal sum: %.3lf sec.\n", Sec); } // main 45

Ερώτηση Συγκρίνετε το λόγο των χρόνων εκτέλεσης της χείριστης περίπτωσης προς τη βέλτιστη με το λόγω της συχνότητας λειτουργίας του επεξεργαστή σας προς τη συχνότητα λειτουργίας του διαύλου μνήμης του υπολογιστή σας. Τι παρατηρείτε; Λάβετε υπόψη στις μετρήσεις σας το γεγονός ότι πολλοί σύγχρονοι επεξεργαστές υπερχρονίζουν αυτόματα τους πυρήνες τους όταν έχουν περιθώριο, κι έτσι ο λόγος Συχνότητα CPU / Συχνότητα RAM αλλάζει σε σχέση με τις τυπικές προδιαγραφές. 46

Ασκήσεις

Άσκηση 1 Αντικαταστήστε τον τύπο των στοιχείων με κάτι πιο πολύπλοκο, δικής σας επιλογής. Τώρα ποιες είναι οι απαιτήσεις μνήμης; 48

Άσκηση 2 (1/2) Υλοποιήστε τις κατάλληλες συναρτήσεις για πίνακες 6 και 7 διαστάσεων. Ελέγξτε τον κώδικά σας. Προσπαθήστε να βρείτε το μέγιστο πλήθος στοιχείων ανά διάσταση που μπορείτε να έχετε (υποθέτουμε ότι οι διστάσεις είναι ίδιες, π.χ. 10, κλπ. στοιχεία σε όλες τις διαστάσεις). 49

Άσκηση 2 (2/2) Βοήθεια 1: Δοκιμάστε ολοένα και μεγαλύτερους πολυδιάστατους πίνακες μέχρι να αποτύχει η δέσμευση. Βοήθεια 2: Μην έχετε περισσότερους από 1 πίνακα δεσμευμένους ταυτόχρονα. 50

Βιβλιογραφία (1/8) Aho AV, Hopcroft JE, and Ullman JD. (1974) The design and analysis of computer algorithms. USA, Addison-Wesley Publishing Company. 470 pp. ISBN 0-201-00029-6. ( 38.33, 46.76). Aho AV, Hopcroft JE, and Ullman JD. (1983) Data structures and algorithms. USA, Addison-Wesley Publishing Company. 427 pp. ISBN 0-201-00023-7. ( 43.65, 53.25). Bik AJC. (2004) The software vectorization handbook: applying multimedia extensions for maximum performance. USA, Intel Press. 236 pp. ISBN 0-9743649-2-4. ( 32.31, 46.63). 51

Βιβλιογραφία (2/8) Carrano FM and Henry T. (2013) Data abstraction and problem solving with C++: walls and mirrors. 6th ed. UK, Pearson Education Limited. 833 pp. ISBN10 0-273-76841-7, ISBN13 978-0-76841-8. Cormen TH, Leiserson CE, Rivest RL, and Stein C. (2012) Εισαγωγή στους αλγορίθμους. USA/Ελλάδα, MIT Press/Ίδρυμα Τεχνολογίας & Έρευνας - Πανεπιστημιακές Εκδόσεις Κρήτης. 1260 pp. ISBN 978-960-524-224-4. Dasgupta S, Papadimitriou C and Vazirani U. (2009) Αλγόριθμοι. Ελλάδα, Εκδόσεις Κλειδάριθμος. 416 σελ. ISBN13 978-960-461-211-6. 52

Βιβλιογραφία (3/8) Gerber R, Bik AJC, Smith KB and Tian X. (2006) The software optimization cookbook: high-performance recipes for IA-32 platforms. 2nd ed. USA, Intel Press. 404 pp. ISBN 0-9764832-1-1. ( 35.07, 50.61). Helman P and Veroff R. (1988) Walls and mirrors: intermediate problem solving and data structures. Modula 2 ed. USA, The Benjamin/Cummings Publishing Company, Inc. 625 pp. ( 23.95). Kleinberg J and Tardos W. (2008) Σχεδιασμός αλγορίθμων. Ελλάδα, Εκδόσεις Κλειδάριθμος. 944 σελ. ISBN13 978-960- 461-207-9. 53

Βιβλιογραφία (4/8) Knuth DE. (2009) Η τέχνη του προγραμματισμού: θεμελιώδεις αλγόριθμοι, Τόμος Α. 3η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 759 σελ. ISBN13 978-960-418-185-8. Knuth DE. (2010) Η τέχνη του προγραμματισμού: ημιαριθμητικοί αλγόριθμοι, Τόμος Β. 3η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 912 σελ. ISBN13 978-960-418-224-4. Knuth DE. (2010) Η τέχνη του προγραμματισμού: ταξινόμηση και αναζήτηση, Τόμος Γ. 2η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 926 σελ. ISBN13 978-960-418-245-9. 54

Βιβλιογραφία (5/8) Kruse RL and Ryba AJ. (1999) Data structures and program design in C++. USA, Prentice Hall. 717 pp. ISBN 0-13- 082640-5. ( 40.74). Lafore R. (2005) Δομές δεδομένων και αλγόριθμοι στη Java. Ελλάδα, Εκδόσεις Μ. Γκιούρδα. 798 σελ. ISBN10 960-512- 452-1. Levitin A. (2008) Εισαγωγή στην ανάλυση και σχεδίαση αλγορίθμων. 2η Έκδοση. Ελλάδα, Εκδόσεις Τζιόλα. 700 σελ. ISBN13 978-960-418-143-8. 55

Βιβλιογραφία (6/8) McConnell S. (1993) Code complete: a practical handbook of software construction. USA, Microsoft Press. 857 pp. ( 25.99). Mehlhorn K and Sanders P. (2008) Algorithms and data structures: the basic toolbox. Germany, Springer-Verlag Berlin Heidelberg. 300 pp. ISBN13 978-3-540-77977-3. ( 28.11, 34.29). Prichard JJ and Carrano FM. (2011) Data abstraction and problem solving with Java: walls and mirrors. 3rd ed. UK, Pearson Education Limited. 959 pp. ISBN10 0-273-75120-4. ISBN13 978-0-273-75120-5. 56

Βιβλιογραφία (7/8) Sahni S. (2004) Δομές Δεδομένων, Αλγόριθμοι, και Εφαρμογές στη C++. Ελλάδα/ΗΠΑ, Εκδόσεις Τζιόλα/McGraw-Hill. 830 σελ. ISBN10 960-418-030-4. Sedgewick R and Flajolet P. (2013) An introduction to the analysis of algorithms. 2nd ed. USA, Pearson Education, Inc. 572 pp. ISBN13 978-0-321-90575-8. Sedgewick R and Wayne K. (2011) Algorithms. 4th ed. USA, Pearson Education, Inc. 952 pp. ISBN13 978-0-321-57351-3. Κοίλιας Χ. (2004) Δομές δεδομένων & οργανώσεις αρχείων. Ελλάδα, Εκδόσεις Νέων Τεχνολογιών. 447 σελ. ISBN10 960-8105-64-1. 57

Βιβλιογραφία (8/8) Μποζάνης ΠΔ. (2006) Δομές Δεδομένων. Ελλάδα, Εκδόσεις Τζιόλα. 552 σελ. ISBN10 960-418-084-3. Μποζάνης ΠΔ. (2009) Προβλήματα & ασκήσεις στους αλγορίθμους. Ελλάδα, Εκδόσεις Τζιόλα. 492 σελ. ISBN13 978-960-418-186-5. Μποζάνης ΠΔ. (2013) Αλγόριθμοι. Ελλάδα, Εκδόσεις Τζιόλα. 549 σελ. ISBN13 978-960-418-070-1. Μυσιρλής Ν. (2002) Δομές δεδομένων με C. Ελλάδα, αυτοέκδοση. 347 σελ. ISBN10 960-92031-1-6. Παπαρίζος Κ. (2010) Ανάλυση και σχεδίαση αλγορίθμων. Ελλάδα, Εκδόσεις Τζιόλα. 606 σελ. ISBN13 978-960-418-222-0. 58

Τέλος Ενότητας

Σημείωμα Αναφοράς Copyright ΤΕΙ Δυτικής Μακεδονίας, Δρ. Γεώργιος Σίσιας. «Δομές Δεδομένων». Έκδοση: 1.0. Κοζάνη 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: URL. 60

Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο. που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο. που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο. Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 61

Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς. το Σημείωμα Αδειοδότησης. τη δήλωση Διατήρησης Σημειωμάτων. το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει). μαζί με τους συνοδευόμενους υπερσυνδέσμους. 62