Αλγόριθμοι Αναζήτησης (AeppAcademy.com)
1. Γιατί τους χρειαζόμαστε Συχνά χρειάζεται να βρίσκουμε ένα συγκεκριμένο στοιχείο δεδομένων ανάμεσα σε λίγα ή πολλά (εκατοντάδες, χιλιάδες, εκατομμύρια ή περισσότερα) άλλα. Για παράδειγμα, μπορεί να χρειαστεί να βρούμε τον τηλεφωνικό αριθμό ενός φίλου στο τηλέφωνο μας, ή τη συγκεκριμένη διεύθυνση κατοικίας του στην Ελλάδα ή στο εξωτερικό. Για αυτό το σκοπό οι αλγόριθμοι αναζήτησης είναι σημαντικοί. Χωρίς αυτούς θα έπρεπε να κοιτάζουμε κάθε στοιχείο δεδομένων τηλεφωνικούς αριθμούς ή διευθύνσεις κατοικίας ξεχωριστά, για να δούμε αν υπάρχει αυτό που ψάχνουμε. Σε ένα μεγάλο σύνολο δεδομένων αυτό θα έπαιρνε πολλή ώρα. Αντίθετα, προτιμούμε να χρησιμοποιήσουμε έναν αλγόριθμο αναζήτησης για να μας βοηθήσει να βρούμε γρήγορα αυτό που ψάχνουμε. Υπάρχουν διάφοροι τύποι αλγορίθμων αναζήτησης. Δύο από αυτούς είναι η σειριακή και η δυαδική αναζήτηση. 2. Πώς λειτουργούν Οι αλγόριθμοι αναζήτησης όπως κάθε αλγόριθμος χρειάζονται κάποιες εισόδους και παράγουν κάποια έξοδο. Είσοδοι: Όνομα Πίνακα (Χώρος Αναζήτησης), Κλειδί Αναζήτησης (ή τιμή στόχος) Έξοδος: Θέση του Κλειδιού Αναζήτησης στον Χώρο Αναζήτησης Χώρος Αναζήτησης: Εκεί που ψάχνουμε. Είναι δομή δεδομένων (στο μάθημα ΑΕΠΠ υλοποιείται με πίνακα), και περιέχει ένα σύνολο δεδομένων. Κλειδί Αναζήτησης: Αυτό που ψάχνουμε. Είναι ένα δεδομένο οποιουδήποτε τύπου (ακέραιος, πραγματικός, χαρακτήρας, λογικός). Θέση Κλειδιού Αναζήτησης: Αν Ν είναι το μέγεθος του Χώρου Αναζήτησης, η θέση του κλειδιού είναι ένας ακέραιος αριθμός στο διάστημα [1, Ν], αν το κλειδί υπάρχει στη δομή δεδομένων, ή το 0 αν το κλειδί δεν υπάρχει στη δομή δεδομένων. 2.1 Σειριακή Αναζήτηση Συγκρίνει κάθε στοιχείο του Χώρου Αναζήτησης με το κλειδί, μέχρι είτε να το βρει είτε να εξεταστούν όλα τα στοιχεία. Πλεονέκτημα: Μπορεί να εφαρμοστεί τόσο σε ταξινομημένους όσο και σε μη-ταξινομημένους πίνακες. Μειονέκτημα: Αργός χρόνος εκτέλεσης, ο οποίος αυξάνεται γραμμικά με το μέγεθος του πίνακα. Γι αυτό λέγεται και Γραμμική Αναζήτηση. 2.2. Δυαδική Αναζήτηση Συγκρίνει μόνο ένα συγκεκριμένο στοιχείο ( το μέσο ) ενός διαρκώς μεταβαλλόμενου Χώρου Αναζήτησης με το κλειδί, μέχρι είτε να το βρει είτε να μηδενιστεί ο Χώρος Αναζήτησης. Σε κάθε προσπάθεια ο Χώρος Αναζήτησης μειώνεται στο μισό. Γι αυτό λέγεται και αναζήτηση ημίσεος διατήματος.
Πλεονέκτημα: Πολύ γρήγορος χρόνος εκτέλεσης, αφού οι συγκρίσεις που απαιτούνται δεν αυξάνονται γραμμικά με το μέγεθος του πίνακα. Μειονέκτημα: Μπορεί να εφαρμοστεί μόνο σε ταξινομημένους πίνακες. 3. Αλγόριθμοι Στα παραδείγματα που ακολουθούν αναζητούμε το στοιχείο με όνομα κλειδί σε πίνακα ακεραίων Α[Ν], με. Το μέγεθος και ο τύπος των δεδομένων του πίνακα μπορούν να αλλάζουν χωρίς βλάβη της γενικότητας. 3.1 Σειριακή Αναζήτηση Το ίδιο κλειδί μπορεί να υπάρχει σε περισσότερες θέσεις του χώρου αναζήτησης. Ανάλογα με την άσκηση μπορεί να ψάχνουμε την πρώτη ή την τελευταία θέση εμφάνισης του. 3.1.1 Πρώτη Θέση Εμφάνισης Συνάρτηση ΣειριακήΑναζήτηση(A, κλειδί): Ακέραια Ακέραιες: Α[Ν], κλειδί, i, θέση Λογικές: βρέθηκε βρέθηκε Ψευδής i 1 Όσο i <= N Και Όχι ( βρέθηκε ) Επανάλαβε Αν Α[i] = κλειδί Τότε βρέθηκε Αληθής i i + 1 3.1.2 Τελευταία Θέση Εμφάνισης Συνάρτηση ΣειριακήΑναζήτηση(A, κλειδί): Ακέραια Ακέραιες: Α[Ν], κλειδί, i, θέση Για i Από 1 Μέχρι N
Αν Α[i] = κλειδί Τότε 3.1.3 Σειριακή Αναζήτηση σε Ταξινομημένο Πίνακα Μπορούμε να εκμεταλλευτούμε την ιδιότητα του Α ότι είναι ταξινομημένος και να σταματήσουμε την αναζήτηση νωρίτερα, βελτιώνοντας τον αλγόριθμο. Στην παρακάτω υλοποίηση υποτίθεται αύξουσα ταξινόμηση στον Α. Συνάρτηση ΣειριακήΑναζήτηση(A, κλειδί): Ακέραια Ακέραιες: Α[Ν], κλειδί, i, θέση Λογικές: flag i 1 flag Ψευδής Όσο Όχι flag Και i <= N Επανάλαβε Αν Α[i] = κλειδί Τότε _Αν Α[i] > κλειδί Τότε flag Αληθής i i + 1 3.2 Δυαδική Αναζήτηση Σε αντίθεση με την σειριακή αναζήτηση, η δυαδική αναζήτηση στην γενική της μορφή ΔΕΝ μπορεί να εγγυηθεί ότι η θέση του κλειδιού που επιστρέφει είναι η θέση κάποιας συγκεκριμένης (πρώτης ή τελευταίας) εμφάνισης. Αν χρειαστεί να βρούμε την πρώτη ή την τελευταία θέση του κλειδιού, χρησιμοποιούμε την υλοποίηση 3.2.2 και 3.2.3 αντίστοιχα.
3.2.1 Γενική Μορφή Συνάρτηση ΔυαδικήΑναζήτηση(Α, κλειδί): Ακέραια Λογικές: βρέθηκε κάτωόριο 1 άνωόριο Ν βρέθηκε Ψευδής _Επανάληψης _Αν κλειδί > Α[μέσο] Τότε βρέθηκε Αληθής Μέχρις_Ότου κάτωόριο > άνωόριο Ή βρέθηκε = Αληθής 3.2.2 Πρώτη Θέση Εμφάνισης Συνάρτηση ΔυαδικήΑναζήτηση(Α, κλειδί): Ακέραια κάτωόριο 1 άνωόριο Ν _Επανάληψης _Αν κλειδί > Α[μέσο] Τότε άνωόριο μέσο 1! συνέχισε την αναζήτηση αριστερά Μέχρις_Ότου κάτωόριο > άνωόριο
3.2.2 Τελευταία Θέση Εμφάνισης Συνάρτηση ΔυαδικήΑναζήτηση(Α, κλειδί): Ακέραια κάτωόριο 1 άνωόριο Ν _Επανάληψης _Αν κλειδί > Α[μέσο] Τότε! συνέχισε την αναζήτηση δεξιά Μέχρις_Ότου κάτωόριο > άνωόριο 4. Αναζήτηση σε Μέρος του Χώρου Αναζήτησης Σε κάποιες περιπτώσεις μπορεί να χρειαστεί να γίνει η αναζήτηση του κλειδιού σε μέρος μόνο του χώρου αναζήτησης. Σε αυτή την περίπτωση, θα γίνει προσθήκη δύο επιπλέον μεταβλητών εισόδου, που οριοθετούν (αρχή και τέλος) την επιθυμητή περιοχή αναζήτησης. Είσοδοι: Όνομα Πίνακα, κάτω Όριο, άνω Όριο, Κλειδί Αναζήτησης (ή τιμή στόχος) Έξοδος: Θέση του Κλειδιού Αναζήτησης 4. 1 Σειριακή Αναζήτηση Συνάρτηση ΣειριακήΑναζήτηση(A, κάτωόριο, άνωόριο, κλειδί): Ακέραια Ακέραιες: Α[Ν], κάτωόριο, άνωόριο, κλειδί, i, θέση Για i Από κάτωόριο Μέχρι άνωόριο Αν Α[i] = κλειδί Τότε
4.2 Δυαδική Αναζήτηση Συνάρτηση ΔυαδικήΑναζήτηση(Α, κάτωόριο, άνωόριο, κλειδί): Ακέραια Λογικές: βρέθηκε βρέθηκε Ψευδής _Επανάληψης _Αν κλειδί > Α[μέσο] Τότε βρέθηκε Αληθής Μέχρις_Ότου κάτωόριο > άνωόριο Ή βρέθηκε = Αληθής 5. Συμπέρασμα Πρέπει να γνωρίζετε τις διαφορετικές υλοποιήσεις των αλγορίθμων αναζήτησης και να χρησιμοποιείτε εκείνη που ταιριάζει στην κάθε άσκηση. Θυμηθείτε ιδιαίτερα ότι: 1. σε ταξινομημένο πίνακα μπορούμε να χρησιμοποιούμε τόσο τη σειριακή όσο και την δυαδική αναζήτηση. 2. στην περίπτωση που το κλειδί αναζήτησης υπάρχει σε περισσότερες θέσεις στον πίνακα που το αναζητούμε, η απλή υλοποίηση της δυαδικής αναζήτησης δεν εγγυάται ότι η θέση που επιστρέφει είναι η πρώτη ή η τελευταία. Καλή Επιτυχία!