Η αναζήτηση ενός στοιχείου σε έναν πίνακα είναι μια από τις πιο συχνές λειτουργίες στον προγραμματισμό. Υπάρχουν δύο βασικές μέθοδοι αναζήτησης: η σειριακή αναζήτηση και η δυαδική αναζήτηση. Κάθε μέθοδος έχει τα δικά της πλεονεκτήματα και μειονεκτήματα, ανάλογα με την δομή των δεδομένων και τις απαιτήσεις του προγράμματος.
Στόχος αυτού του μαθήματος είναι να κατανοήσετε:
Η σειριακή αναζήτηση (Linear Search) είναι μια μέθοδος αναζήτησης όπου ελέγχουμε κάθε στοιχείο του πίνακα ένα προς ένα, μέχρι να βρούμε το ζητούμενο στοιχείο ή μέχρι να φτάσουμε στο τέλος του πίνακα.
Ο αλγόριθμος της σειριακής αναζήτησης μπορεί να περιγραφεί ως εξής:
Παράδειγμα: Ένα πρόγραμμα που αναζητά ένα στοιχείο σε έναν πίνακα χρησιμοποιώντας σειριακή αναζήτηση:
ΠΡΟΓΡΑΜΜΑ Σειριακή_Αναζήτηση
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: π[10], i, α, βρέθηκε
ΑΡΧΗ
! Διάβασε τα στοιχεία του πίνακα
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 10
ΓΡΑΨΕ 'Δώσε το ', i, '-οστό στοιχείο: '
ΔΙΑΒΑΣΕ π[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Διάβασε το στοιχείο που ψάχνουμε
ΓΡΑΨΕ 'Δώσε το στοιχείο που ψάχνεις: '
ΔΙΑΒΑΣΕ α
! Αναζήτηση
βρέθηκε ← 0
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 10
ΑΝ π[i] = α ΤΟΤΕ
βρέθηκε ← 1
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Εκτύπωση αποτελέσματος
ΑΝ βρέθηκε = 1 ΤΟΤΕ
ΓΡΑΨΕ 'Το στοιχείο βρέθηκε.'
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Το στοιχείο δεν βρέθηκε.'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Η δυαδική αναζήτηση (Binary Search) είναι μια μέθοδος αναζήτησης που εφαρμόζεται σε ταξινομημένους πίνακες. Χωρίζει επαναληπτικά τον πίνακα στη μέση και συγκρίνει το μεσαίο στοιχείο με το ζητούμενο στοιχείο, για να αποφασίσει σε ποιο μισό του πίνακα να συνεχίσει την αναζήτηση.
Ο αλγόριθμος της δυαδικής αναζήτησης μπορεί να περιγραφεί ως εξής:
Παράδειγμα: Ένα πρόγραμμα που αναζητά ένα στοιχείο σε έναν ταξινομημένο πίνακα χρησιμοποιώντας δυαδική αναζήτηση:
ΠΡΟΓΡΑΜΜΑ Δυαδική_Αναζήτηση
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: π[10], αριστερό, δεξιό, μέσος, α, βρέθηκε
ΑΡΧΗ
! Διάβασε τα στοιχεία του ταξινομημένου πίνακα
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 10
ΓΡΑΨΕ 'Δώσε το ', i, '-οστό στοιχείο (ταξινομημένο): '
ΔΙΑΒΑΣΕ π[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Διάβασε το στοιχείο που ψάχνουμε
ΓΡΑΨΕ 'Δώσε το στοιχείο που ψάχνεις: '
ΔΙΑΒΑΣΕ α
! Αρχικοποίηση δεικτών
αριστερό ← 1
δεξιό ← 10
βρέθηκε ← 0
! Δυαδική αναζήτηση
ΟΣΟ αριστερό <= δεξιό ΚΑΙ βρέθηκε = 0 ΕΠΑΝΑΛΑΒΕ
μέσος ← (αριστερό + δεξιό) DIV 2
ΑΝ π[μέσος] = α ΤΟΤΕ
βρέθηκε ← 1
ΑΛΛΙΩΣ_ΑΝ α < π[μέσος] ΤΟΤΕ
δεξιό ← μέσος - 1
ΑΛΛΙΩΣ
αριστερό ← μέσος + 1
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Εκτύπωση αποτελέσματος
ΑΝ βρέθηκε = 1 ΤΟΤΕ
ΓΡΑΨΕ 'Το στοιχείο βρέθηκε.'
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Το στοιχείο δεν βρέθηκε.'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
| Χαρακτηριστικό | Σειριακή Αναζήτηση | Δυαδική Αναζήτηση |
|---|---|---|
| Προαπαιτούμενο | Ο πίνακας δεν χρειάζεται να είναι ταξινομημένος. | Ο πίνακας πρέπει να είναι ταξινομημένος. |
| Χρονική Πολυπλοκότητα | O(n) | O(log n) |
| Υλοποίηση | Απλή | Πιο σύνθετη |
| Χώρος Μνήμης | Δεν απαιτεί επιπλέον χώρο | Δεν απαιτεί επιπλέον χώρο |
| Εφαρμογή | Μικροί πίνακες, μη ταξινομημένοι πίνακες | Μεγάλοι ταξινομημένοι πίνακες |
Η επιλογή μεταξύ σειριακής και δυαδικής αναζήτησης εξαρτάται από τις ακόλουθες παραμέτρους:
Ένα πρόγραμμα που αναζητά μια συγκεκριμένη βαθμολογία σε έναν πίνακα βαθμολογιών μαθητών:
ΠΡΟΓΡΑΜΜΑ Αναζήτηση_Βαθμολογίας
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: βαθμοί[20], i, α, βρέθηκε
ΑΡΧΗ
! Διάβασε τις βαθμολογίες
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 20
ΓΡΑΨΕ 'Δώσε τον βαθμό του ', i, '-ου μαθητή: '
ΔΙΑΒΑΣΕ βαθμοί[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Διάβασε τη βαθμολογία που ψάχνουμε
ΓΡΑΨΕ 'Δώσε τη βαθμολογία που ψάχνεις: '
ΔΙΑΒΑΣΕ α
! Αναζήτηση
βρέθηκε ← 0
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 20
ΑΝ βαθμοί[i] = α ΤΟΤΕ
βρέθηκε ← 1
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Εκτύπωση αποτελέσματος
ΑΝ βρέθηκε = 1 ΤΟΤΕ
ΓΡΑΨΕ 'Η βαθμολογία βρέθηκε.'
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Η βαθμολογία δεν βρέθηκε.'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Ένα πρόγραμμα που αναζητά έναν αριθμό σε έναν ταξινομημένο πίνακα χρησιμοποιώντας δυαδική αναζήτηση:
ΠΡΟΓΡΑΜΜΑ Δυαδική_Αναζήτηση_Αριθμού
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: π[15], αριστερό, δεξιό, μέσος, α, βρέθηκε, i
ΑΡΧΗ
! Διάβασε τα ταξινομημένα στοιχεία του πίνακα
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 15
ΓΡΑΨΕ 'Δώσε το ', i, '-οστό ταξινομημένο στοιχείο: '
ΔΙΑΒΑΣΕ π[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Διάβασε τον αριθμό που ψάχνουμε
ΓΡΑΨΕ 'Δώσε τον αριθμό που ψάχνεις: '
ΔΙΑΒΑΣΕ α
! Αρχικοποίηση δεικτών
αριστερό ← 1
δεξιό ← 15
βρέθηκε ← 0
! Δυαδική αναζήτηση
ΟΣΟ αριστερό <= δεξιό ΚΑΙ βρέθηκε = 0 ΕΠΑΝΑΛΑΒΕ
μέσος ← (αριστερό + δεξιό) DIV 2
ΑΝ π[μέσος] = α ΤΟΤΕ
βρέθηκε ← 1
ΑΛΛΙΩΣ_ΑΝ α < π[μέσος] ΤΟΤΕ
δεξιό ← μέσος - 1
ΑΛΛΙΩΣ
αριστερό ← μέσος + 1
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Εκτύπωση αποτελέσματος
ΑΝ βρέθηκε = 1 ΤΟΤΕ
ΓΡΑΨΕ 'Ο αριθμός βρέθηκε.'
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Ο αριθμός δεν βρέθηκε.'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Ένα πρόγραμμα που συγκρίνει τις δύο μεθόδους αναζήτησης σε έναν ταξινομημένο πίνακα:
ΠΡΟΓΡΑΜΜΑ Σύγκριση_Αναζήτησης
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: π[20], i, α, βρέθηκε_σειριακή, βρέθηκε_δυαδική, αριστερό, δεξιό, μέσος
ΑΡΧΗ
! Διάβασε τα ταξινομημένα στοιχεία του πίνακα
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 20
ΓΡΑΨΕ 'Δώσε το ', i, '-οστό ταξινομημένο στοιχείο: '
ΔΙΑΒΑΣΕ π[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Διάβασε τον αριθμό που ψάχνουμε
ΓΡΑΨΕ 'Δώσε τον αριθμό που ψάχνεις: '
ΔΙΑΒΑΣΕ α
! Σειριακή Αναζήτηση
βρέθηκε_σειριακή ← 0
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 20
ΑΝ π[i] = α ΤΟΤΕ
βρέθηκε_σειριακή ← 1
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Δυαδική Αναζήτηση
αριστερό ← 1
δεξιό ← 20
βρέθηκε_δυαδική ← 0
ΟΣΟ αριστερό <= δεξιό ΚΑΙ βρέθηκε_δυαδική = 0 ΕΠΑΝΑΛΑΒΕ
μέσος ← (αριστερό + δεξιό) DIV 2
ΑΝ π[μέσος] = α ΤΟΤΕ
βρέθηκε_δυαδική ← 1
ΑΛΛΙΩΣ_ΑΝ α < π[μέσος] ΤΟΤΕ
δεξιό ← μέσος - 1
ΑΛΛΙΩΣ
αριστερό ← μέσος + 1
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
! Εκτύπωση αποτελεσμάτων
ΓΡΑΨΕ 'Σειριακή Αναζήτηση: '
ΑΝ βρέθηκε_σειριακή = 1 ΤΟΤΕ
ΓΡΑΨΕ 'Βρέθηκε'
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Δεν βρέθηκε'
ΤΕΛΟΣ_ΑΝ
ΓΡΑΨΕ 'Δυαδική Αναζήτηση: '
ΑΝ βρέθηκε_δυαδική = 1 ΤΟΤΕ
ΓΡΑΨΕ 'Βρέθηκε'
ΑΛΛΙΩΣ
ΓΡΑΨΕ 'Δεν βρέθηκε'
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Να γράψετε ένα πρόγραμμα στη ΓΛΩΣΣΑ που να διαβάζει 10 αριθμούς από τον χρήστη, να τους αποθηκεύει σε έναν πίνακα και να αναζητά αν ένας αριθμός που θα δώσει ο χρήστης υπάρχει στον πίνακα χρησιμοποιώντας σειριακή αναζήτηση.
Να γράψετε ένα πρόγραμμα στη ΓΛΩΣΣΑ που να διαβάζει 15 ταξινομημένους αριθμούς από τον χρήστη, να τους αποθηκεύει σε έναν πίνακα και να αναζητά αν ένας αριθμός που θα δώσει ο χρήστης υπάρχει στον πίνακα χρησιμοποιώντας δυαδική αναζήτηση.
Να γράψετε ένα πρόγραμμα στη ΓΛΩΣΣΑ που να διαβάζει 12 αριθμούς από τον χρήστη, να τους αποθηκεύει σε έναν πίνακα και να αναζητά πόσες φορές εμφανίζεται ένας αριθμός που θα δώσει ο χρήστης.
Να γράψετε ένα πρόγραμμα στη ΓΛΩΣΣΑ που να διαβάζει 20 ταξινομημένους αριθμούς από τον χρήστη, να τους αποθηκεύει σε έναν πίνακα και να αναζητά τη θέση ενός αριθμού που θα δώσει ο χρήστης χρησιμοποιώντας δυαδική αναζήτηση.
Να γράψετε ένα πρόγραμμα στη ΓΛΩΣΣΑ που να διαβάζει 10 ταξινομημένους αριθμούς από τον χρήστη, να τους αποθηκεύει σε έναν πίνακα και να αναζητά έναν αριθμό χρησιμοποιώντας και τις δύο μεθόδους (σειριακή και δυαδική). Να εκτυπώνει το αποτέλεσμα και για τις δύο μεθόδους.
Να γράψετε ένα πρόγραμμα στη ΓΛΩΣΣΑ που να διαβάζει τις βαθμολογίες 15 μαθητών, να τις αποθηκεύει σε έναν πίνακα και να αναζητά αν ένας μαθητής έχει μια συγκεκριμένη βαθμολογία χρησιμοποιώντας σειριακή αναζήτηση.
Να γράψετε ένα πρόγραμμα στη ΓΛΩΣΣΑ που να διαβάζει 10 ονόματα (ταξινομημένα αλφαβητικά) από τον χρήστη, να τα αποθηκεύει σε έναν πίνακα και να αναζητά αν ένα όνομα που θα δώσει ο χρήστης υπάρχει στον πίνακα χρησιμοποιώντας δυαδική αναζήτηση.
Να γράψετε ένα πρόγραμμα στη ΓΛΩΣΣΑ που να διαβάζει 20 ταξινομημένους αριθμούς από τον χρήστη, να τους αποθηκεύει σε έναν πίνακα και να αναζητά αν υπάρχει ένας αριθμός μέσα σε ένα εύρος που θα δώσει ο χρήστης (π.χ. μεταξύ 10 και 20).