ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αφηρηµένοι Τύποι Δεδοµένων Κεφάλαιο 4 ( , ) Ε. Μαρκάκης Επίκουρος Καθηγητής

Σχετικά έγγραφα
Δοµές Δεδοµένων. 7η Διάλεξη Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Συλλογές, Στοίβες και Ουρές

Δοµές Δεδοµένων. 8η Διάλεξη: Ταξινόµηση. Ε. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

Δοµές Δεδοµένων. 3η Διάλεξη Στοιχειώδεις Δοµές Δεδοµένων: Πίνακες. Ε. Μαρκάκης

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Βασικές Έννοιες Δοµών Δεδοµένων

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

Δοµές Δεδοµένων. 2η Διάλεξη Αλγόριθµοι Ένωσης-Εύρεσης (Union-Find) Ε. Μαρκάκης. Βασίζεται στις διαφάνειες των R. Sedgewick K.

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Πίνακες Συµβόλων Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

ΠΛΗ111. Ανοιξη Μάθηµα 4 ο. Στοίβα. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Δοµές Δεδοµένων. 4η Διάλεξη Στοιχειώδεις Δοµές Δεδοµένων: Πίνακες και Λίστες. Ε. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αλγόριθµοι Ένωσης-Εύρεσης (Union-Find) Κεφάλαιο 1. Ε. Μαρκάκης Επικ. Καθηγητής

Δομές Δεδομένων (Data Structures)

Οντοκεντρικός Προγραμματισμός

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Κεφάλαιο 5 Συλλογές, Στοίβες και Ουρές

Στοιχειώδεις Δομές Δεδομένων

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Δοµές Δεδοµένων. 9η Διάλεξη Ταξινόµηση - Στοιχειώδεις µέθοδοι. Ε. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Λίστες Κεφάλαιο 3 (3.3, 3.4, 3.7) Ε. Μαρκάκης Επικ. Καθηγητής

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Εισαγωγή. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Η στοίβα (stack) H στοίβα είναι ένας αποθηκευτικός χώρος οργανωµένος κατά τέτοιο τρόπο ώστε να υποστηρίζει δύο βασικές λειτουργίες:

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Λίστες Κεφάλαιο 3 (3.3, 3.4, 3.7) Ε. Μαρκάκης Επικ. Καθηγητής

Δοµές Δεδοµένων. 13η Διάλεξη Πίνακες Συµβόλων. Ε. Μαρκάκης

Δοµές Δεδοµένων. 14η Διάλεξη Δέντρα Δυαδικής Αναζήτησης. Ε. Μαρκάκης

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Τµήµα Πληροφορικής. Δοµές Δεδοµένων - Εργασία 1. Φθινοπωρινό Εξάµηνο Διδάσκων: E. Μαρκάκης. Στοίβες και Ουρές. Οικονοµικό Πανεπιστήµιο Αθηνών

Στοίβες με Δυναμική Δέσμευση Μνήμης

Δομές Δεδομένων & Αλγόριθμοι

Σύνοψη Προηγούμενου (1/2) Στοίβες, Ουρές, Ουρές Προτεραιότητας. Σύνοψη Προηγούμενου (2/2) Σημερινό Μάθημα. Πίνακες. Εισαγωγή, σε χρόνο O(1).

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Εξωτερική Αναζήτηση και Β-δέντρα Κεφάλαιο 16. Ε. Μαρκάκης Επίκουρος Καθηγητής

Δοµές Δεδοµένων. 5η Διάλεξη Λίστες και αρχές ανάλυσης αλγορίθµων. Ε. Μαρκάκης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Ουρά Προτεραιότητας (priority queue)

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Βασικές Ιδιότητες και Διάσχιση Κεφάλαιο 5 ( και ) Ε. Μαρκάκης Επίκουρος Καθηγητής

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

public class ArrayStack implements Stack {

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

Γράφημα. Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 4 5 πλήθος κορυφών πλήθος ακμών

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

υναµικές οµές εδοµένων

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Δοµές Δεδοµένων. 16η Διάλεξη Κατακερµατισµός. Ε. Μαρκάκης

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Οικονοµικό Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής. Φθινοπωρινό Εξάµηνο Δοµές Δεδοµένων - Εργασία 2. Διδάσκων: E. Μαρκάκης

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

4. Συνδεδεμένες Λίστες

Αναδρομικοί Αλγόριθμοι

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

Wrapper Classes, Abstract Classes and Interfaces

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

Βασικές Δομές Δεδομένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Κλάσεις και Αντικείµενα

ΚΕΦΑΛΑΙΟ 8: Αφαίρεση δεδοµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ιαφάνειες παρουσίασης #11

Στοίβες. ΟΑΤ της Στοίβας. Περιγραφή και Υλικό Ανάγνωσης. Αφηρηµένοι Τύποι εδοµένων (AΤ )

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Δομές Δεδομένων και Αλγόριθμοι

Βασικές δοµές δεδοµένων. Ορολογία λιστών. 8.1 Βασικές έννοιες δοµών δεδοµένων 8.2 Υλοποίηση δοµών δεδοµένων 8.3 Μια σύντοµη υπόθεση εργασίας

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Βασικές οµές εδοµένων

Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Προγραμματισμός Υπολογιστών με C++

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστρεφής Προγραμματισμός

Δομές Δεδομένων. Λουκάς Γεωργιάδης.

Transcript:

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Αφηρηµένοι Τύποι Δεδοµένων Κεφάλαιο 4 (4.1-4.7, 4.10-4.11) Ε. Μαρκάκης Επίκουρος Καθηγητής

Περίληψη Αφηρηµένοι τύποι δεδοµένων Συλλογές στοιχείων Στοίβα ώθησης προς τα κάτω Παραδείγµατα πελατών για στοίβες Υλοποιήσεις στοίβας µε πίνακες και λίστες Γενικές υλοποιήσεις Ουρές FIFO Υλοποιήσεις ουράς µε πίνακες και λίστες ΑΤΔ για προβλήµατα συνδετικότητας ΑΤΔ για πολυώνυµα Δοµές Δεδοµένων 06-2

Αφηρηµένοι τύποι δεδοµένων Όλα τα υπολογιστικά συστήµατα βασίζονται σε στρώσεις αφαίρεσης (layers of abstraction) Το µοντέλο του bit: 0 ή 1 (χωρίς να µας απασχολεί πώς επιτυγχάνεται στο hardware, π.χ. τσιπ πυριτίου, 5V 1, 0V 0) Γλώσσα προγραµµατισµού: ο προγραµµατιστής χρειάζεται να γνωρίζει τις διαθέσιµες δοµές δεδοµένων και εντολές της γλώσσας και όχι απαραίτητα πώς υλοποιείται ο compiler Σχεδίαση αλγορίθµων: ανεξάρτητο από γλώσσα προγραµµατισµού (συνήθως) Σε κάθε επίπεδο υπάρχει διαχωρισµός µεταξύ υλοποίησης και χρήσης Δοµές Δεδοµένων 06-3

Αφηρηµένοι τύποι δεδοµένων ΑΤΔ: τύπος δεδοµένων που µπορούµε να προσπελάσουµε µόνο µέσω κάποιας διασύνδεσης Διασύνδεση (ή διεπαφή): περιγραφή τύπου δεδοµένων και µεθόδων Πελάτης: πρόγραµµα που χρησιµοποιεί τις µεθόδους Υλοποίηση: κώδικας που υλοποιεί τις µεθόδους Εποµένως τα προγράµµατα πελάτες δεν µπορούν να έχουν πρόσβαση στα δεδοµένα παρά µόνο µέσω των µεθόδων που παρέχει η διασύνδεση Διαχωρισµός διεπαφής και υλοποίησης Επιτρέπει το χτίσιµο επιπέδων αφαίρεσης Επαναχρησιµοποίηση λογισµικού Παραδείγµατα: στοίβες, ουρές, πίνακες συµβόλων Δοµές Δεδοµένων 06-4

Αφηρηµένοι τύποι δεδοµένων Πλεονεκτήµατα ΑΤΔ Η υλοποίηση µπορεί να χρησιµοποιηθεί από διάφορους πελάτες Σχεδίαση αρθρωτού (modular), άρα επαναχρησιµοποιήσιµου κώδικα Επιτρέπει την καλύτερη ενσωµάτωση και χρήση βελτιστοποιηµένων υλοποιήσεων (σε αντικατάσταση παλιότερων υλοποιήσεων) Δοµές Δεδοµένων 06-5

Αφηρηµένοι τύποι δεδοµένων Προγράµµατα-πελάτες: Πρόσβαση µόνο µέσω των δηµόσιων µεθόδων Υλοποίηση: Ιδιωτικά δεδοµένα Ιδιωτικές µέθοδοι Δηµόσιες µέθοδοι Δοµές Δεδοµένων 06-6

Αφηρηµένοι τύποι δεδοµένων Παράδειγµα: ας επανέλθουµε στην τάξη Point για επεξεργασία σηµείων στο επίπεδο Περιέχει δεδοµένα και µεθόδους class Point { double x, y; Point() { x = Math.random(); y = Math.random(); } Point(double x, double y) {this.x = x;this.y = y;} double r() { return Math.sqrt(x*x + y*y); } double theta() { return Math.atan2(y, x); } double distance(point p) { double dx = x - p.x, dy = y - p.y; return Math.sqrt(dx*dx + dy*dy); } public String tostring() { return "(" + x + "," + y + ")"; } } Δοµές Δεδοµένων 06-7

Αφηρηµένοι τύποι δεδοµένων Οι χρήστες (προγράµµατα-πελάτες) δεν χρειάζεται να γνωρίζουν πώς αποθηκεύονται τα σηµεία Χειρισµός σηµείων µέσω µεθόδων και µόνο Οι χρήστες γνωρίζουν ποιες είναι οι µέθοδοι αλλά όχι πώς λειτουργούν Διεπαφή ΑΤΔ σηµείων Περιλαµβάνει µόνο τα δηµόσια µέλη της τάξης class Point { //τι ξερει ο πελάτης ότι µπορεί να χρησιµοποιήσει Point() Point(double, double) double x() double y() double r() double theta() double distance(point) public String tostring() } Δοµές Δεδοµένων 06-8

Αφηρηµένοι τύποι δεδοµένων Υλοποίηση 1: χρήση καρτεσιανών συντεταγµένων class Point { private double x, y; Point() { x = Math.random(); y = Math.random(); } Point(double x, double y) {this.x = x; this.y = y;} double x() { return x; } double y() { return y; } double r() { return Math.sqrt(x*x + y*y); } double theta() { return Math.atan2(y, x); } double distance(point p) { double dx = x - p.x(); double dy = y - p.y(); return Math.sqrt(dx*dx + dy*dy); } public String tostring() { return "(" + x + ","+y+")"; } } Δοµές Δεδοµένων 06-9

Αφηρηµένοι τύποι δεδοµένων Διαφορές µε πριν: Τα δεδοµένα είναι private 2 νέες µέθοδοι x(), y() Σε ιδιωτικά µέλη µπορεί να γίνει αναφορά µόνο µέσα από την ίδια την κλάση Πρόσβαση στα δεδοµένα από το πρόγραµµα πελάτη γίνεται µόνο µέσω των µεθόδων, π.χ. p.x(), p.y() Έστω τώρα ότι θέλουµε να αλλάξουµε την εσωτερική αναπαράσταση σε πολικές συντεταγµένες αντί για καρτεσιανές Πρέπει να αλλάξουν και όλα τα προγράµµατα-πελάτες? Δοµές Δεδοµένων 06-10

Αφηρηµένοι τύποι δεδοµένων Υλοποίηση 2: χρήση πολικών συντεταγµένων class Point { private double r, theta; Point() { double x = Math.random(), y = Math.random(); this = new Point(x, y); } Point(double x, double y) { r = Math.sqrt(x*x + y*y); theta = Math.atan2(y, x); } double r() { return r; } double theta() { return theta; } double x() { return r*math.cos(theta); } double y() { return r*math.sin(theta); } double distance(point p) { double dx = x() - p.x(); double dy = y() - p.y(); return Math.sqrt(dx*dx + dy*dy); } public String tostring() { return "(" + x() + ", " + y() + ")"; } } Δοµές Δεδοµένων 06-11

Αφηρηµένοι τύποι δεδοµένων Όσοι πελάτες χρησιµοποιούσαν τις x(), y() πριν, µπορούν να εξακολουθήσουν να τις χρησιµοποιούν και τώρα Καµία απολύτως αλλαγή στον κώδικα του πελάτη Μας επιτρέπει να κάνουµε αλλαγές στην αναπαράσταση προς βελτιστοποίηση της υλοποίησης Debugging χωρίς αλλαγές στους πελάτες Δοµές Δεδοµένων 06-12

Συλλογές στοιχείων Γενικευµένες ουρές: θεµελιώδεις δοµές δεδοµένων Τιµές: σύνολα αντικειµένων (άγνωστος τρόπος αποθήκευσης), µπορεί να είναι int, char, Object, Πράξεις: εισαγωγή νέου στοιχείου, αποµάκρυνση στοιχείου, έλεγχος αν το σύνολο είναι κενό Υλοποίηση µε λίστες ή πίνακες Η σηµασία της εισαγωγής είναι προφανής Αποµάκρυνση: ποιο αντικείµενο επιστρέφει η αποµάκρυνση στοιχείου; (π.χ. αυτό που έχει µείνει περισσότερη ώρα, λιγότερη ώρα, το 3 ο από το τέλος,...) Κάθε κριτήριο αποµάκρυνσης νέα δοµή δεδοµένων Δοµές Δεδοµένων 06-13

Συλλογές στοιχείων Στοίβα (Pushdown Stack) Αποµακρύνουµε το αντικείµενο που εισήχθη πιο πρόσφατα Αναλογία: πλύσιµο πιάτων, στοίβα των δίσκων στο εστιατόριο Ορολογία: push (εισαγωγή) και pop (αποµάκρυνση) Αναφέρεται και ως ουρά LIFO (Last In First Out) Δοµές Δεδοµένων 06-14

Συλλογές στοιχείων Ουρά (Queue) Αποµακρύνουµε το αντικείµενο που εισήχθη πιο παλιά Αναλογία: ουρά στο κυλικείο, σε δηµόσιες υπηρεσίες (σχεδόν...) Ορολογία: enqueue ή put (εισαγωγή) και dequeue ή get (αποµάκρυνση) Αναφέρεται συνήθως ως ουρά FIFO (First In First Out) Δοµές Δεδοµένων 06-15

Εφαρµογές µε χρήση στοίβας/ουράς Η χρήση στοίβας προσοµοιώνει την ιστορία του Θησέα µε το µίτο της Αριάδνης: κάθε εισαγωγή στη στοίβα δηλώνει ένα νέο µονοπάτι Παράδειγµα 1: Λειτουργίες Undo και Back Έστω ότι γράφετε ένα κείµενο στο OpenOffice. Κάποια στιγµή διαπιστώνετε ότι πρέπει να ακυρώσετε τις 4 τελευταίες ενέργειες που κάνατε Θέλετε να επαναφέρετε το κείµενο όπως ήταν πριν Πώς µπορεί να θυµάται το OpenOffice πώς ήταν το κείµενο πριν? Αντίστοιχο παράδειγµα σε web browsing: Πώς µπορεί ο browser να θυµάται µε αποδοτικό τρόπο ποιες ήταν οι τελευταίες k διαδοχικές σελίδες που επισκεφτήκατε? Η χρήση στοίβας είναι η πιο άµεση λύση Δοµές Δεδοµένων 06-16

Εφαρµογές µε χρήση στοίβας/ουράς Παράδειγµα 2: Βacktracking αλγόριθµοι Αλγόριθµοι που κατασκευάζουν υποψήφιες λύσεις τµηµατικά Ελέγχουν σε κάθε βήµα αν µια «µερικά σχηµατισµένη» πιθανή λύση µπορεί να επεκταθεί Αν όχι επιστρέφουν στο κοµµάτι της λύσης που δεν ευθύνεται για την αποτυχία και ξαναρχίζουν Πάλι µε χρήση στοίβας Δοµές Δεδοµένων 06-17

Εφαρµογές µε χρήση στοίβας/ουράς Παράδειγµα 2: Βacktracking αλγόριθµοι Μπορούµε να τοποθετήσουµε n βασίλισσες σε n x n σκακιέρα έτσι ώστε να µην µπορεί να επιτεθεί καµία στις υπόλοιπες? Brute force: Αν τσεκάρουµε όλους τους πιθανούς τρόπους να βάλουµε n βασίλισσες σε n x n σκακιέρα: n 2 n Για n=4 έχουµε 1820 πιθανούς τρόπους Δοµές Δεδοµένων 06-18

Εφαρµογές µε χρήση στοίβας/ουράς Παράδειγµα 2: Βacktracking αλγόριθµοι Χρειάζεται να τσεκάρουµε όλες τις 1820 πιθανές λύσεις για n=4? Παρατήρηση: Κάθε βασίλισσα πρέπει να πάει σε διαφορετική στήλη Αρκεί να κοιτάξουµε τις πιθανές αντιµεταθέσεις (permutations) n! αντιµεταθέσεις, για n=4, έχουµε 24 πιθανές λύσεις Ακόµα και στις αντιµεταθέσεις, µπορούµε εύκολα να απορρίψουµε κάποιες Δοµές Δεδοµένων 06-19

Εφαρµογές µε χρήση στοίβας/ουράς Παράδειγµα 2: Βacktracking αλγόριθµοι Πιθανός αλγόριθµος: Βάλε την 1 η βασίλισσα στην 1 η στήλη και 1 η γραµµή Βρες όλους τους επιτρεπτούς τρόπους να βάλεις τη 2 η βασίλισσα στη 2 η στήλη (γραµµές 3 ως n) Δοκίµασε 1 τέτοια θέση Βρες όλους τους επιτρεπτόυς τρόπους να βάλεις την 3 η βασίλισσα στην 3 η στήλη Δοκίµασε 1 τέτοια θέση. Αν δεν παραβιάζει κάποιο περιορισµό, τότε πήγαινε στην 4 η στήλη και βρες όλες τις επιτρεπτές θέσεις να βάλεις την 4 η βασίλισσα στην 4 η στήλη Αν αντιθέτως δεν οδηγεί σε επιτρεπτή λύση, κάνε backtrack και δοκίµασε την επόµενη επιτρεπτή θέση για την 3 η στήλη Συνέχισε έτσι... Δοµές Δεδοµένων 06-20

Q Q Q Q Q Q Q Q Δοµές Δεδοµένων 06-21

Εφαρµογές µε χρήση στοίβας/ουράς Παράδειγµα 2: Βacktracking αλγόριθµοι Ο αλγόριθµος αυτός ψάχνει λιγότερες από n! πιθανές λύσεις Για n=4, λιγότερες από 24 υποψήφιες λύσεις Υπάρχουν και πιο γρήγοροι αλγόριθµοι (πρακτικοί για πιο µεγάλες τιµές του n) Για µεγάλα n, πώς θα θυµάται ο αλγόριθµος ποιες λύσεις έχει ήδη επεξεργαστεί και ποιες όχι? Είτε κάνουµε υλοποίηση µε αναδροµή είτε χρησιµοποιούµε στοίβα για να θυµόµαστε σε ποιο βήµα είµαστε Και η αναδροµή ούτως ή άλλως κάνει χρήση στοίβας από τον compiler Δοµές Δεδοµένων 06-22

Στοίβα ώθησης προς τα κάτω Πράξεις στοίβας Pop(): αποµάκρυνση του αντικειµένου που εισήχθη τελευταίο Push(): εισαγωγή ενός αντικειµένου στη στοίβα isempty(): είναι άδεια η στοίβα; Δοµές Δεδοµένων 06-23

Στοίβα ώθησης προς τα κάτω Διεπαφή στοίβας ακεραίων Ο πελάτης µπορεί να δίνει και το µέγιστο πλήθος στοιχείων class intstack { // υλοποιήσεις και ιδιωτικά μέλη κρυμμένα intstack(int) boolean isempty() void push(int) int pop() } Δοµές Δεδοµένων 06-24

Στοίβα ώθησης προς τα κάτω Παραδείγµατα διεπαφών στοίβας class intstack { intstack(int) boolean isempty() void push(int) int pop() } Πριν δούµε υλοποιήσεις της διεπαφής, θα δούµε µερικά προγράµµατα-πελάτη class doublestack { doublestack(int) boolean isempty() void push(double) double pop() } Δοµές Δεδοµένων 06-25

Παραδείγµατα πελατών για στοίβες Πολλές σηµαντικές εφαρµογές Υπολογισµός αριθµητικών παραστάσεων Εικονική µηχανή Java Κλήσεις µεθόδων κατά την εκτέλεση ενός προγράµµατος Λειτουργίες Undo και Back Γλώσσα περιγραφής σελίδων PostScript Υπολογισµός αριθµητικών παραστάσεων Έστω ότι θέλουµε να υπολογίσουµε την παράσταση! (5 * ( ( ( 9 + 8 ) * ( 4 * 6 ) ) + 7 )) Η παράσταση αυτή είναι σε ενθεµατική µορφή (infix) Μετατροπή σε µεταθεµατική µορφή (postfix)! 5 9 8 + 4 6 * * 7 + * Κάθε τελεστής ακολουθεί τα ορίσµατά του Δεν χρειάζονται παρενθέσεις Δοµές Δεδοµένων 06-26

Παράδειγµα 3: Μετατροπή σε µεταθεµατική µορφή Μεταθεµατική αναπαράσταση Φυσικός τρόπος οργάνωσης σειράς υπολογισµών Χρησιµοποιείται και από την PostScript (παράδειγµα στο βιβλίο) Μετατροπή ενθεµατικής σε µεταθεµατική Είσοδος: µία παράσταση σε ενθεµατική µορφή Έξοδος: να τυπώσουµε την αντίστοιχη µεταθεµατική µορφή Ιδέα: χρησιµοποιούµε µία στοίβα χαρακτήρων για τους τελεστές. Όταν διαβάζουµε: Τελεστέο: εκτύπωση Τελεστή: push τελεστή στη στοίβα Αριστερή παρένθεση: δεν κάνουµε τίποτα Δεξιά παρένθεση: pop τελεστή και εκτύπωση Δοµές Δεδοµένων 06-27

Παράδειγµα 3: Μετατροπή σε µεταθεµατική µορφή Μετατροπή ενθεµατικής σε µεταθεµατική class InfixToPostfix { public static void main(string[] args) { char[] a = args[0].tochararray(); int N = a.length; charstack s = new charstack(n); for (int i = 0; i < N; i++) { if (a[i] == ')') Out.print(s.pop() + " "); if ((a[i] == '+') (a[i] == '*')) s.push(a[i]); if ((a[i] >= '0') && (a[i] <= '9')) Out.print(a[i] + " "); } Out.println(""); } } Δοµές Δεδοµένων 06-28

Παράδειγµα 4: Υπολογισµός αριθµητικής παράστασης Είσοδος: µία παράσταση σε µεταθεµατική µορφή Έξοδος: Υπολογισµός της τιµής της παράστασης Ιδέα: Χρησιµοποιούµε µία στοίβα ακεραίων για τους τελεστέους. Όταν διαβάζουµε: Τελεστέο: push τελεστέου Τελεστή: pop δύο τελεστέων, πράξη, push αποτελέσµατος Δοµές Δεδοµένων 06-29

Παράδειγµα 4: Υπολογισµός αριθµητικής παράστασης Υπολογισµός µεταθεµατικής παράστασης class Postfix { public static void main(string[] args) { char[] a = args[0].tochararray(); int N = a.length; intstack s = new intstack(n); for (int i = 0; i < N; i++) { if (a[i] == '+') s.push(s.pop() + s.pop()); if (a[i] == '*') s.push(s.pop() * s.pop()); if ((a[i] >= '0') && (a[i] <= '9')) /* Αν έχουµε >1 ψηφία θέλουµε κάτι σαν την Integer.parseint */ s.push(0); while((a[i] >= '0') && (a[i] <= '9')) s.push(10*s.pop() + (a[i++]-'0')); } Out.println(s.pop() + ""); } } Δοµές Δεδοµένων 06-30

Υλοποιήσεις στοίβας Υλοποίηση στοίβας µε πίνακα Υποθέτουµε στοίβα ακεραίων class intstack { private int[] s; private int N; //= αριθµός στοιχείων στη στοίβα intstack(int maxn) { s = new int[maxn]; N = 0; } boolean isempty() { return (N == 0); } void push(int item) { s[n++] = item; } int pop() { return s[--n]; }} Μεγέθυνση και σµίκρυνση Ιδανικά θα θέλαµε να έχουµε αυτόµατη αλλαγή µεγέθους Απλός κανόνας αλλαγής µεγέθους: Όταν ο πίνακας γεµίσει, τον διπλασιάζουµε Όταν ο πίνακας έχει πληρότητα κάτω του 25%, τον ηµιδιπλασιάζουµε Σε κάθε περίπτωση απαιτείται αντιγραφή στοιχείων Δοµές Δεδοµένων 06-31

Υλοποιήσεις στοίβας Υλοποίηση στοίβας µε λίστα Κόµβοι µε στοιχείο και δείκτη Διατηρούµε έναν δείκτη στην κεφαλή Push: εισάγει ένα στοιχείο στην αρχή Pop: αποµακρύνει ένα στοιχείο από την αρχή Σύγκριση υλοποιήσεων: Δεν απαιτείται µεγέθυνση και σµίκρυνση σε λίστες Η µεγέθυνση κοστίζει σε πίνακες Επιβάρυνση σε λίστες ο χειρισµός αναφορών Σε µνήµη και επεξεργασία Δοµές Δεδοµένων 06-32

Υλοποιήσεις στοίβας Υλοποίηση στοίβας µε λίστα class intstack { private Node head; private class Node { int item; Node next; Node(int item, Node next) { this.item = item; this.next = next; } } intstack(int maxn) { head = null; } boolean isempty() { return (head == null); } void push(int item) { head = new Node(item, head);} int pop() { int v = head.item; Node t = head.next; head = t; //head δείχνει στον επόµενο return v; } } Δοµές Δεδοµένων 06-33

Παρατηρήσεις Σχεδόν ίδιος κώδικας για στοίβες χαρακτήρων ή άλλων τύπων δεδοµένων Στην υλοποίηση µε λίστες η κατασκευάστρια µέθοδος αγνοεί την παράµετρό της Και στις 2 υλοποιήσεις, οι λειτουργίες push και pop γίνονται σε χρόνο Ο(1) (εκτός αν χρειαστεί να κάνουµε µεγέθυνση/ σµίκρυνση στην υλοποίηση µε πίνακες) Πρέπει πάντα να προσθέτουµε και τα κατάλληλα exceptions (π.χ. αν γίνει pop σε κενή στοίβα ή push σε γεµάτη στοίβα) Δοµές Δεδοµένων 06-34

Γενικές υλοποιήσεις Υλοποίηση στοίβας για διαχείριση οποιουδήποτε τύπου Χρήση του ίδιου κώδικα ως βάση Διαφοροποίηση µόνο του τύπου των στοιχείων Μπορούµε να εισάγουµε οποιοδήποτε αντικείµενο χρησιµοποιώντας τον τύπο Object Κληρονοµικότητα για µετατροπή σε άλλους τύπους class Stack { private Object[] s; private int N; Stack(int maxn) { s = new Object[maxN]; N = 0; } boolean isempty() { return (N == 0); } void push(object item) { s[n++] = item; } Object pop() { Object t = s[--n]; s[n] = null; return t; } } Δοµές Δεδοµένων 06-35

Γενικές υλοποιήσεις Περιορισµοί της χρήσης του τύπου Object Οι στοιχειώδεις τύποι θέλουν πρόσθετη µετατροπή µε χρήση κλάσεων περιτύλιξης (wrapper classes) Αντί για s.push(x) έχουµε s.push(new Integer(x)) Αντί για s.pop() έχουµε ((Integer) s.pop()).intvalue() Οι στοιχειώδεις τύποι επιβαρύνονται πολύ Αδυναµία εντοπισµού σφαλµάτων τύπου Δεν ελέγχονται οι τύποι των στοιχείων Apple a = new Apple(); Orange b = new Orange(); s.push(a); s.push(b);... a = ((Apple) s.pop()); //εξαίρεση b = ((Orange) s.pop()); - Προσοχή στις µετατροπές αντικειµένων!! Δοµές Δεδοµένων 06-36

Γενικές υλοποιήσεις Εναλλακτική λύση: Χρήση κλάσεων προσαρµογής (adapter classes) Μετατροπή της γενικής κλάσης Stack σε εξειδικευµένη Ρητή µετατροπή τύπων γίνεται στην υλοποίηση και όχι από τον πελάτη class intstack { } private Stack S; intstack(int maxn) { S = new Stack(maxN); } boolean isempty() { return S.isEmpty(); } void push(int item) { S.push(new Integer(item));} int pop() {return ((Integer) S.pop()).intValue();} Δοµές Δεδοµένων 06-37

Ουρές FIFO Αποµακρύνουµε πάντα το στοιχείο που έχει παραµείνει στην ουρά το µεγαλύτερο χρονικό διάστηµα Πράξεις ουράς Ορολογία: Get() ή Dequeue(): αποµάκρυνση του αντικειµένου που εισήχθη πρώτο Put() ή Enqueue(): εισαγωγή ενός αντικειµένου στην ουρά isempty(): είναι άδεια η ουρά; Δοµές Δεδοµένων 06-38

Ουρές FIFO Παραδείγµατα: Δροµολόγηση διεργασιών, δροµολόγηση σε δίκτυα Λίστες αναµονής Διεπαφή ουράς ακεραίων Δίνουµε και το µέγιστο µέγεθος class intqueue { intqueue(int) boolean isempty() void put(int) int get() } Δοµές Δεδοµένων 06-39

Ουρές FIFO Υλοποίηση ουράς µε λίστα Χρειαζόµαστε δύο δείκτες head: το παλιότερο στοιχείο Χρήση από την get() tail: το νεότερο στοιχείο Χρήση από την put() Δοµές Δεδοµένων 06-40

Ουρές FIFO Υλοποίηση ουράς µε λίστα class intqueue { private Node head, tail; private class Node { int item; Node next; Node(int item) { intqueue(int max) { this.item = item; next = null; } } head = null; tail = null; } boolean isempty() { return (head == null); } Δοµές Δεδοµένων 06-41

Ουρές FIFO Υλοποίηση ουράς µε λίστα void put(int item) { Node t = tail; tail = new Node(item); if (isempty()) head = tail; else t.next = tail; } int get() { int v = head.item; Node t = head.next; head = t; return v; } } Δοµές Δεδοµένων 06-42

Ουρές FIFO Υλοποίηση ουράς µε πίνακα Κοστίζει πολύ να µετακινούµε στοιχεία µέσα στον πίνακα Αντί αυτού θα µετακινούµε τους δείκτες head, tail Χρήση πίνακα N στοιχείων µε κυκλικό τρόπο Χρήση αριθµητικής modulo Τα στοιχεία της ουράς είναι από το head µέχρι το tail µε αναδίπλωση στο 0 head: δείχνει το πρώτο στοιχείο της ουράς, εκτός όταν head = N Πρώτα modulo και µετά αύξηση tail: δείχνει µετά το τελευταίο στοιχείο (εκεί που πρέπει να µπει το επόµενο) Πρώτα αύξηση και µετά modulo head % N == tail αν η ουρά είναι άδεια Πρέπει να προστεθεί και έλεγχος αν η ουρά είναι γεµάτη: (head 1) % N == tail Μεγέθυνση ουράς: αντιγραφή στοιχείων Δοµές Δεδοµένων 06-43

Ουρές FIFO Υλοποίηση ουράς µε πίνακα Μπορούµε να έχουµε και µέθοδο isfull() class intqueue { private int[] q; private int N, head, tail; intqueue(int maxn) { q = new int[maxn + 1]; N = maxn + 1; head = N; tail = 0; } boolean isempty() { return (head % N == tail); } void put(int item) { q[tail++] = item; tail = tail % N; } //όταν tail=n πάει στο 0 int get() { head = head % N; //αναδίπλωση όταν head = N return q[head++]; } } Δοµές Δεδοµένων 06-44

Αφηρηµένοι Τύποι Δεδοµένων Μέχρι τώρα έχουµε δει: Υλοποιήσεις ΑΤΔ στοίβας Υλοποιήσεις ΑΤΔ ουράς FIFO Σε κάθε πρόβληµα που έχουµε να λύσουµε είναι βολικό να υλοποιούµε ως ΑΤΔ τη δοµή που θα χρησιµοποιήσουµε Δοµές Δεδοµένων 06-45

Αφηρηµένοι Τύποι Δεδοµένων για προβλήµατα συνδετικότητας Στο Κεφάλαιο 1 είδαµε 4 αλγορίθµους για το πρόβληµα συνδετικότητας 1. Γρήγορη εύρεση 2. Γρήγορη ένωση 3. Σταθµισµένη γρήγορη ένωση 4. Σταθµισµένη γρήγορη ένωση µε συµπίεση µονοπατιών Αφαίρεση: όλοι οι παραπάνω αλγόριθµοι στηρίζονται σε λειτουργίες εύρεσης και ένωσης Δοµές Δεδοµένων 06-46

Αφηρηµένοι Τύποι Δεδοµένων για προβλήµατα συνδετικότητας Διασύνδεση για ΑΤΔ Union-Find: class UF { UF(int) boolean find(int, int) //βρίσκει αν συνδέονται 2 στοιχεία void unite(int, int) }//κανει την ένωση Υλοποίηση της διασύνδεσης στο βιβλίο Πρόγραµµα πελάτη: class connectivity { public static void main(string[] args) { int p, q, N = Integer.parseInt(args[0]); UF info = new UF(N); for (In.init();!In.empty(); ) { p = In.getInt(); q = In.getInt(); if (!info.find(p, q)) { info.unite(p, q); Out.println(p + "-" + q); } } } } Δοµές Δεδοµένων 06-47

Διασυνδέσεις ΑΤΔ Τι µηχανισµούς παρέχει η Java για το διαχωρισµό υλοποίησης/ προγραµµάτων πελάτη? 1. abstract κλάσεις Δηµόσιες µέθοδοι µιας abstract κλάσης πρέπει να επανοριστούν σε µια extended κλάση που θα κάνει την υλοποίηση 2. Interfaces Στο παράδειγµά µας µπορούµε να έχουµε: interface uf { boolean find(int p, int q); void unite(int p, int q); } Τότε η κλάση UF πρέπει να δηλωθεί ως: class UF implements uf Δεν επιτρέπονται constructors µέσα σε ορισµό interface Δοµές Δεδοµένων 06-48

Δοµές Δεδοµένων 06-49 Εφαρµογή: ΑΤΔ για πολυώνυµα Εφαρµογή: Symbolic Mathematics. Προγράµµατα σαν τα Matlab, Mathematica, Maple χρησιµοποιούν µεθόδους για διαχείριση πολυωνύµων Συµβολική επεξεργασία, π.χ.: Θέλουµε µεθόδους για Πρόσθεση πολυωνύµων Πολλαπλασιασµό πολυωνύµων Αποτίµηση ενός πολυωνύµου σε συγκεκριµένη τιµή του x ( ) 6 3 3 2 3 2 1 1 6 2 1 6 5 4 3 2 3 2 3 2 x x x x x x x x x x x + + + = + + + +

Εφαρµογή: ΑΤΔ για πολυώνυµα Διασύνδεση ΑΤΔ: class Poly { // υλοποιήσεις και ιδιωτικά µέλη κρυµµένα } Poly(int, int) //φτιάχνει το πολυώνυµο cx N double eval(double) //αποτίµηση void add(poly) //πρόσθεση πολυωνύµων void mult(poly) //πολλαπλασιασµός Δοµές Δεδοµένων 06-50

Εφαρµογή: ΑΤΔ για πολυώνυµα Πρόγραµµα υλοποίησης: Θα δούµε την eval (υπόλοιπες µέθοδοι στο βιβλίο) Εσωτερική αναπαράσταση πολυωνύµου βαθµού Ν: πίνακας Ν+1 στοιχείων µε τους συντελεστές Αποτίµηση πολυωνύµου, Απλοϊκή µέθοδος: Ο(Ν 2 ) πολλαπλ/µοί Αλγόριθµος του Horner: Ο(Ν) ((( a ) ) ) 4x + a3 x + a2 x + a1 x 0 a + 4 3 2 4x + a3x + a2x + a1x + a0 = a Δοµές Δεδοµένων 06-51

Εφαρµογή: ΑΤΔ για πολυώνυµα class Poly { private int n; //βαθµός πολυωνύµου + 1 private int[] a; //συντελεστές } Poly(int c, int N) { //δηµιουργεί το πολυώνυµο cx N a = new int[n+1]; n = N+1; a[n] = c; for (int i = 0; i < N; i++) a[i] = 0; } double eval(double d) { //υπολογισµός της double t = 0.0; //τιµής στο d for (int i = n-1; i >= 0; i--) t = t*d + (double) a[i]; return t; } Δοµές Δεδοµένων 06-52

Εφαρµογή: ΑΤΔ για πολυώνυµα Παράδειγµα προγράµµατος πελάτη: Έστω ότι θέλουµε να υπολογίζουµε τις εκφράσεις (x+1) N, π.χ. (x+1) 2 = x 2 + 2x + 1 (x+1) 4 = x 4 + 4x 3 + 6x 2 + 4x + 1 public class Binomial { //υπολογισµός (x+1) N public static void main(string[] args) { int N = Integer.parseInt(args[0]); double p = Double.parseDouble(args[1]); Poly y = new Poly(1, 0); //y=1 Poly t = new Poly(1, 0); //t=1 t.add(new Poly(1, 1)); //t = x+1 for (int i = 0; i < N; i++) y.mult(t); //y = (x+1) i+1 Out.println("value: " + y.eval(p)); } Δοµές Δεδοµένων 06-53

ΑΤΔ - Σύνοψη Επιτρέπουν το χτίσιµο επιπέδων αφαίρεσης Διαχωρισµός µεταξύ πελάτη και υλοποίησης Διευκολύνουν τη σχεδίαση modular programming Επαναχρησιµοποίηση κώδικα Βολικός µηχανισµός για τη σύγκριση αλγορίθµων Δοµές Δεδοµένων 06-54