Δυαδική αναζήτηση: Διαφορά μεταξύ των αναθεωρήσεων

Περιεχόμενο που διαγράφηκε Περιεχόμενο που προστέθηκε
μ Ρομπότ: Μεταφέρω 31 σύνδεσμους interwiki, που τώρα παρέχονται από τα Wikidata στο d:Q243754
Χωρίς σύνοψη επεξεργασίας
Γραμμή 7:
==Περιγραφή==
 
Ο αλγόριθμος δέχεται ως είσοδο έναν ταξινομημένο μονοδιάστατο πίνακα (διάνυσμα) και μια τιμή που ονομάζεται ''κλειδί''. Επιστρέφει την θέση του κλειδιού στο διάνυσμα ή μια ειδική ένδειξη για να ενημερώσει ότι το κλειδί δεν υπάρχει στο διάνυσμα, αν αυτή είναι η περίπτωση. Το διάνυσμα μπορεί να είναι ταξινομημένο είτε σε αύξουσα σειρά είτε σε φθίνουσα, αλλά και στις δύο περιπτώσεις ο αλγόριθμος λειτουργεί σωστά (με τις κατάλληλες τροποποιήσεις) και καταναλώνειδέχεταλώνει τον ίδιο χρόνο. Λόγω της ισοδυναμίας αυτής, μπορούμε χωρίς βλάβη της γενικότητας, να θεωρήσουμε ότι το διάνυσμα είναι ταξινομημένο κατά αύξουσα σειρά.
 
Επειδή το διάνυσμα είναι σε αύξουσα σειρά, η τιμή του στοιχείου στη θέση i του διανύσματος θα είναι μικρότερη ή ίση από όλα τα στοιχεία δεξιά και μεγαλύτερη ή ίση από όλα τα στοιχεία αριστερά (η ισότητα μπορεί να προκύψει μόνο στην περίπτωση που υπάρχουν επαναλαμβανόμενες τιμές). Έτσι, αν σε μια σύγκριση, το κλειδί είναι μεγαλύτερο από το στοιχείο στη θέση i, δεν έχει νόημα να κάνουμε συγκρίσεις με τα στοιχεία που βρίσκονται σε θέση j<i (δηλαδή, αριστερά από τη θέση i). Αυτήν ακριβώς την ιδιότητα εκμεταλλεύεται η δυαδική αναζήτηση, ώστε να μειώσει κατά το δυνατό τις συγκρίσεις που κάνει.
Γραμμή 23:
Αν (j < i) τότε
επίστρεψε "Δεν βρέθηκε" και τερμάτισε.
μ = <math>\lfloor (i+j)/2, \rfloor</math>μ)
Αν (κλειδί = Δ[μ]) τότε
επίστρεψε μ και τερμάτισε
αλλιώς αν (κλειδί > Δ[μ]) τότε
Δυαδική_αναζήτηση(Δ[1...n], κλειδί, μ, j)
αλλιώς
Δυαδική_αναζήτηση(Δ[1...n], κλειδί, i, μ)
}
Ο παραπάνω ψευδοκώδικας περιγράφει την αναζήτηση του ''κλειδιού'' στο διάνυσμα ''Δ'' μεγέθους n, μεταξύ των θέσεων i και j. Για να γίνει η αναζήτηση σε όλο το διάνυσμα, θέτουμε i=1 και j=n και εκτελούμε τον αλγόριθμο.