Η δυαδική αναζήτηση είναι ένας γρήγορος τρόπος να βρεις έναν στόχο σε μια ταξινομημένη λίστα. Ελέγχεις το μεσαίο στοιχείο, αποκλείεις το μισό από τις υπόλοιπες τιμές και επαναλαμβάνεις. Αν η λίστα δεν είναι ταξινομημένη, αυτή η λογική δεν ισχύει.

Σε μια αύξουσα λίστα, ο κανόνας είναι απλός: αν η μεσαία τιμή είναι μικρότερη από τον στόχο, ψάχνεις δεξιά· αν είναι μεγαλύτερη, ψάχνεις αριστερά. Επειδή το εύρος μικραίνει κάθε φορά περίπου στο μισό, η δυαδική αναζήτηση εκτελείται σε χρόνο O(logn)O(\log n).

Πώς λειτουργεί η δυαδική αναζήτηση σε μια ταξινομημένη λίστα

Χρησιμοποίησε την παρακάτω ταξινομημένη λίστα:

[3,7,12,18,24,31,39,45,52][3, 7, 12, 18, 24, 31, 39, 45, 52]

Έστω ότι ο στόχος είναι το 3131.

Ξεκινάς με όλο το εύρος. Η μεσαία τιμή είναι το 2424. Εφόσον 31>2431 > 24, όλα όσα βρίσκονται αριστερά του 2424 μπορούν να απορριφθούν, οπότε η αναζήτηση συνεχίζεται στο

[31,39,45,52][31, 39, 45, 52]

Τώρα η μεσαία τιμή είναι το 3939. Εφόσον 31<3931 < 39, όλα όσα βρίσκονται δεξιά του 3939 μπορούν να απορριφθούν, οπότε το εύρος γίνεται

[31][31]

Τώρα η μεσαία τιμή είναι το 3131, άρα η αναζήτηση σταματά. Η χρήσιμη ιδέα δεν είναι μόνο ότι βρέθηκε ο στόχος. Σε δύο συγκρίσεις, το υποψήφιο εύρος έπεσε από 99 τιμές σε 11.

Γιατί η δυαδική αναζήτηση είναι O(logn)O(\log n)

Κάθε σύγκριση αποκλείει περίπου τους μισούς από τους υποψήφιους που απομένουν. Μετά από ένα βήμα, απομένουν περίπου n/2n/2 στοιχεία. Μετά από δύο βήματα, απομένουν περίπου n/4n/4. Μετά από kk βήματα, το μέγεθος που απομένει είναι περίπου

n2k\frac{n}{2^k}

Η αναζήτηση ολοκληρώνεται όταν αυτή η ποσότητα γίνει περίπου 11, άρα ο αριθμός των βημάτων ικανοποιεί τη σχέση

2kn2^k \approx n

Παίρνοντας log2\log_2 και στα δύο μέρη, προκύπτει

klog2nk \approx \log_2 n

Γι’ αυτό η δυαδική αναζήτηση κλιμακώνεται καλά. Μια γραμμική αναζήτηση μπορεί να χρειαστεί έως και nn ελέγχους, αλλά η δυαδική αναζήτηση χρειάζεται μόνο τόσους ελέγχους όσους απαιτούνται για να υποδιπλασιάζεται συνεχώς το εύρος.

Παράδειγμα κώδικα δυαδικής αναζήτησης

Ακολουθεί μια τυπική επαναληπτική έκδοση σε Python:

Χρειάζεσαι βοήθεια με μια άσκηση;

Ανέβασε την ερώτησή σου και πάρε επαληθευμένη λύση βήμα-βήμα σε δευτερόλεπτα.

Άνοιξε το GPAI Solver →