Αναζήτηση Στην λειτουργία της αναζήτησης εξακριβώνεται η παρουσία ή η απουσία ενός δεδομένου σε μια δομή δεδομένων Σειριακή αναζήτηση Η σειριακή ή γραμμική μέθοδος αναζήτησης είναι η πιο απλή μέθοδος αναζήτησης στοιχείου σε πίνακα Με την μέθοδο αυτή εξετάζονται τα στοιχεία του πίνακα ένα προς ένα και αν κάποιο από αυτά είναι ίδιο με αυτό που αναζητείται, τότε η αναζήτηση είναι επιτυχείς Σε αντίθετη περίπτωση η αναζήτηση είναι ανεπιτυχής Περιπτώσεις σειριακής αναζήτησης: Άσκηση Έστω ότι έχουμε καταγεγραμμένα τα ονόματα των 40 φίλων/συγγενών σε πίνακα ΟΝ[40] και σε παράλληλο πίνακα ΤΗΛ[40] αντίστοιχα το τηλέφωνο για καθένα από αυτούς ΟΝ[40] ΤΗΛ[40] 1 ΜΑΡΙΑ 2610222222 2 ΝΙΚΟΣ 2610458588 3 ΜΑΡΙΑ 2610111111 39 ΚΩΣΤΑΣ 2610444444 40 ΝΙΚΟΣ 2610252525 Περίπτωση 1 η : Να γραφεί αλγόριθμος που να διαβάζει ένα όνομα και να εμφανίζει τα τηλέφωνα που αντιστοιχούν σε αυτό το όνομα Σε περίπτωση που το όνομα αυτό δεν υπάρχει στον πίνακα να εμφανίζει κατάλληλο μήνυμα Παρατήρηση: Εδώ η εκφώνηση υπονοεί ότι υπάρχουν περισσότερα από ένα ίδια ονόματα στον πίνακα ΟΝ και πρέπει να τα αναζητήσουμε όλα (πχ όλα τα Νίκος) Γι αυτό θα πρέπει να εξετάσουμε όλα τα στοιχεία του πίνακα ΟΝ Αλγόριθμος Σειριακή_1 Διάβασε όνομα!για παράδειγμα «Νίκος»!δεν έχει βρεθεί, τώρα ξεκινάω Για Ι από 1 μέχρι 40 Εμφάνισε Το τηλέφωνο είναι:, ΤΗΛ[Ι]!Το στοιχείο που αναζητώ βρέθηκε
Περίπτωση 2 η : Να γραφεί αλγόριθμος που να διαβάζει ένα ονοματεπώνυμο και να εμφανίζει το τηλέφωνο που αντιστοιχεί σε αυτό το όνομα Θεωρήσετε ότι στο πίνακα ΟΝ δεν επαναλαμβάνονται ίδια ονόματα Σε περίπτωση που το ονοματεπώνυμο αυτό δεν υπάρχει στον πίνακα να εμφανίζει κατάλληλο μήνυμα ΟΝ[40] 1 Κατερίνα Ωραίου 2 Νίκος Λάνας 3 Μαρία Τέρενς 39 Ιωάννης Σιάχος 40 Θάνος Ξιφίας ΤΗΛ[40] 2610222222 2610458588 2610111111 2610444444 2610252525 Παρατήρηση1: Στην περίπτωση αυτή μπορούμε να δουλέψουμε όπως και στην προηγούμενη περίπτωση: Αλγόριθμος Σειριακή_1 Διάβασε όνομα Για Ι από 1 μέχρι 40 Εμφάνισε Το τηλέφωνο είναι:, ΤΗΛ[Ι] Παρατήρηση2: Φανταστείτε να αναζητάτε ένα στοιχείο σε ένα πίνακα 10000 θέσεων για παράδειγμα Έστω ότι το στοιχείο βρεθεί στην 10 η θέση Σύμφωνα με την μεθοδολογία της περίπτωσης 1 θα συνεχίζει να ψάχνει και στις επόμενες 9990 θέσεις Έτσι ο αλγόριθμος γίνεται υπερβολικά αργός!! Μπορούμε όμως να τροποποιήσουμε τον προηγούμενο αλγόριθμο ως εξής: Αλγόριθμος Σειριακή_2 Διάβασε όνομα θ 0 Όσο Ι<=40 και done =ψευδής επανάλαβε θ Ι στοιχείο Ι Ι+1 Όσο δεν έχει βρεθεί το στοιχείο και δεν έχει εξαντληθεί ο πίνακας συνέχισε την αναζήτηση!στο θ αποθηκεύεται η θέση που βρέθηκε το Εναλλακτικά: Αν θ=0 τότε Αλλιώς Εμφάνισε Το τηλέφωνο είναι:,τηλ[θ]
Περίπτωση3 η : Αν ο πίνακας είναι ταξινομημένος, έστω με αύξουσα διάταξη, τότε μπορούμε να κάνουμε πιο αποδοτικό τον αλγόριθμο της σειριακής αναζήτησης Έστω ο πίνακας Α[10]: 2 5 7 10 12 15 19 30 40 99 Έστω ότι αναζητούμε τον αριθμό 10 Είναι προφανές πως δεν υπάρχει λόγος να αναζητήσουμε το 10 μετά την 4 η θέση (Ι=4) του πίνακα Α Άρα στην προκειμένη περίπτωση μετά την 4 η επανάληψη, ο αλγόριθμος θα πρέπει να σταματήσει την αναζήτηση Γενικά ο αλγόριθμος πρέπει να σταματά αν βρεθεί στοιχείο μεγαλύτερο (μικρότερο, αν ο πίνακας είναι ταξινομημένος με φθίνουσα διάταξη) από αυτό που αναζητάμε Αυτό θα το πετύχουμε με μια επιπλέον περίπτωση στην δομή επιλογής εντός του βρόχου Οπότε ο αλγόριθμος διαμορφώνεται ως εξής: Αλγόριθμος Σειριακή_Ταξινομημένος Δεδομένα //Α// Εμφάνισε Δώσε έναν αριθμό για αναζήτηση θ 0 Όσο Ι<=10 και done =ψευδής επανάλαβε Αν Α[Ι] = key τότε Όσο δεν έχει βρεθεί το στοιχείο και δεν έχει εξαντληθεί ο πίνακας συνέχισε την αναζήτηση θ Ι!Το στοιχείο βρέθηκε στην θέση Ι!Σταμάτα το στοιχείο βρέθηκε Αλλιώς_αν Α[Ι]>key τότε!σταμάτα το στοιχείο δεν πρόκειται να βρεθεί Ι Ι+1 Προσθήκη!Δεν είναι το ίδιο να πω: Αν done=ψευδής τότε, διότι η done δεν μας λέει αν βρέθηκε Αν θ = 0 τότε Αλλιώς Εμφάνισε Το στοιχείο βρέθηκε στην θέση, θ Τέλος Σειριακή_Ταξινομημένος ΠΡΕΠΕΙ ΝΑ ΞΕΡΕΤΕ: Η σειριακή μέθοδος είναι η πιο απλή και η λιγότερο αποτελεσματική μέθοδος αναζήτησης Ο αλγόριθμος της σειριακής αναζήτησης χρησιμοποιείται (Δες σχολικό βιβλίο σελ65) κυρίως όταν: o Ο πίνακας δεν είναι ταξινομημένος o Ο πίνακας έχει μικρό μέγεθος πχ Ν<=20 o Η αναζήτηση στον πίνακα γίνεται σπάνια Ο αλγόριθμος της σειριακής αναζήτησης μπορεί να χρησιμοποιηθεί και σε ταξινομημένους πίνακες, όμως σε αυτή την περίπτωση έχουμε πολύ πιο αποδοτικούς αλγόριθμους όπως την δυαδική αναζήτηση Ο αλγόριθμος της δυαδικής αναζήτησης μπορεί να εφαρμοστεί μόνο σε ταξινομημένους πίνακες
Αναζήτηση σε πίνακα δύο διαστάσεων Ο αλγόριθμος της σειριακής αναζήτησης εφαρμόζεται και σε πίνακες δύο διαστάσεων Έστω ένας πίνακας ΝxΜ, Π[Ν,Μ] 1 Ο παρακάτω αλγόριθμος αναζητά όλα τα στοιχείων που πληρούν κάποια προϋπόθεση (πχ να βρεθούν οι θέσεις όλων των key, αν υπάρχουν) και μηνύματος αποτυχίας, αν δεν βρεθεί κανένα Αλγόριθμος Σειριακή_2_διαστάσεων_1 Δεδομένα //Ν,Μ,Π// Εμφάνισε Δώσε ένα στοιχείο για αναζήτηση Για Ι από 1 μέχρι N Για J από 1 μέχρι M Αν Π[Ι,J] = key τότε Εμφάνισε Το στοιχείο βρέθηκε στην θέση:, I,J Τέλος Σειριακή_2_διαστάσεων_1 2 Ο παρακάτω αλγόριθμος αναζητά την πρώτη θέση του στοιχείου που αναζητάμε (πχ να βρεθεί η θέση που συναντάμε πρώτη φορά το key, αν υπάρχει) και μηνύματος αποτυχίας, αν δεν υπάρχει Αλγόριθμος Σειριακή_2_διαστάσεων_1 Δεδομένα //Ν,Μ,Π// Εμφάνισε Δώσε ένα στοιχείο για αναζήτηση Όσο Ι<=Ν και done = ψευδής επανάλαβε J 1 Όσο J<=Μ και done = ψευδής επανάλαβε Αν Π[Ι,J] = key τότε Εμφάνισε Το στοιχείο βρέθηκε στην θέση:, I,J J J+1 Ι I+1 Τέλος Σειριακή_2_διαστάσεων_1 Όσο δεν έχει βρεθεί το στοιχείο και δεν έχουν εξαντληθεί οι γραμμές του πίνακα συνέχισε την αναζήτηση Όσο δεν έχει βρεθεί το στοιχείο και δεν έχουν εξαντληθεί οι στήλες του πίνακα συνέχισε την αναζήτηση
Ασκήσεις που εμπλέκεται αναζήτηση Σε γενικές γραμμές στις ασκήσεις όπου εμπλέκεται η αναζήτηση η λογική είναι η εξής: Γίνεται η αναζήτηση σε ένα μονοδιάστατο πίνακα αλφαριθμητικών ΟΝ[Ν], και εντοπίζεται η θέση (Θ) του αναζητούμενου στοιχείου Σε δύο διαστάσεων πίνακα Β[Ν,Μ], παράλληλο προς τον πίνακα ΟΝ, μπορεί να ζητείται άθροισμα/μέσο όρος, μέγιστο/ελάχιστο κοκ για το στοιχείο που βρέθηκε Άσκηση 20 (Λυμένη) Να φτιαχτεί πρόγραμμα που να διαβάζει τα ονόματα 6 μαθημάτων και να τα καταχωρίσει σε πίνακα Μ[6] Στην συνέχεια να διαβάζει τα ονόματα 10 μαθητών και να τα καταχωρίσει σε πίνακα Ο[10] και το βαθμό που έγραψαν στα 6 μαθήματα πανελλαδικών εξετάσεων και να τα καταχωρίσει σε πίνακα Β[10,6] Στην συνέχεια να διαβάζει το όνομα ενός μαθητή και αν υπάρχει να τυπώνει τον μεγαλύτερο του βαθμό και σε ποιο μάθημα το είχε Αν δεν υπάρχει να τυπώνει μήνυμα αποτυχίας (θεωρήστε ότι ο πίνακας έχει μοναδικά ονόματα) Λύση Σχεδιάζουμε πρώτα του πίνακες: Ο[10] Μαθητές Μ[6] Μαθήματα 1 2 6 Φυσική Έκθεση ΑΕΠΠ Βαθμοί 1 2 6 1 ΣΙΑΧΟΣ 17,5 15 13 2 ΝΙΚΟΥ 13,5 17 19,2 10 ΧΑΡΗΣ 16 19,9 18 Αλγόριθμος Εξετάσεις! Διαβάζουμε πρώτα τον πίνακα Μ[6] ξεχωριστά από τον 2-στατο ΔΙΑΒΑΣΕ Μ[J] ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 10 ΔΙΑΒΑΣΕ Ο[Ι] ΔΙΑΒΑΣΕ Β[Ι, J]! Εφαρμόζουμε τον αλγόριθμο της σειριακής!αναζήτησης, η άσκηση δεν μας περιορίζει ποια έκδοση!του αλγορίθμου! Εδώ χρησιμοποιούμε την περίπτωση όπου κάνουμε αναζήτηση σε όλο τον πίνακα Βέβαια ο αλγόριθμος θα ήταν πιο αποδοτικός αν η αναζήτηση σταματούσε όταν θα έβρισκε το στοιχείο που ψάχνουμε!παρατηρούμε πως δεν χρειάζεται να δουλέψουμε με λογική μεταβλητή Β[10,6] ΔΙΑΒΑΣΕ ΟΝΟΜΑ Θ 0 ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 10 ΑΝ ΟΝΟΜΑ = Ο[Ι] ΤΟΤΕ Θ Ι ΑΝ Θ <> 0 ΤΟΤΕ!Το στοιχείο βρέθηκε ΜΑΧ Β[Θ, 1]!Εκχωρούμε το πρώτο στοιχείο της γραμμής Θ, της θέσης που βρέθηκε το στοιχείο ΑΝ Β[Θ, J] >= ΜΑΧ ΤΟΤΕ ΜΑΧ Β[Θ, J] ΜΑΘ J!θέλουμε και το μάθημα ΓΡΑΨΕ 'Ο ΜΕΓΑΛΥΤΕΡΟΣ ΒΑΘΜΟΣ ΕΙΝΑΙ Ο ', ΜΑΧ, ' ΣΤΟ ΜΑΘΗΜΑ ', Μ[ΜΑΘ] ΑΛΛΙΩΣ ΓΡΑΨΕ 'ΔΕΝ ΒΡΕΘΗΚΕ'