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

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση.
Advertisements

Στοιχειώδεις Δομές Δεδομένων TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Τύποι δεδομένων στη Java • Ακέραιοι.
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
Λίστες παράλειψης (skip lists) TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι18/10/2010.
ΣΤΟΙΧΕΙΑ ΨΕΥΔΟΚΩΔΙΚΑ ΒΑΣΙΚΕΣ ΔΟΜΕΣ ΒΑΣΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ ΠΙΝΑΚΩΝ
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Δομές Αναζήτησης TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A εισαγωγή αναζήτησηεπιλογή διατεταγμένος πίνακας.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πίνακες Κλάσεις και Αντικείμενα.
Ψηφιακά Δένδρα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Μπορούμε να χρησιμοποιήσουμε την παραπάνω αναπαράσταση.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Συλλογές.
Εργασία Η υλοποίηση του αλγορίθμου συγχώνευσης θα πρέπει να χρησιμοποιεί την ιδέα των ροών (streams). Θα πρέπει να υπάρχουν δύο διαφορετικά είδη.
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν ι κλμ ρσ τ κκπ(λ,ι)=α, κκπ(τ,σ)=ν, κκπ(λ,π)=η κκπ(π,σ)=γ, κκπ(ξ,ο)=κ ξο κκπ(ι,ξ)=β, κκπ(τ,θ)=θ, κκπ(ο,μ)=α.
Δυναμική Διατήρηση Γραμμικής Διάταξης Διατηρεί μια γραμμική διάταξη δυναμικά μεταβαλλόμενης συλλογής στοιχείων. Υποστηρίζει τις λειτουργίες: Έλεγχος της.
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων. Πίνακας Συμβόλων (Symbol Table) (Ι)  Είναι μια δομή στην οποία αποθηκεύονται τα ονόματα ενός προγράμματος και.
Ισορροπημένα Δένδρα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Μπορούμε να επιτύχουμε χρόνο εκτέλεσης για.
Δομές Αναζήτησης TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Χειριζόμαστε ένα σύνολο στοιχείων όπου το κάθε.
Ε. ΠετράκηςΣτοίβες, Ουρές1 Στοίβες  Στοίβα: περιορισμένη ποικιλία λίστας  τα στοιχεία μπορούν να εισαχθούν ή να διαγραφούν μόνο από μια άκρη : λίστες.
Ουρά Προτεραιότητας: Heap
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων Φροντιστήριο - 30/04/2009.
Δυναμικη Δεσμευση Μνημης Συνδεδεμενες Λιστες (dynamic memory allocation, linked lists) Πως υλοποιουμαι προγραμματα που δεν γνωριζουμε πριν την εκτελεση.
TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Ουρά Προτεραιότητας (priority queue) Δομή δεδομένων που υποστηρίζει.
TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Ουρά Προτεραιότητας (priority queue) Δομή δεδομένων που υποστηρίζει.
ΕΠΛ 223 Θεωρία και Πρακτική Μεταγλωττιστών7-1 Πίνακας Συμβόλων Πίνακας συμβόλων: δομή δεδομένων που χρησιμοποιείται για την αποθήκευση διαφόρων πληροφοριών.
Διερεύνηση γραφήματος. Ένας αλγόριθμος διερεύνησης γραφήματος επισκέπτεται τους κόμβους του γραφήματος με μια καθορισμένη στρατηγική, π.χ. κατά εύρος.
TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Ουρά Προτεραιότητας (priority queue) Δομή δεδομένων που υποστηρίζει.
Στοιχειώδεις Δομές Δεδομένων TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Τύποι δεδομένων στη C Ακέραιοι.
Λεξικό, Union – Find Διδάσκοντες: Σ. Ζάχος, Δ. Φωτάκης Επιμέλεια διαφανειών: Δ. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο.
Quicksort Διδάσκοντες: Σ. Ζάχος, Δ. Φωτάκης Επιμέλεια διαφανειών: Δ. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο.
Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1 Εισαγωγή στην Επεξεργασία Ερωτήσεων.
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι115/4/2015.
Λίστες παράλειψης (skip lists) TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A
Γράφημα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Συνδυαστικό αντικείμενο που αποτελείται από.
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1 Επεξεργασία Ερωτήσεων.
Δομές Δεδομένων και Αρχεία Ενότητα 10: Κυκλικά και Διπλά Συνδεδεμένη Λίστα Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I.
Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1 Ευρετήρια.
Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1 Ευρετήρια.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 8: Κατασκευαστές. Διδάσκων: Νικόλαος Θ Λιόλιος, Καθηγητής. Τμήμα.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
Συνδετικότητα γραφήματος (graph connectivity). α β Υπάρχει μονοπάτι μεταξύ α και β; Παραδείγματα: υπολογιστές ενός δικτύου ιστοσελίδες ισοδύναμες μεταβλητές.
Δομές Δεδομένων 8η Διάλεξη: Ταξινόμηση Ε. Μαρκάκης.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Πίνακας Συμβόλων Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
Δομές Δεδομένων 7η Διάλεξη Αφηρημένοι Τύποι Δεδομένων Ε. Μαρκάκης.
17η Διάλεξη Ισορροπημένα δέντρα Ε. Μαρκάκης
Αναζήτηση σε πίνακα Αναζήτηση σε πίνακα που περιέχει ακέραιους αριθμούς.
ΔΥΑΔΙΚΗ ΑΝΑΖΗΤΗΣΗ & ΤΑΞΙΝΟΜΗΣΗ ΜΕ ΣΥΓΧΩΝΕΥΣΗ. Δυαδική αναζήτηση (Binary search) ΔΕΔΟΜΕΝΟ: ένα μεγάλο αρχείο που περιέχει τιμές z [0,1,…,n-1] ταξινομημένες.
ΜΕΤΑΒΛΗΤΕΣ-ΣΤΑΘΕΡΕΣ -ΕΚΦΡΑΣΕΙΣ
Ευρετήρια Βάσεις Δεδομένων Ευαγγελία Πιτουρά.
Δυναμικός Κατακερματισμός
Δομές Δεδομένων 2η Διάλεξη Αλγόριθμοι Ένωσης-Εύρεσης (Union-Find)
Στοιχειώδεις Δομές Δεδομένων: Πίνακες και Λίστες
Πίνακες και αλφαριθμητικά
9η Διάλεξη Ταξινόμηση Ε. Μαρκάκης
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
12η Διάλεξη Διάσχιση Δέντρων και Ουρές Προτεραιότητας Ε. Μαρκάκης
Ειδικά Θέματα στον Προγραμματισμό Υπολογιστών
EPL231 – Data Structures and Algorithms
Εισαγωγή στον Προγ/μό Υπολογιστών
Ισορροπημένα Δένδρα Μπορούμε να επιτύχουμε χρόνο εκτέλεσης
Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον ΑΕΠΠ
Ουρά Προτεραιότητας (priority queue)
Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον ΑΕΠΠ
Δομές Αναζήτησης Χειριζόμαστε ένα σύνολο στοιχείων όπου το κάθε στοιχείο έχει ένα κλειδί από ολικά διατεταγμένο σύνολο Θέλουμε να υποστηρίξουμε δύο.
19η Διάλεξη Εξωτερική Αναζήτηση και Β-δέντρα Ε. Μαρκάκης
14η Διάλεξη Δέντρα Δυαδικής Αναζήτησης Ε. Μαρκάκης
Εξωτερική Αναζήτηση Ιεραρχία Μνήμης Υπολογιστή Εξωτερική Μνήμη
Δυναμικός Κατακερματισμός
Μεταγράφημα παρουσίασης:

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

Δομές Δεδομένων13-2 Ο αλγόριθμος heapsort Παράδειγμα ταξινόμησης με σωρό –Δημιουργία σωρού (σε μορφή δέντρου) Τα στοιχεία ταξινομούνται μερικώς –Ταξινόμηση με βάση το σωρό (σε μορφή πίνακα) Ουσιαστικά ταξινόμηση με επιλογή Επιταχύνεται όμως η επιλογή!

Δομές Δεδομένων13-3 Ο αλγόριθμος heapsort Χρήση σωρού για επιλογή –Εντοπισμός των k μεγαλύτερων από τα N στοιχεία ή απλώς του k-οστού μεγαλύτερου –Η ταξινόμηση λύνει το πρόβλημα σε χρόνο NlοgN –Ο σωρός λύνει το πρόβλημα σε γραμμικό χρόνο για μικρό k 1η μέθοδος (προφανής) –Κατασκευάζουμε το σωρό σε χρόνο Ο(N) –Αφαιρούμε k στοιχεία σε χρόνο 2klοgN 2η μέθοδος (όχι τόσο προφανής) –Κατασκευάζουμε έναν ανάποδο σωρό με k στοιχεία Η εξαγωγή αφαιρεί το μικρότερο στοιχείο –Κάνουμε N-k εισαγωγές ακολουθούμενες από εξαγωγές του ελάχιστου Κάθε φορά βγάζουμε το μικρότερο από k+1 στοιχεία –Συνολικό κόστος 2k + 2(N-k)lοgk

Δομές Δεδομένων13-4 Μέρος 4 Αναζήτηση

Δομές Δεδομένων13-5 Περίληψη Πίνακες συμβόλων Διεπαφή πίνακα συμβόλων Αναζήτηση με αριθμοδείκτη Ακολουθιακή αναζήτηση Δυαδική αναζήτηση

Δομές Δεδομένων13-6 Πίνακες συμβόλων Αναζήτηση και ανάκτηση πληροφοριών –Από τα πιο στοιχειώδη προβλήματα στην πληροφορική Απαιτήσεις –Δομές δεδομένων για την αποθήκευση των στοιχείων –Ταχύτητα ανάκτησης (Google, τράπεζες, δημόσιες υπηρεσίες,...) Ορισμός πίνακα συμβόλων (symbol table) –Είναι οποιαδήποτε δομή δεδομένων που περιέχει στοιχεία με κλειδιά και υποστηρίζει τις εξής λειτουργίες: –Εισαγωγή νέου στοιχείου με κάποιο κλειδί –Επιστροφή στοιχείου με κάποιο δοσμένο κλειδί (αναζήτηση) –Ονομάζεται και λεξικό (dictionary) Τα έντυπα λεξικά είναι πάντα ταξινομημένα Τα ηλεκτρονικά λεξικά δεν είναι απαραίτητα ταξινομημένα

Δομές Δεδομένων13-7 Διεπαφή πίνακα συμβόλων Πληθώρα εφαρμογών –Λεξικά, ευρετήρια, μεταγλωττιστές, DNS, δρομολόγηση Διάφορες υλοποιήσεις –Ταξινομημένοι ή αταξινόμητοι πίνακες ή λίστες –Δέντρα αναζήτησης, δυαδικά ή με μεγαλύτερο βαθμό –Πίνακες κατακερματισμού Άλλες υποστηριζόμενες λειτουργίες –Αφαίρεση, επιλογή k-οστού στοιχείου, ταξινόμηση, ένωση (προαιρετικά)

Δομές Δεδομένων13-8 Διεπαφή πίνακα συμβόλων Γενική μορφή στοιχείων και κλειδιών –Κάνει τις υλοποιήσεις πιο γενικές –Ένας πίνακας συμβόλων περιέχει στοιχεία (π.χ. αντικείμενα με όλες τις πληροφορίες ενός πελάτη μιας τράπεζας) –Κάθε στοιχείο περιέχει ένα κλειδί (που είναι συγκρίσιμο) με πρόσβαση μεσω της μεθόδου key() interface ITEM { KEY key(); /*μέθοδος πρόσβασης στο κλειδί */ } interface KEY { boolean less(KEY v); boolean equals(KEY v); } Εναλλακτικά αντί για less και equals, μπορούμε να έχουμε τριμερή σύγκριση (μικρότερο, ίσο, μεγαλύτερο) int compareTo(KEY v); –Επιστρέφει 1 αν το κλειδί > v, 0 αν είναι ίσα και -1 διαφορετικά

Δομές Δεδομένων13-9 Διεπαφή πίνακα συμβόλων Διεπαφή τάξης στοιχείων / κλειδιών –Οι πίνακες συμβόλων χρησιμοποιούν μόνο αυτή τη διεπαφή –Δημιουργία στοιχείων / κλειδιών με δύο τρόπους class myItem implements ITEM { public KEY key() void read() void rand() // μπορούμε να προσθέσουμε και άλλες λειτουργίες εδώ public String toString() } class myKey implements KEY { public boolean less(myKey) public boolean equals(myKey) void read() void rand() public String toString() }

Δομές Δεδομένων13-10 Διεπαφή πίνακα συμβόλων Παράδειγμα υλοποίησης κλειδιών –Τα κλειδιά είναι ακέραιες τιμές class myKey implements KEY { private int val; // η τιμή του κλειδιού public boolean less(KEY w) { return val < ((myKey) w).val; } public boolean equals(KEY w) { return val == ((myKey) w).val; } public void read() { val = In.getInt(); } public void rand() { val = (int) (M * Math.random()); }// Μ=μέγιστη τιμή public String toString() { return val + ""; } }

Δομές Δεδομένων13-11 Διεπαφή πίνακα συμβόλων Παράδειγμα υλοποίησης στοιχείων –Στοιχεία με έναν πραγματικό αριθμό (π.χ. υπόλοιπο λογαριασμού) –Τα κλειδιά είναι ακέραιες τιμές (υλοποιούνται χωριστά) (π.χ. ΑΦΜ) class myItem implements ITEM { private myKey bankkey; private float balance; myItem() { bankkey = new myKey(); } public KEY key() { return bankkey; } void read() { bankkey.read(); balance = In.getFloat(); } void rand() { bankkey.rand(); balance = (float) Math.random(); } public String toString() { return "(" + key() + " " + balance + ")"; } }

Δομές Δεδομένων13-12 Διεπαφή πίνακα συμβόλων Παράδειγμα απλούστερης υλοποίησης στοιχείων –Όταν τα κλειδιά είναι στοιχειώδεις τύποι δεδομένων, μπορούμε να αποφύγουμε την υλοποίηση της KEY –Μικρότερο κόστος αλλά και μικρότερη ευελιξία class intkeyItem { private int val; private float info; public int key() { return val; } void read() { val = In.getInt(); info = In.getFloat(); } void rand() { val = (int) (M * Math.random()); info = (float) Math.random(); } public String toString() { return "(" + key() + " " + info + ")"; } }

Δομές Δεδομένων13-13 Διεπαφή πίνακα συμβόλων Διεπαφή του ίδιου του πίνακα συμβόλων –Χρησιμοποιούμε ένα μέγιστο μέγεθος στον κατασκευαστή Βολικό στις υλοποιήσεις με πίνακα class ST { ST(int) int count() //μετρά το μέγεθος του πίνακα void insert(ITEM) ITEM search(KEY) void remove(KEY) ITEM select(int) //επιστροφή k-οστού μικρότερου public String toString() }

Δομές Δεδομένων13-14 Διεπαφή πίνακα συμβόλων Χειρισμός διπλών κλειδιών –Η διεπαφή δεν διευκρινίζει τι γίνεται με τα διπλά κλειδιά –Σε ορισμένες περιπτώσεις δεν επιτρέπονται διπλά κλειδιά –Τι γίνεται όμως αν επιτρέπονται; –Πρώτη προσέγγιση: μία καταχώρηση ανά κλειδί Χρήση λίστας για τα στοιχεία με το ίδιο κλειδί Βολική όταν θέλουμε να βρίσκουμε τα στοιχεία με ίδιο κλειδί –Δεύτερη προσέγγιση: πολλές καταχωρήσεις ανά κλειδί Επιστρέφουμε οποιαδήποτε από αυτές στην αναζήτηση Μπορεί η δομή να χρειάζεται τροποποίηση Επιλογή υλοποίησης –Κάθε υλοποίηση βελτιστοποιεί συγκεκριμένες πράξεις

Δομές Δεδομένων13-15 Διεπαφή πίνακα συμβόλων Παράδειγμα πελάτη πίνακα συμβόλων –Παραλείπει τα διπλά στοιχεία από την είσοδο class DeDup { public static void main(String[] args) { int i, N = Integer.parseInt(args[0]), sw = Integer.parseInt(args[1]); ST st = new ST(N); for (i = 0; i < N; i++) { myItem v = new myItem(); if (sw == 1) v.rand(); else v.read(); if (st.search(v.key()) == null) { st.insert(v); Out.println(v + ""); } } Out.print(N + " keys, "); Out.println(N-st.count() + " dups"); } }

Δομές Δεδομένων13-16 Αναζήτηση με αριθμοδείκτη Κατάλληλη όταν τα κλειδιά είναι μικροί ακέραιοι –Χρήση ενός πίνακα με αριθμοδείκτες τα κλειδιά –Οι θέσεις του πίνακα δείχνουν σε στοιχεία ή σε null –Εισαγωγή: αποθήκευση στοιχείου με κλειδί i στη θέση st[i] –Αναζήτηση κλειδιού i: επιστροφή θέσης i –Αφαίρεση κλειδιού i: τοποθέτηση null στη θέση st[i] –Καταμέτρηση και εκτύπωση με σάρωση του πίνακα –Σε κάποιες περιπτώσεις μπορούμε να έχουμε πίνακα από bits bit k = 0: δεν έχει εισαχθεί το κλειδί k, διαφορετικά bit k = 1

Δομές Δεδομένων13-17 Αναζήτηση με αριθμοδείκτη Παράδειγμα υλοποίησης (μέσω της intkeyItem) class ST { private intkeyItem[] st; ST(int M) { st = new intkeyItem[M]; } int count() { int N = 0; for (int i = 0; i < st.length; i++) if (st[i] != null) N++; return N; } void insert(intkeyItem x) { st[x.key()] = x; } void remove(int key) { st[key] = null; } intkeyItem search(int key) { return st[key]; } intkeyItem select(int k) { for (int i = 0; i < st.length; i++) if (st[i] != null && k-- == 0) return st[i]; return null; } }

Δομές Δεδομένων13-18 Αναζήτηση με αριθμοδείκτη Καταμέτρηση: –Η υλοποίηση εφαρμόζει ράθυμη (lazy) προσέγγιση –Θα μπορούσαμε να διατηρούμε έναν μετρητή στοιχείων –Κόστος σε κάθε λειτουργία αντί όποτε ζητηθεί καταμέτρηση Ανάλυση κόστους –Έστω ότι τα κλειδιά είναι N θετικοί ακέραιοι < M –Εισαγωγή, αναζήτηση και αφαίρεση: σταθερό κόστος –ταξινόμηση: M βήματα –Υπενθύμιση: ταξινόμηση με αριθμοδείκτη είναι Ο(Μ) όταν τα κλειδιά είναι όλα ακέραιοι ≤ Μ

Δομές Δεδομένων13-19 Ακολουθιακή αναζήτηση Αν δεν μπορούμε να χρησιμοποιήσουμε τα κλειδια ως αριθμοδείκτες: Χρήση ταξινομημένου πίνακα –Η εισαγωγή απαιτεί μετακίνηση στοιχείων για να μπει στη σωστή θέση το στοιχείο –Η αναζήτηση απαιτεί σάρωση στοιχείων Σταματάμε όταν βρούμε ίσο ή μεγαλύτερο κλειδί –Απλή υλοποίηση της επιλογής –Αφαίρεση ανάλογη με την εισαγωγή (πρέπει ο πίνακας να παραμείνει ταξινομημένος)

Δομές Δεδομένων13-20 Ακολουθιακή αναζήτηση Αναπαράσταση στοιχείων / κλειδιών –Παράλληλοι πίνακες –Τάξη στοιχείων με δύο πεδία –Τάξη στοιχείων και τάξη κλειδιών (για στοιχειώδεις τύπους υλοποίηση ITEM και ΚΕΥ κοστίζει πολύ) 2 δείκτες για την προσπέλαση του κλειδιού –Αυξανόμενη γενικότητα –Αυξανόμενο κόστος

Δομές Δεδομένων13-21 Ακολουθιακή αναζήτηση class ST { private ITEM[] st; private int N = 0; ST(int maxN) { st = new ITEM[maxN]; } void insert(ITEM x) { int i = N++; KEY v = x.key(); while (i > 0 && less(v, st[i-1].key())) { st[i] = st[i-1]; i--; } st[i] = x; } ITEM search(KEY key) { int i = 0; for ( ; i < N; i++) if (!less(st[i].key(), key)) break; if (i == N) return null; if (equals(key, st[i].key())) return st[i]; return null; } } ITEM select(int k) {return st[k];} int count() {return N;}

Δομές Δεδομένων13-22 Ακολουθιακή αναζήτηση Χρήση αταξινόμητου πίνακα –Πιο γρήγορη εισαγωγή (στο τέλος) –Πιο αργή αναζήτηση (πιθανή σάρωση όλου του πίνακα) –Πιο γρήγορη αφαίρεση (με ανταλλαγή με το τελευταίο στοιχείο), πιο αργή επιλογή Χρήση συνδεδεμένης λίστας –Ταξινομημένη ή αταξινόμητη –Ανάλογα πλεονεκτήματα και μειονεκτήματα με τους πίνακες –Η λίστα διευκολύνει την ταξινομημένη εισαγωγή –Κόστος (χρόνος και χώρος) διαχείρισης δεικτών Ταξινομημένη ή αταξινόμητη δομή; –Εξαρτάται από την εφαρμογή –Αν είναι πιο συχνή η εισαγωγή, τότε αταξινόμητη –Αν είναι πιο συχνή η αναζήτηση, τότε ταξινομημένη

Δομές Δεδομένων13-23 Ακολουθιακή αναζήτηση Υλοποίηση με αταξινόμητη λίστα class ST { private class Node { ITEM item; Node next; Node(ITEM x, Node t) { item = x; next = t; } } private Node head; private int N; ST(int maxN) { head = null; N = 0; } int count() { return N; } void insert(ITEM x) { head = new Node(x, head); N++; } private ITEM searchR(Node t, KEY key) { if (t == null) return null; if (equals(t.item.key(), key)) return t.item; return searchR(t.next, key); } ITEM search(KEY key) {return searchR(head, key); }}

Δομές Δεδομένων13-24 Ακολουθιακή αναζήτηση Ανάλυση κόστους –Διακρίνουμε επιτυχημένες και αποτυχημένες αναζητήσεις Γενική ιδιότητα: N/2 συγκρίσεις για επιτυχή αναζήτηση κατά μέσο όρο –Λίστα ή πίνακας, ταξινομημένα ή αταξινόμητα Μη ταξινομημένα στοιχεία –Σταθερό κόστος εισαγωγής –N συγκρίσεις για αποτυχημένη αναζήτηση –Ισχύει για λίστα ή πίνακα Ταξινομημένα στοιχεία –Κατά μέσο όρο N/2 συγκρίσεις για εισαγωγή και επιτυχή ή ανεπιτυχή αναζήτηση –Ισχύει για λίστα ή πίνακα

Δομές Δεδομένων13-25 Δυαδική αναζήτηση Τακτική αναζήτησης διαίρει και βασίλευε –Διαιρούμε τον πίνακα συμβόλων σε δύο ίσα τμήματα Πιθανόν να διαφέρουν κατά 1 στοιχείο –Συνεχίζουμε στο τμήμα που περιέχει το ζητούμενο κλειδί –Χρησιμοποιεί ταξινομημένο πίνακα private ITEM searchR(int l, int r, KEY v) { if (l > r) return null; int m = (l+r)/2; if (equals(v, st[m].key())) return st[m]; if (less(v, st[m].key())) return searchR(l, m-1, v); else return searchR(m+1, r, v); } ITEM search(KEY v) { return searchR(0, N-1, v); }

Δομές Δεδομένων13-26 Δυαδική αναζήτηση Απόδοση δυαδικής αναζήτησης –Το πολύ floor(lοgN)+1 συγκρίσεις, επιτυχείς ή μη αναζητήσεις Πρόβλημα: διατήρηση του πίνακα ταξινομημένου –Αν τα στοιχεία εισάγονται δυναμικά έχουμε πρόβλημα Χρειάζεται συνεχής μετακίνηση των στοιχείων του πίνακα –Η συνδεδεμένη λίστα εμποδίζει την άμεση προσπέλαση

Δομές Δεδομένων13-27 Δυαδική αναζήτηση Προκαθορισμένη ακολουθία συγκρίσεων –Εξαρτάται μόνο από το μέγεθος του αρχείου –Ακολουθούμε μοναδική διαδρομή στο δένδρο Χειρισμός διπλών κλειδιών –Η ταξινόμηση τοποθετεί τα κλειδιά σε συνεχόμενες θέσεις –Η αναζήτηση οδηγεί σε κάποια από αυτές τις θέσεις –Απλές προσθήκες για σάρωση των γειτονικών θέσεων Επιτάχυνση με παρεμβολή –Υπολογίζουμε πού περίπου πρέπει να βρίσκεται το κλειδί Υποθέτουμε ομοιόμορφη κατανομή κλειδιών –Διασπάμε τον πίνακα εκεί και όχι στο μέσο m = l + (v – a[l].key()) * (r – l) / (a[r].key() – a[l].key())