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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

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

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

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

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

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

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

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

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

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

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

Διάλεξη 15: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

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

Λίστες (Lists) Ορέστης Τελέλης. Τµήµα Ψηφιακών Συστηµάτων, Πανεπιστήµιο Πειραιώς

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

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

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

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

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

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

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

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Quicksort Κεφάλαιο 7. Ε. Μαρκάκης Επίκουρος Καθηγητής

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

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

Wrapper Classes, Abstract Classes and Interfaces

Βασικές Δοµές Δεδοµένων. Σύντοµη επανάληψη (ΕΠΛ 035).

Δοµές Δεδοµένων. 18η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

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

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας

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

Δομές Δεδομένων & Αλγόριθμοι. Στοίβες. Εργαστήριο Γνώσης & Ευφυούς Πληροφορικής 1

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

public class ArrayStack implements Stack {

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

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Δοµές Δεδοµένων. 12η Διάλεξη Διάσχιση Δέντρων και Ουρές Προτεραιότητας. Ε. Μαρκάκης

Δομές Δεδομένων - Εργαστήριο 5. Ουρές Προτεραιότητας

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

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

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

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

4 ΔYNAMIKEΣ ΔOMEΣ ΔEΔOMENΩN

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

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

Transcript:

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

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

Υπενθύµιση από προηγούµενο µάθηµα Πράξεις στοίβας - Ορολογία Pop(): αποµάκρυνση και επιστροφή του αντικειµένου που εισήχθη τελευταίο Push(): εισαγωγή ενός αντικειµένου στη στοίβα isempty(): είναι άδεια η στοίβα; Διεπαφή στοίβας ακεραίων ή χαρακτήρων Ο πελάτης µπορεί να δίνει και το µέγιστο πλήθος στοιχείων class intstack { // υλοποιήσεις και ιδιωτικά //μέλη κρυμμένα intstack(int) boolean isempty() void push(int) int pop() } class charstack { charstack(int) boolean isempty() void push(char) char pop() } Δοµές Δεδοµένων 07-3

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

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

Παράδειγµα 1: Μετατροπή σε µεταθεµατική µορφή Μετατροπή ενδοθεµατικής σε µεταθεµατική 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(""); } } Δοµές Δεδοµένων 07-6

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

Παράδειγµα 2: Υπολογισµός αριθµητικής παράστασης Υπολογισµός µεταθεµατικής παράστασης 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() + ""); } } Δοµές Δεδοµένων 07-8

Υλοποιήσεις στοίβας Υλοποίηση στοίβας µε πίνακα Υποθέτουµε στοίβα ακεραίων 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]; }} Μεγέθυνση και σµίκρυνση Ιδανικά θα θέλαµε να έχουµε αυτόµατη αλλαγή µεγέθους Απλός κανόνας αλλαγής µεγέθους Όταν ο πίνακας φτάσει στο 100%, τον διπλασιάζουµε Όταν ο πίνακας πέσει στο 25%, τον ηµιδιπλασιάζουµε Σε κάθε περίπτωση απαιτείται αντιγραφή στοιχείων Δοµές Δεδοµένων 07-9

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

Υλοποιήσεις στοίβας Υλοποίηση στοίβας µε λίστα 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; } } Δοµές Δεδοµένων 07-11

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

Γενικές υλοποιήσεις Υλοποίηση στοίβας για διαχείριση οποιουδήποτε τύπου Χρήση του ίδιου κώδικα ως βάση Διαφοροποίηση µόνο του τύπου των στοιχείων Μπορούµε να εισάγουµε οποιοδήποτε αντικείµενο χρησιµοποιώντας τον τύπο 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; } } Δοµές Δεδοµένων 07-13

Περιορισµοί του τύπου 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()); Δοµές Δεδοµένων 07-14

Γενικές υλοποιήσεις Εναλλακτική λύση: Χρήση κλάσεων προσαρµογής (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();}} Δοµές Δεδοµένων 07-15

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

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

Ουρές FIFO Υλοποίηση ουράς µε λίστα Χρειαζόµαστε δύο δείκτες head: το παλιότερο στοιχείο Χρήση από την get() tail: το νεότερο στοιχείο Χρήση από την put() Ορισµός κόµβων λίστας Εσωτερική τάξη της ουράς private class Node { int item; Node next; Node(int item) { this.item = item; next = null; } } Δοµές Δεδοµένων 07-18

Ουρές FIFO Υλοποίηση ουράς µε λίστα class intqueue { private Node head, tail; intqueue(int max) { head = null; tail = null; } boolean isempty() { return (head == null); } 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; } } Δοµές Δεδοµένων 07-19

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

Ουρές 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++]; } } Δοµές Δεδοµένων 07-21

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

Αφηρηµένοι Τύποι Δεδοµένων για προβλήµατα συνδετικότητας Διασύνδεση για ΑΤΔ 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); } } } } Δοµές Δεδοµένων 07-23

Αφηρηµένοι Τύποι Δεδοµένων για προβλήµατα συνδετικότητας Υλοποίηση του ΑΤΔ UF µε σταθµισµένη γρήγορη ένωση class UF { private int[] id, sz; private int find(int x) //βρίσκει τη ρίζα του x { while (x!= id[x]) x = id[x]; return x; } UF(int N) { id = new int[n]; sz = new int[n]; for (int i = 0; i < N; i++) { id[i] = i; sz[i] = 1; } } boolean find(int p, int q) //ελέγχει αν p,q συνδέονται { return (find(p) == find(q)); } void unite(int p, int q) { int i = find(p), j = find(q); if (i == j) return; if (sz[i] < sz[j]) { id[i] = j; sz[j] += sz[i]; } else { id[j] = i; sz[i] += sz[j]; } } } Δοµές Δεδοµένων 07-24

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