Σειριακή αναζήτηση
Η σειραική αναζήτηση είναι η πιο απλή μέθοδος αναζήτησης. Προκειμένου να βρούμε μια τιμή σε ένα πίνακα, το μόνο που έχουμε να κάνουμε είναι να ελέγξουμε τα κελιά ένα ένα ξεκινώντας από το πρώτο και πηγαίνοντας μετά στο δεύτερο κοκ. Σε ένα μη ταξινομημένο πίανκα η σειριακή είναι η μόνη μέθοδος αναζήτησης που μπορεί να χρησιμοποιηθεί. Αν όμως ο πίνακας είναι ταξινομημένος τότε υπάρχουν ταχύτερες μέθοδοι (τεχνικές) όπως π.χ. η δυαδική ανζήτηση.
Έστω οτι θέλουμε να δούμε αν υπάρχει το όνομα “Γιώργος”σε πίνακας Π[100] και αν υπάρχει να εμφανίζεται ο αριθμός του κελιού στο οποίο εντοπίστηκε. Υπάρχουν διάφορες παραλλαγές τη σειριακής αναζήτησης που θα δούμε παρακάτω.
Περίπτωση 1
Ο πίνακας δεν είναι ταξινομημένος και το όνομα “Γιώργος” μπορεί να μην υπάρχει ή αν υπάρχει να εμφανίζεται τουλάχιστον μία φορά.
Αλγόριθμος περ1
Για i απο 1 μεχρι 100
Αν Π[i]="Γιώργος" τοτε
Εμφάνισε i
Τέλος_αν
Τέλος_επαναληψης
Τέλος περ1
Περίπτωση 2
Ο πίνακας δεν είναι ταξινομημένος και το όνομα “Γιώργος” εμφανίζεται το πολύ μία φορά. Μπορεί να χρησιμοποιηθεί ο προηγούμενος αλγόριθμος αλλά υπάρχει ταχύτερος.
Αλγόριθμος περ1
i <- 1
flag <- ψευδής
Όσο i<=100 και flag=ψευδής επανάλαβε
Αν Π[i]="Γιώργος" τοτε
Εμφάνισε i
flag <- αληθής
αλλιώς
i <- i + 1
Τέλος_αν
Τέλος_επαναληψης
Τέλος περ1
Περίπτωση 3
Ο πίνακας είναι ταξινομημένος αλφαβητικά (αύξουσα) και το όνομα “Γιώργος” εμφανίζεται καμία, μία ή περισσότερες φορές. Μπορεί να χρησιμοποιηθεί ο προηγούμενος αλγόριθμος αλλά υπάρχει ταχύτερος.
Αλγόριθμος περ1
i <- 1
Όσο i<=100 και Π[i]<="Γιώργος" επανάλαβε
Αν Π[i]="Γιώργος" τοτε
Εμφάνισε i
αλλιώς
i <- i + 1
Τέλος_αν
Τέλος_επαναληψης
Τέλος περ1
Περίπτωση 4
Ο πίνακας είναι ταξινομημένος αλφαβητικά (αύξουσα) και το όνομα “Γιώργος” εμφανίζεται ακριβώς μία φορά.
Αλγόριθμος περ1
i <- 1
flag <- ψευδής
Όσο flag=ψευδής επανάλαβε
Αν Π[i]="Γιώργος" τοτε
Εμφάνισε i
flag <- αληθής
αλλιώς
i <- i + 1
Τέλος_αν
Τέλος_επαναληψης
Τέλος περ1
Δυαδική αναζήτηση
Ο αλγόριθμος της δυαδικής αναζήτησης (binary search) εφαρμόζεται μόνο σε ταξινομημένους πίνακες. Αν ο πίνακας δεν είναι ταξινομημένος, τότε θα πρέπει να χρησιμοιήσουμε την σειραική αναζήτηση.
Ο αλγόριθμος λειτουργεί ως εξής:
- Βρίσκουμε το μεσαίο στοιχείο του ταξινομημένου πίνακα.
- Εάν το προς αναζήτηση στοιχείο είναι ίσο με το μεσαίο στοιχείο, τότε σταματάμε την αναζήτηση αφού το
στοιχείο βρέθηκε. - Εάν δε βρέθηκε, τότε ελέγχουμε αν το στοιχείο που αναζητούμε είναι μικρότερο ή μεγαλύτερο από το
μεσαίο στοιχείο του πίνακα. Αν είναι μικρότερο, περιορίζουμε την αναζήτηση στο πρώτο μισό του πίνακα
(με την προϋπόθεση ότι τα στοιχεία είναι διατεταγμένα κατά αύξουσα σειρά), ενώ αν είναι μεγαλύτερο
περιορίζουμε την αναζήτηση στο δεύτερο μισό του πίνακα. - Η διαδικασία αυτή επαναλαμβάνεται για το κατάλληλο πρώτο ή δεύτερο μισό του πίνακα, μετά για το 1/4
του πίνακα κ.ο.κ. μέχρι, είτε να βρεθεί το στοιχείο, είτε να μην είναι δυνατό να χωρισθεί ο πίνακας
περαιτέρω σε δύο νέα μέρη.
Ακολουθεί ο κώδικας της δυαδικής αναζήτησης του στοιχείου key σε ταξινομημένο πίνακα Α[20].
Αλγόριθμος Δυαδική_αναζήτηση !Αναζήτηση του key σε πίνακα A[20]
Α ← 1 ! αριστερό όριο
Δ ← 20 ! δεξιό όριο
Flag ← FALSE
Διάβασε key
Όσο (Α ≤ Δ) και (Flag = FALSE) επανάλαβε
M ← (Α + Δ) div 2
Αν A[M] = key τότε
Flag ← TRUE
αλλιώς_αν A[M] < key τότε
A ← M + 1
αλλιώς
Δ ← M - 1
Τέλος_αν
Τέλος_επανάληψης
Αν Flag = TRUE τότε
Εμφάνισε "Το στοιχείο,", key, "υπάρχει στη θέση:", Μ
αλλιώς
Εμφάνισε "Το στοιχείο,", key, " δεν υπάρχει στον πίνακα"
Τέλος_αν
Τέλος Δυαδική_αναζήτηση
Η παρακάτω διαδραστική παρουσίαση δείχνει με παράδειγμα τα βήματα της δυαδικής αναζήτησης. Πατήστε το πράσινο βελάκι για να προχωρήσετε στην επόμενη διαφάνεια.
Στην παρακάτω διαδραστική εφαρμογή μπορείτε να κάνετε δυαδική αναζήτηση με οποιοδήποτε αριθμό και να δείτε τα βήματα που ακολουθούνται.
Πληκτρολογήστε τον αριθμό που θέλετε να αναζητήσετε:
Ερωτήσεις ανάπτυξης απο Πανελλαδικές εξετάσεις
- (Ε2005-Θ1E) Αναφέρατε τις περιπτώσεις που δικαιολογείται η χρήση του αλγορίθμου της σειριακής αναζήτησης.
- (2013-A3β, B2013-A3β) Να γράψετε τις περιπτώσεις για τις οποίες δικαιολογείται η χρήση της σειριακής μεθόδου αναζήτησης σε έναν πίνακα.
- (E2017-A3β, ΕΕ2017-A3β) Ποιοι είναι οι δύο πλέον διαδεδομένοι αλγόριθμοι αναζήτησης; Ποιος είναι ο πλέον αποδοτικός και τι περιορισμό έχει;
- (ΕΒ2006-Θ1Δ) Δίνεται μονοδιάστατος μη ταξινομημένος πίνακας Τ με Ν διαφορετικά στοιχεία. Να γράψετε τον αλγόριθμο σειριακής αναζήτησης της τιμής μιας μεταβλητής key στον πίνακα Τ.
- (Ε2018-A3α, ΕΞ2018-A3α) Να αναφέρετε δύο περιπτώσεις στις οποίες συνίσταται η χρήση σειριακής αναζήτησης σε ταξινομημένο πίνακα.
- (E2011-Θ Α5, ΕΒ2011-Θ Α5) Δίνεται ο παρακάτω ημιτελής αλγόριθμος αναζήτησης ενός αριθμού key σε έναν αριθμητικό πίνακα table Ν στοιχείων, στον οποίο ο key μπορεί να εμφανίζεται περισσότερες από μία φορές.
Αλγόριθμος Αναζήτηση Δεδομένα // table, Ν, key // Βρέθηκε ← Ψευδής ΔενΒρέθηκε ← .................... i ← 1 Όσο ΔενΒρέθηκε = Αληθής και i <= Ν επανάλαβε Αν .................... τότε Εμφάνισε "Βρέθηκε στη θέση", i Βρέθηκε ← .................... Αλλιώς_αν .................... τότε ΔενΒρέθηκε ← .................... Τέλος_αν i ← i + 1 Τέλος_επανάληψης Αποτελέσματα // Βρέθηκε // Τέλος Αναζήτηση
Να ξαναγράψετε στο τετράδιό σας τον παραπάνω αλγόριθμο με τα κενά συμπληρωμένα, έτσι ώστε να εμφανίζονται όλες οι θέσεις στις οποίες βρίσκεται ο αριθμός key στον πίνακα table. Ο αλγόριθμος να σταματάει αμέσως μόλις διαπιστωθεί ότι ο αριθμός key δεν υπάρχει στον πίνακα. Εκμεταλλευτείτε το γεγονός ότι τα στοιχεία του πίνακα είναι ταξινομημένα σε αύξουσα σειρά. - (E2013-Α3, ΕΒ2013-Α3) Να γράψετε συμπληρωμένο στο τετράδιό σας το ακόλουθο τμήμα αλγορίθμου, το οποίο πραγματοποιεί αναζήτηση όλων των στοιχείων του πίνακα W[10] στον πίνακα S[1000], έτσι ώστε τα στοιχεία του πίνακα W[10] να καταλαμβάνουν συνεχόμενες θέσεις στον πίνακα S[1000]. Ο αλγόριθμος βρίσκει τη θέση i του S, απ’ όπου αρχίζει η πρώτη εμφάνιση των στοιχείων του W[10].
F ← ΨΕΥΔΗΣ i ← 1 ΟΣΟ ...... ΚΑΙ ...... ΕΠΑΝΑΛΑΒΕ j ← 0 ΟΣΟ ...... ΚΑΙ ...... ΕΠΑΝΑΛΑΒΕ j ← j + 1 ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ ΑΝ ...... ΤΟΤΕ F ← ΑΛΗΘΗΣ ΑΛΛΙΩΣ i ← i + 1 ΤΕΛΟΣ_ΑΝ ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ ΑΝ F = ΑΛΗΘΗΣ ΤΟΤΕ ΓΡΑΨΕ i ΑΛΛΙΩΣ ΓΡΑΨΕ 'ΔΕ ΒΡΕΘΗΚΕ' ΤΕΛΟΣ_ΑΝ
- (E2016-A5) Δίνεται ο πίνακας ΠΙΝ[7] με τις παρακάτω τιμές:
2 5 8 12 15 17 22 low ← 1 high ← 7 found ← ΨΕΥΔΗΣ ΟΣΟ low ≤ high ΚΑΙ found=ΨΕΥΔΗΣ επανέλαβε mid ← (low+high) DIV 2 ΕΜΦΑΝΙΣΕ ΠΙΝ[mid] ΑΝ ΠΙΝ[mid] < X ΤΟΤΕ low ← mid + 1 ΑΛΛΙΩΣ_ΑΝ ΠΙΝ[mid] > X ΤΟΤΕ high ← mid - 1 ΑΛΛΙΩΣ found ← ΑΛΗΘΗΣ ΤΕΛΟΣ_ΑΝ ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Να γράψετε στο τετράδιό σας τις τιμές οι οποίες θα εμφανιστούν για: α) Χ=22 β) Χ=7 - Δίνεται ο πίνακας ΠΙΝ[7] με τις παρακάτω τιμές:
2 5 8 12 15 17 22 - Δίνεται το παρακάτω τμήμα αλγορίθμου, στο οποίο έχουν αριθμηθεί οι εντολές εκχώρησης και εξόδου.01 ΔΙΑΒΑΣΕ Χ02 ΠΛ ← 003 ΑΡ ← 1
04 ΔΕ ← 12
05 Β ← ΨΕΥΔΗΣ
ΌΣΟ Β = ΨΕΥΔΗΣ ΚΑΙ ΑΡ <= ΔΕ ΕΠΑΝΑΛΑΒΕ
06 Μ ← (ΑΡ + ΔΕ) DIV 2
ΑΝ Α[Μ] = Χ ΤΟΤΕ
07 Β ← ΑΛΗΘΗΣ
ΑΛΛΙΩΣ_ΑΝ Α[Μ] < Χ ΤΟΤΕ
08 ΑΡ ← Μ + 1
ΑΛΛΙΩΣ
09 ΔΕ ← Μ – 1
ΤΕΛΟΣ_ΑΝ
10 ΠΛ ← ΠΛ + 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΝ Β = ΑΛΗΘΗΣ ΤΟΤΕ
11 ΕΜΦΑΝΙΣΕ Μ
ΑΛΛΙΩΣ
12 ΕΜΦΑΝΙΣΕ “ΔΕΝ ΒΡΕΘΗΚΕ”, ΠΛ
ΤΕΛΟΣ_ΑΝ
Για την παρακολούθηση της εκτέλεσης του τμήματος αλγορίθμου με τιμή εισόδου Χ = 35 και με
δεδομένο τον πίνακα
1 2 3 4 5 6 7 8 9 10 11 12 Α 3 10 18 20 26 32 35 48 55 60 75 90 - Στη στήλη με τίτλο «Αρ. Γρ.» καταγράφεται ο αριθμός γραμμής της εντολής που εκτελείται.
- Στη στήλη με τίτλο «Έξοδος» καταγράφεται η τιμή εξόδου, εφόσον η εντολή που εκτελείται είναι
- Οι υπόλοιπες στήλες του πίνακα αντιστοιχούν στις μεταβλητές του τμήματος του αλγορίθμου.
Αρ. Γρ. Χ ΠΛ ΑΡ ΔΕ Β Μ Έξοδος 01 35 02 0 03 1 04 12 05 ΨΕΥΔΗΣ … …….. - Δίνεται το παρακάτω τμήμα προγράμματος, που υλοποιεί τον αλγόριθμο της σειριακής αναζήτησης της τιμής της μεταβλητής Χ στον πίνακα ονομάτων ON, 100 θέσεων. Το τμήμα περιέχει κενά, τα οποία έχουν αριθμηθεί από [1] έως [5].done <– …[1]…position <– 0i <– …[2]… ΟΣΟ done = ΨΕΥΔΗΣ ΚΑΙ i <= …[3]… ΕΠΑΝΑΛΑΒΕ ΑΝ ON[i] …[4]…X ΤΟΤΕ done <– …[5]… position <– i ΑΛΛΙΩΣ i <– i + 1 ΤΕΛΟΣ_ΑΝ ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ Να γράψετε στο τετράδιό σας τους αριθμούς από [1] έως [5] που αντιστοιχούν στα κενά και, δίπλα από κάθε αριθμό, ό,τι πρέπει να συμπληρωθεί, ώστε το τμήμα προγράμματος να υλοποιεί τον αλγόριθμο. (EΞ2016-B1)
- Δίνεται μονοδιάστατος πίνακας Π[6] με τις τιμές που φαίνονται παρακάτω.
1 2 3 4 5 6 18 29 40 51 62 73 Χ Βρέθηκε Υπάρχει i 10 40 70 100 - Δίνεται ο παρακάτω αλγόριθμος ο οποίος ελέγχει αν το στοιχείο key βρίσκεται στον πίνακα table[n]τουλάχιστον τρεις (3) φορές και εμφανίζει τη θέση στην οποία βρίσκεται την τρίτη φορά.Αλγόριθμος Β1Δεδομένα // n, table, key // done ← ψευδής position ← 0 i ← 1 count ← …(1)… Όσο i <= …(2)… και done = …(3)… επανάλαβε Αν table[ …(4)… ] = key τότε count ← …(5)… Τέλος_αν Αν count = …(6)… τότε done ← …(7)… …(8)… ← i αλλιώς i ← …(9)… Τέλος_αν Τέλος_επανάληψης Αν …(10)… τότε Εμφάνισε “Το στοιχείο”, key, “υπάρχει τουλάχιστον 3 φορές.” Εμφάνισε “Για τρίτη φορά εμφανίζεται στη θέση “, position, “.” αλλιώς Εμφάνισε “Το στοιχείο”, key, “δεν υπάρχει τουλάχιστον 3 φορές.” Τέλος_αν Τέλος Β1 Να γράψετε στο τετράδιό σας τους αριθμούς των κενών και δίπλα ό,τι χρειάζεται να συμπληρωθεί έτσι ώστε ο αλγόριθμος να λειτουργεί σωστά. (Ε2019-Β1, Β2019-Β1)
- Το παρακάτω τμήμα προγράμματος σειριακής αναζήτησης σε πίνακα table[n] έχει πέντε (5) λάθη. Ναεντοπίσετε τις εντολές που περιέχουν λάθη και να γράψετε στο τετράδιό σας τον αριθμό (080 – 180)καθεμιάς λανθασμένης εντολής και δίπλα διορθωμένη την αντίστοιχη εντολή.080 done ← ψευδής 090 i ← 1 100 Όσο (done = ψευδής) ΚΑΙ (i>n) επανάλαβε 110 Αν table[1]=key τότε 120 done ← ‘αληθής’ 130 position ← i 140 αλλιώς 150 i ← i + 2 160 Τέλος_επανάληψης 170 Τέλος_επανάληψης 180 Γράψε position (B2019-B2)