Το ισχυρό πλεονέκτηµα των απλών µη ταξινοµηµένων πινάκων που είναι η γρήγορη εισαγωγή, αναιρείται αν απαγορεύονται τα διπλότυπα.



Σχετικά έγγραφα
Δομές Δεδομένων & Αλγόριθμοι

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

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

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

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

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

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

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

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

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

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

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

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

ΔυαδικάΔΕΝΔΡΑΑναζήτησης

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

Συνδεδεμένη Λίστα ΣΛ null VK 23

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

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

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

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

υαδικό έντρο Αναζήτησης (BSTree)

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

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

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

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

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

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

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

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

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

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

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

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

Διδάσκων: Κωνσταντίνος Κώστα

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

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

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

ιαφάνειες παρουσίασης #10 (β)

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

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

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

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

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

6η Διάλεξη Διάσχιση Γράφων και Δέντρων

Αφηρημένες Δομές Δεδομένων. Στοίβα (Stack) Υλοποίηση στοίβας

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

οµές εδοµένων 3 ο Εξάµηνο ΕΝΟΤΗΤΑ 4 ΕΝ ΡΑ

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

Δένδρα. Μαθηματικά (συνδυαστικά) αντικείμενα. Έχουν κεντρικό ρόλο στην επιστήμη των υπολογιστών :

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

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

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

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

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Προγραµµατισµός Ι (ΗΥ120)

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

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

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

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

public class ArrayStack implements Stack {

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

ένδρα (tail, head) Γονέας Παιδί (ancestor, descendant) Φύλλο Εσωτερικός Κόµβος (leaf, non-leaf) που αποτελεί το γονέα του v.

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

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΔΕΝΤΡΑ (TREES) B C D E F G H I J K L M

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

8.6 Κλάσεις και αντικείμενα 8.7 Δείκτες σε γλώσσα μηχανής

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

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

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

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

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

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

Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Week. 6: Java Collections

ένδρα u o Κόµβοι (nodes) o Ακµές (edges) o Ουρά και κεφαλή ακµής (tail, head) o Γονέας Παιδί Αδελφικός κόµβος (parent, child, sibling) o Μονοπάτι (pat

Επιµέλεια Θοδωρής Πιερράτος

#2 Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα

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

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

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

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

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

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

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

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

Κεφάλαιο 10 Ψηφιακά Λεξικά

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

ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ

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

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

Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον υποδειγματική διδασκαλία Κεφ. 3 Δομές Δεδομένων & αλγόριθμοι

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

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

ΑΛΓΟΡΙΘΜΟΙ ΜΕ C. ΝΙΚΟΛΑΟΣ ΣΑΜΑΡΑΣ Αναπληρωτής Καθηγητής. CMOR Lab. Computational Methodologies and Operations Research

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ (ΠΑΤΡΑ) ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

Transcript:

Πίνακες Η πιο βασική δοµή αποθήκευσης δεδοµένων Υποστηρίζεται από όλες τις γλώσσες προγραµµατισµού Συνεχόµενες θέσεις στην κύρια µνήµη Προσπέλαση µέσω δείκτη Στατική δοµή το µέγεθος ορίζεται εξαρχής και δεν αλλάζει. Λειτουργίες επί Πινάκων Μη ταξινοµηµένοι Γραµµική αναζήτηση Ο(n) Εισαγωγή Αν επιτρέπονται διπλότυπα, O(1). //δεν ψάχνει ιαγραφή Ο(1) ιατήρηση σειράς Μετατόπιση, O(n) Ταξινοµηµένοι υαδική αναζήτηση O(lgn) Εισαγωγή O(n) Εύρεση σωστής θέσης Μετατόπιση στοιχείων ιαγραφή O(n) Υποχρεωτικά µετατόπιση Το ισχυρό πλεονέκτηµα των απλών µη ταξινοµηµένων πινάκων που είναι η γρήγορη εισαγωγή, αναιρείται αν απαγορεύονται τα διπλότυπα. Σε αυτή την περίπτωση, πριν την εισαγωγή επιβάλλεται αναζήτηση, άρα σε αυτή την περίπτωση η χρήση ταξινοµηµένων πινάκων είναι µονόδροµος. Συγχώνευση ταξινοµηµένων πινάκων µε merge sort. Μειονεκτήµατα Πινάκων Για να αλλάξει το µέγεθός τους απαιτείται να ξαναφτιαχτούν. Όσο είναι άδειοι, έχουµε σπατάλη. Όταν γεµίσουν, πρέπει να δεσµευτεί άλλος χώρος, να γίνει αντιγραφή και να αποδεσµευτεί ο αρχικός χώρος. Όχι καλές επιδόσεις για την αναζήτηση. ιεπαφή ΑΤ Πίνακας public interface ArrayInterface { public int isin (Object element); public void add (Object element) throws Exception ; public void remove (Object element); Το interface είναι ένα καλούπι που το υπακούουν υποχρεωτικά οι κλάσεις που το υλοποιούν. Χρησιµοποιώ τον τύπο δεδοµένων Object γιατί έτσι µπορώ να φτιάξω πίνακες που να περιέχουν οποιοδήποτε αντικείµενο στις θέσεις τους. Αυτό σηµαίνει ότι µπορώ να φτιάξω πίνακες String, κλπ, αλλά ΕΝ µπορώ να φτιάξω πίνακες ακεραίων int µπορώ Integer. Εκτός από το όνοµα της λειτουργίας του ΑΤ που υλοποιεί µια µέθοδος στο interface, καθορίζονται οι είσοδοι, οι έξοδοι της µεθόδου (όνοµα, τύπος και συνοπτική περιγραφή µε javadoc) και οι εξαιρέσεις που µπορεί να εγερθούν. [1]

Στοίβες Πώς Λειτουργεί µια Στοίβα Βγαίνει πρώτος, αυτός που µπήκε τελευταίος. LIFO = Last In First Out Παραδείγµατα χρήσης: Πιάτα στο ντουλάπι Οπισθοδρόµηση σε επισκέψεις ιστοσελίδων Αναίρεση / Επανάληψη επεξεργασίας Αποθηκεύει κάθε είδους αντικείµενο Κύριες λειτουργίες: void push(object): εισάγει στοιχείο στη στοίβα Object pop(): αφαιρεί το στοιχείο που µπήκε τελευταίο boolean isempty(): είναι η στοίβα άδεια; Εξαίρεση εγείρεται όταν προσπαθήσουµε να αφαιρέσουµε από άδεια στοίβα. Βοηθητικές λειτουργίες: Object top(): επιστρέφει το τελευταίο στοιχείο χωρίς να το αφαιρεί από τη στοίβα int size(): επιστρέφει το πλήθος των αποθηκευµένων στοιχείων Άρα τα περιεχόµενα µιας στοίβας δεν είναι απαραίτητο να είναι οµοιογενή, πχ όλα String. Μπορεί Integer, BankAccount, Array, κλπ. ιεπαφή Στοίβας public interface Stack extends DataStructure { public void push(object element) throws StructureFullException; public Object pop() throws StructureEmptyException; public boolean isempty() Παραλείπεται (και εννοείται) ο κατασκευαστής µιας νέας άδειας στοίβας. Χρησιµοποιώντας τις τρεις βασικές µεθόδους της διεπαφής, υλοποιούνται οι λειτουργίες: public Object top() που επιστρέφει το στοιχείο που βρίσκεται στην κορυφή της στοίβας, χωρίς να το αφαιρεί. (peek στη Java) public int size() που επιστρέφει το πλήθος των στοιχείων που βρίσκονται µέσα στη στοίβα. [Θα χρειαστεί να δηµιουργήσετε άλλη µια στοίβα.] Τα στοιχεία της στοίβας είναι τύπου Object bar PC=1 m=6 Κλήσεις Μεθόδων (συναρτήσεων) main() { int i = 5;foo(i); foo(int j) {int k; k = j+1; bar(k); //µέθοδος foo bar(int m) { //µέθοδος bar Όταν καλείται µια µέθοδος, εισάγεται στη στοίβα µια εγγραφή µε Τοπικές µεταβλητές και αποτέλεσµα Μετρητής προγράµµατος (PC): ποια είναι η εντολή που εκτελείται. foo PC=3 j=5 k=6 main PC=2 i=5 [2]

Όταν µια µέθοδος επιστρέφει, η εγγραφή της αφαιρείται από τη στοίβα και η εκτέλεση συνεχίζεται στη µέθοδο που είναι στην κορυφή της στοίβας. Υλοποίηση Στοίβας Ένας πίνακας S και µια µεταβλητή t που δείχνει στο στοιχείο του πίνακα που αποθηκεύει την κορυφή της στοίβας. Αρχικά t = 0. Ο πίνακας ξεκινά να γεµίζει από το στοιχείο µε δείκτη 0. Στην κατασκευή της στοίβας, δηλώνεται το µέγεθος Ν (default capacity) του πίνακα. Όλες οι µέθοδοι λειτουργούν σε σταθερό χρόνο Ο(1). Απαιτείται χώρος Ο(Ν), όπου Ν είναι το µέγεθος του πίνακα (και µέγιστο µέγεθος της στοίβας). Έτοιµο στη Java ως κλάση java.util.stack Η υλοποίηση αυτή µπορεί να εγείρει την εξαίρεση StackFullException, όταν υπερβούµε το µέγεθος του πίνακα N. Αυτό το σφάλµα δεν είναι ενδογενές του ΑΤ, αλλά εµφανίζεται στη συγκεκριµένη υλοποίηση µε πίνακες. Σε άλλες υλοποιήσεις (µε δυναµικά µεταβαλλόµενο µέγεθος αποθηκευτικού χώρου) που δεν παρουσιάζουν αυτή την εξαίρεση. Επιδόσεις & Περιορισµοί Επιδόσεις Έστω n το πλήθος των στοιχείων στη στοίβα Απαιτούµενος χώρος O(n) Κάθε λειτουργία τρέχει σε χρόνο O(1) Περιορισµοί Το µέγιστο µέγεθος της στοίβας πρέπει να δηλωθεί εκ των προτέρων (κατά την κατασκευή της) και δεν µπορεί να αλλάξει. Αν προσπαθήσουµε να εισάγουµε στοιχείο σε µια πλήρη στοίβα, θα προκληθεί εξαίρεση. Κανονικά, στην υλοποίηση αυτή που περιγράψαµε πρέπει να προστεθούν οι εξής µέθοδοι: boolean IsFull() int maxsize() [3]

Ουρές Πώς Λειτουργεί µια Ουρά Βγαίνει πρώτος, αυτός που µπήκε πρώτος. FIFO = First In First Out Παραδείγµατα χρήσης: Σειρά αναµονής για εξυπηρέτηση Αυτοκίνητα σε πάρκινγκ µε µια είσοδο/έξοδο Ουρά ως ΑΤ Εισαγωγές και διαγραφές ακολουθούν FIFO. Μέγεθος ουράς απεριόριστο Τύπος στοιχείων οποιοσδήποτε Βασικές λειτουργίες: enqueue (object): εισάγει στοιχείο στο πίσω µέρος της ουράς Object dequeue(): αφαιρεί και επιστρέφει το στοιχείο στην κορυφή της ουράς Λειτουργίες σε Ουρές Βοηθητικές λειτουργίες Object front(): επιστρέφει το στοιχείο στην κορυφή, χωρίς να το αφαιρεί int size(): πλήθος στοιχείων boolean isempty(): είναι άδεια η ουρά; Εξαιρέσεις Προσπάθεια εκτέλεσης της dequeue ή της front σε µια άδεια ουρά προκαλεί έγερση της EmptyQueueException ιεπαφή Ουράς public interface Queue extends DataStructure { public void enqueue ( Object element ) throws StructureFullException ; public Object dequeue ( ) throws StructureEmptyException ; public Object front ( ) throws StructureEmptyException ; public int size(); public boolean isempty(); Εφαρµογές για Ουρές Λίστες αναµονής Προσπέλαση σε διαµοιραζόµενους πόρους Παράδειγµα: δικτυακός εκτυπωτής που εξυπηρετεί πολλούς χρήστες. Ουρά µε Πίνακα Πίνακας µεγέθους N µε κυκλικό τρόπο Μεταβλητές διατηρούν κορυφή και οπίσθια f first δείχνει στο πρώτο στοιχείο r last δείχνει αµέσως µετά το τελευταίο στοιχείο Η θέση r του πίνακα παραµένει κενή. Αρχικά f = r ( άδεια ουρά ) [4]

Τρόπος Λειτουργίας Χρησιµοποιούµε τον τελεστή modulo (υπόλοιπο ακέραιας διαίρεσης) Algorithm size() return ( N - (f r ) ) mod N Algorithm isempty() return (f == r) //return (r-f) //size()==0 Εισαγωγή / ιαγραφή σε Ουρά. Algorithm enqueue(o) if size() = N 1 then //isfull() throw FullQueueException else Q[r] o //if (last==n) align() r (r + 1) mod N //Q[r++]=o Algorithm dequeue() if isempty() then throw EmptyQueueException else o Q[f] //o=q[f++] f (f + 1) mod N return o ΕΙΚΟΝΙΚΗ ΥΠΕΡΧΕΙΛΙΣΗ (ΕΥ) To isfull() ορίζεται σαν size() == Q.length Eικονική Υπερχείλιση έχω όταν βάζοντας στοιχεία φθάνω στο last=q.length αλλά δεν είναι γεµάτος ο πίνακας µου. Τότε πρέπει να γίνει ευθυγράµµιση alignment() (τα σπρώχνω στο 0) [5]

Λίστες Απλά & διπλά συνδεδεµένες Αντιµετωπίζει το πρόβληµα του στατικού µεγέθους των πινάκων. Υλοποιεί δυναµική εκχώρηση µνήµης: δεσµεύεται ακριβώς όση µνήµη χρησιµοποιείται. Απλά Συνδεδεµένη Λίστα (ΑΣΛ) Αλυσίδα κόµβων που ο καθένας παραπέµπει στον επόµενό του Ο κάθε κόµβος έχει δύο τµήµατα: data: περιέχει είτε τα δεδοµένα, είτε µια αναφορά προς τα δεδοµένα. next: περιέχει µια αναφορά προς τον επόµενο κόµβο της λίστας. Ο τελευταίος κόµβος το έχει null. Χρειάζεται να διατηρούµε µια αναφορά προς τον πρώτο κόµβο της λίστας. Χαρακτηριστικά Λιστών Καλύτερη χρησιµοποίηση (utilization) χώρου Εκχωρείται όσος χρησιµοποιείται, αλλά χρειάζεται χώρος για αποθήκευση συνδέσµου. Καθυστέρηση εξαιτίας δυναµικής δέσµευσης και αποδέσµευσης χώρου Στους πίνακες η δέσµευση γίνεται µια φορά στην αρχή και η αποδέσµευση στο τέλος. Στους αναπτυσσόµενους / συρρικνούµενους υπάρχει κόστος διαχείρισης, όταν το µέγεθος µεταβάλλεται σηµαντικά Πότε Χρησιµοποιούµε Λίστες; Όταν ενδιαφερόµαστε κυρίως να διαπερνούµε γραµµικά µια συλλογή στοιχείων Αντιπαράθεση: τυχαία προσπέλαση στο i-οστό στοιχείο καλύτερα πίνακας Όταν θέλουµε να αλλάζουµε συχνά τη σειρά των στοιχείων και η µετακίνησή τους κοστίζει. Όταν θέλουµε να διατηρούµε πολλαπλές ταξινοµήσεις των ίδιων στοιχείων Πχ ταξινόµηση υπαλλήλου µε ΑΜ, επώνυµο & όνοµα, τµήµα, κλπ Οι πληροφορίες ενός κόµβου δεν είναι πάντα κάτι τόσο απλό ή τόσο µικρό όσο ένας αριθµός. Πχ θα µπορούσε να είναι τα µισθολογικά στοιχεία υπαλλήλων. Μπορεί να θέλουµε να εκτελούµε αναζητήσεις µε βάση το ονοµατεπώνυµό τους, τον αριθµό µητρώου τους, την ηµεροµηνία γέννησής τους ή την θέση τους στη διοικητική ιεραρχία [6]

Τότε τοποθετούµε τα πρωτογενή στοιχεία σε συνεχόµενες θέσεις ενός πίνακα µε µια πχ τυχαία σειρά, και έπειτα φτιάχνουµε πίνακες ακεραίων που αποθηκεύουν δείκτες του πίνακα που περιέχει τα πρωτογενή στοιχεία µε τη σειρά του χαρακτηριστικού που επιθυµούµε. Μπορούµε βέβαια να έχουµε όσους τέτοιους πίνακες θέλουµε. Όταν αλλάζει ένα στοιχείο ενός υπαλλήλου χρειάζεται να ενηµερώσουµε τον πίνακα που διατηρεί την ταξινόµηση µε βάση αυτό το στοιχείο. Υλοποίηση Κόµβου ( public class Node { //class ListNode private Object data; // item private Node next; // nextnode public Node() { this(null, null); public Node(Object d, Node n) { data = d; next = n; //µέθοδοι get και set Eισαγωγή Στοιχείου στην Αρχή ΑΣΛ (insertfirst) 1. Κατασκευή κόµβου: γέµισµα data, next = head 2. Eνηµέρωση head 1: x = new Node( Baltimore, head) 2: head = x Eισαγωγή Στοιχείου στο τέλος ΑΣΛ (insertlast) ιατηρούµε άλλον ένα δείκτη στο τέλος της λίστας για να µην χρειάζεται να την διατρέχουµε. 1: x=new Node( Zurich, null) 2: tail.next=x 3: tail=x Aν διατηρείται µετρητής των κόµβων (counter) ενηµερώνεται counter++ [7]

ιαγραφή Στοιχείου στην Αρχή ΑΣΛ (removefirst) 1. Eνηµέρωση head 1: x = head 2: head = x.next ιαγραφή Στοιχείου στο τέλος ΑΣΛ (removelast) 1. Εστω x o προηγούµενος κόµβος του tail 2. x.next=null 3. Eνηµέρωση tail 1: x=head 2: while ( x.next!= tail ) x=x.next 3. x.next=null 4. tail= x Aν διατηρείται µετρητής των κόµβων (counter) ενηµερώνεται counter-- Αναζήτηση σε ΑΣΛ function efind (Node n, element x) { while ( n <> null ) //επανάληψη if (n. data == x) return true else n = n.next //επόµενος κόµβος return false function rfind(node n, element x) { if (n == null) return false else if (n.data = x) return true else rfind(n.next, x) //αναδροµή Συνένωση ΑΣΛ function concat (list x, list y) { //ΑΝ Ε if (x = null) x = y // κενή λίστα [8]

else { t = x.head while (t.next <> null) // διαπέραση t = t.next t.next = y.head // τελευταίος κόµβος της x δείχνει στο 1 ο της y. Επιδόσεις ΑΣΛ Εισαγωγή στην αρχή Ο(1) ιαγραφή στην αρχή Ο(1) Εισαγωγή στο τέλος Ο(1) Εάν διατηρούµε για τη λίστα τον αρχικό και τον τελικό κόµβο της ιαγραφή στο τέλος Ο(1) Φτάνει να µην χρειάζεται να διατηρούµε τον τελικό κόµβο της λίστας - αλλιώς απαιτείται διαπέραση Ο(n) Αναζήτηση στοιχείου Ο(n) Στοίβες & Ουρές µε ΑΣΛ Στοίβα: Στο head της λίστας είναι η κορυφή της στοίβας - όλες οι λειτουργίες σε Ο(1) Ουρά: Χρησιµοποιούµε την παραλλαγή της ΑΣΛ µε δείκτες στον πρώτο και στον τελευταίο κόµβο της. Στο head της λίστας γίνονται οι διαγραφές και στο tail οι ενθέσεις - όλες οι λειτουργίες σε Ο(1) Σηµείωση: Ανατρέξτε και στις σηµειώσεις της Θεωρίας σελ. 55-59 Αναστροφή ΑΣΛ static Node reverse (Node x) { Node t, y = x, r = null; while (y!= null) { t = y.next; y.next = r; r = y; [9]

y = t; return r; Απαιτείται να διατηρούµε συνδέσµους προς τρεις συνεχόµενους κόµβους: r δείχνει προς την ήδη ανεστραµµένη λίστα y το τµήµα της λίστας που έπεται t o δεύτερος κόµβος της µη ανεστραµµένης λίστας ιπλά Συνδεδεµένες Λίστες ( ΣΛ) Χρήση για διπλοουρές (dequeues): Ένθεση & διαγραφή και από τα δύο άκρα ιαπέραση και προς τις δύο κατευθύνσεις. Ειδικοί «άδειοι» κόµβοι για αρχή / τέλος Αν υλοποιήσουµε dequeues µε ΑΣΛ, τότε οι µισές λειτουργίες θα απαιτούν Ο(n), γι αυτό καταφεύγουµε στις ΣΛ που επιτυγχάνουν όλες τις λειτουργίες σε Ο(1) µε µεγαλύτερη πολυπλοκότητα. Για πρακτικούς λόγους συνήθως τα όρια των ΣΛ ορίζονται µε δύο ειδικούς κόµβους και χρησιµοποιείται και µια µεταβλητή size που µετράει τους νόµιµους κόµβους. Κυκλικές Λίστες Παραλλαγή διπλά διασυνδεδεµένης λίστας εν χρησιµοποιούµε ειδικούς κόµβους αρχής / τέλους. [10]

έντρα υαδικά έντρα Αναζήτησης Ιεραρχικός Μη γραµµικός τύπος δεδοµένων Γονέας Παιδιά Αδέλφια: κόµβοι µε κοινό πατέρα Πρόγονοι Απόγονοι Ο γραµµικός χρόνος που απαιτούν οι διασυνδεδεµένες λίστες µπορεί να βελτιωθεί σε Ο(lgn) µε χρήση δέντρων. Οι κόµβοι ενός δέντρου συνδέονται µε πολύ πλουσιότερες σχέσεις από το «προηγούµενος» - «επόµενος» των γραµµικών δοµών δεδοµένων. Υποστηρίζουν και γραµµικότητα... Ταξινοµηµένο δέντρο, όπου κάθε κόµβος έχει το πολύ δύο παιδιά, το αριστερό και το δεξί. Μπορεί να έχει και ένα µόνον παιδί. [11]

Αριθµητικές Παραστάσεις Εσωτερικοί κόµβοι είναι πράξεις. Εξωτερικοί κόµβοι (φύλλα) είναι τιµές. ((((3+1)*3)/((9-5)+2))-((3*(7-4))+6)) Το σχήµα απεικονίζει µια αριθµητική παράσταση µε δυαδικούς τελεστές (γνήσιο δυαδικό δέντρο). Αν επιτρέψουµε και µοναδιαίους τελεστές, τότε το δέντρο είναι δυαδικό, αλλά όχι απαραίτητα γνήσιο. Για τριαδικούς κλπ τελεστές χρειαζόµαστε αντίστοιχα τριαδικά, κοκ δέντρα. Μέθοδοι έντρων data(): επιστρέφει τα δεδοµένα ενός κόµβου //getnodeitem() root(): επιστρέφει τη ρίζα ενός δέντρου parent(): επιστρέφει τον πατέρα του κόµβου children(): επιστρέφει τα παιδιά του κόµβου Για δυαδικά δέντρα left(), right() //getleftnode(),getrightnode() isinternal(), isexternal(), isroot(): βοηθητικές // isleaf() size(), elements(): βοηθητικές [12]

Βάθος Κόµβου Η απόστασή του από τη ρίζα. Ισούται µε το πλήθος των προγόνων του κόµβου. Aλγόριθµος depth (tree, node) //επιστρέφει το βάθος του κόµβου node στο δέντρο tree if isroot(tree, node) return 0 //κόµβος είναι ρίζα του δέντρου else //το βάθος του πατέρα προσαυξηµένο κατά 1 return 1+depth(t, t.parent(n)) //ανεβαίνει ένα επίπεδο //private int depth(treenode node, Comparable item) Ύψος Κόµβου & έντρου 3 Ύψος ενός κόµβου είναι η απόστασή του από το µακρινότερο παιδί του. Αναδροµικός υπολογισµός: το µέγιστο από τα ύψη των παιδιών του προσαυξηµένο κατά 1. Ύψος ενός δέντρου είναι το ύψος της ρίζας του. [13]

ιαπέραση έντρου (traversal) Ένας συστηµατικός τρόπος επίσκεψης όλων των κόµβων του δέντρου Συνήθως ορίζεται αναδροµικά. 4 τρόποι διαπέρασης: Εσωδιάταξη Προδιάταξη Μεταδιάταξη ιάταξη κατά επίπεδα Προδιάταξη έντρου (Preorder traversal) Επισκεπτόµαστε τον πατέρα και µετά τα παιδιά του. Εφαρµόζουµε αυτόν τον κανόνα αναδροµικά στα υποδέντρα. Μεταδιάταξη έντρου Postorder traversal Επισκεπτόµαστε όλα τα παιδιά πριν επισκεφθούµε τον πατέρα τους. Εσωδιάταξη έντρου Inorder traversal Ορίζεται µόνον για δυαδικά δέντρα. Επισκεπτόµαστε πρώτα το αριστερό παιδί, µετά τον πατέρα και τέλος το δεξί παιδί. Inorder Traversal : 3 6 7 8 9 10 14 υαδικά έντρα Αναζήτησης ( Α) (binary search tree) Κάθε κόµβος είναι µεγαλύτερος των κόµβων του αριστερού του κλάδου και µικρότερος των κόµβων του δεξιού του κλάδου. Το µικρότερο στοιχείο (το 3), βρίσκεται πάντα στον πιο αριστερό κόµβο: while (node.getleftnode()!=null) node = node.getleftnode(); Το µεγαλύτερο στοιχείο (το 14), βρίσκεται πάντα στον πιο δεξιό κόµβο: while (node.getrightnode()!=null) node = node.getrightnode(); Όταν διαπεραστούν µε εσωδιάταξη (πατέρας, αριστερό, δεξί), εµφανίζονται τα στοιχεία ταξινοµηµένα σε αύξουσα σειρά. [14]

Εισαγωγή σε έντρα Αναζήτησης ιατρέχει το δέντρο από τη ρίζα προς τα κάτω (επιλέγοντας αριστερό ή δεξί παιδί) µέχρι να φτάσει σε κάποιο φύλλο και εκεί εισάγει. Άρα επίδοση Ο(h), όπου h το ύψος του δέντρου. Χειρότερη περίπτωση: h = O(n) µακρόστενο δέντρο //εισάγει νέο κόµβο µε πληροφορία x στο κόµβο node Aλγόριθµος insert(node,x) //εισάγει και διπλότυπα if node = null then node = new Node(x, null, null) //κατασκευή else //ψάξε παρακάτω (στα παιδιά) if x < node.data insert(node.left,x) else insert(node.right,x) ιαγραφή σε έντρα Αναζήτησης //διαγραφή κόµβου µε x στο δέντρο t Αλγόριθµος Node remove (node,x) if x = null return(node) //δεν βρέθηκε µην κάνεις τίποτα elseif x<node.data node.left = remove(node.left,x) //ψάξε elseif x>node.data node.right=remove(node.right,x) //ψάξε else //βρήκαµε τον κόµβο που θα διαγράψουµε if node.left = null node = node.right //µόνο δεξί παιδί elseif node.right=null node = node.left //µόνο αριστερό παιδί else //δύο παιδιά //βρες το µικρότερο κόµβο του δεξιού υποδέντρου node.data = findmin(node.right).data node.right = remove(node.right,node.data) //σβήσε το µικρό //Αυτός ο αλγόριθµος βάζει το 12 στην θέση του 10. Αφήνει άγγιχτο το αριστερό του υποδέντρο και βρίσκει το µικρότερο κόµβο του δεξιού του υποδέντρου που τον τοποθετεί σε θέση του προς διαγραφή κόµβου. Έπειτα πρέπει να αφαιρεθεί από το υποδέντρο ο κόµβος που ανεβάστηκε για να µην εµφανίζεται δύο φορές. [15]

(Κατ αναλογία, θα µπορούσαµε να αφήσουµε άγγιχτο το δεξί υποδέντρο και να βρούµε το µεγαλύτερο κόµβο του αριστερού...) //BAΘΟΣ ΜΟΝΟ για δυαδικά δένδρα αναζήτησης private int depth(treenode node, Comparable item) { if ( item.compareto( node.getnodeitem() )< 0 ) //move left return 1+depth ( node.getleftnode(),item ); else if (item.compareto(node.getnodeitem())> 0) //move right return 1+depth ( node.getrightnode(),item); else return 0; //if ( item.compareto( node.getnodeitem() )== 0 ) έντρα AVL Α όπου για κάθε κόµβο το ύψος του αριστερού και το δεξιού του παιδιού διαφέρουν το πολύ κατά 1. Παρότι δεν είναι πλήρη, έχουν ύψος 1,44lg(n + 2)-0,328 Όλες οι λειτουργίες σε Ο( lgn ) [16]

ιαπέραση κ ατά Επίπεδα Αλγόριθµος diaperasikataepipeda (node) //αν ξεκινήσουµε π.χ. από το κόµβο 3 διαπέραση του υποδένδρου 3 Q.enqueue(node) //τοποθέτησε στην ουρά Q while (!Q.isEmpty()) //ενόσω η ουρά δεν είναι άδεια { w = Q.dequeue() //κάνε ό,τι θέλεις µε το w Q.enqueue(child) //για κάθε ένα παιδί child του w Υπολογιζόµενες Ιδιότητες έντρων Ο συντελεστής ισορροπίας ενός κόµβου είναι η διαφορά του ύψους του δεξιού και του αριστερού του υποδέντρου. Κοντινότερος κοινός πρόγονος δύο κόµβων Η απόσταση δύο κόµβων είναι το πλήθος των ακµών αναµεταξύ τους. Η µέγιστη απόσταση ανάµεσα σε οποιουσδήποτε κόµβους καλείται διάµετρος του δέντρου. [17]

Μέθοδοι του ΑΤ Γράφηµα Για µη κατευθυνόµενα γραφήµατα vertices() : απαριθµητής κορυφών γραφήµατος edges() : απαριθµητής ακµών γραφήµατος incidentedges(v) : απαριθµητής ακµών που άπτονται της κορυφής v endvertices(e) : ζευγάρι κορυφών που συνδέει η ακµή e Επιστρέφει πίνακα δύο στοιχείων ευτερεύουσες Μέθοδοι Χρησιµοποιώντας τις προηγούµενες, υλοποιήστε: numvertices(), numedges() : πλήθος degree(v), opposite(v,e), adjacentvertices(v), areadjacent(v,w) function int numvertices() { Iterator x = vertices(); int c = 0; while (x.hasnext) c++; return c; Η opposite δίνει τον κόµβο που συνδέεται µέσω της ακµής e µε τον κόµβο v, δηλαδή τον γείτονά της. function Vertex opposite(v, e) { int[] a = endvertices(e); //πίνακας 2 στοιχείων return (t[0] == v)? t[1] : t[0]; function boolean areadjacent(v, w) { Iterator x = incidentedges(v); while (x.hasnext) if (opposite(v,x) == w) return true; return false; Για κατευθυνόµενα γραφήµατα: indegree(v) outdegree(v) inincidentedges(v) outincidentedges(v) inadjacentvertices(v) outadjacent-vertices(v) [18]