Ορθότητα δυαδικής αναζήτησης — DedSec Project
Δυαδική αναζήτηση — ο αριστερότερος δείκτης εισαγωγής Προϋποθέσεις και στόχος Ένα τοπικό ευρετήριο αποθηκεύει ταξινομημένους αριθμητικούς κωδικούς. Ζητείται η πρώτη θέση όπου η τιμή δεν…
Δυαδική αναζήτηση — ο αριστερότερος δείκτης εισαγωγής
Προϋποθέσεις και στόχος
Ένα τοπικό ευρετήριο αποθηκεύει ταξινομημένους αριθμητικούς κωδικούς. Ζητείται η πρώτη θέση όπου η τιμή δεν είναι μικρότερη από τον κωδικό αναζήτησης. Αν όλες οι τιμές είναι μικρότερες, το αποτέλεσμα είναι το μήκος της λίστας. Με επαναλαμβανόμενες τιμές πρέπει να επιστρέφεται η πρώτη θέση, όχι οποιαδήποτε αντιστοίχιση. Η ταξινόμηση αποτελεί προϋπόθεση: σε αταξινόμητα δεδομένα η διχοτόμηση μπορεί να δώσει λανθασμένο αλλά φαινομενικά λογικό αποτέλεσμα.
Εκτελέσιμο πρόγραμμα Python 3
Αποθήκευσε ως binary_search_lab.py και εκτέλεσε python3 binary_search_lab.py. Η συνάρτηση συγκρίνεται με την bisect_left της τυπικής βιβλιοθήκης για κενές λίστες, διπλότυπα και τιμές έξω από τα όρια.
from bisect import bisect_left
def lower_bound(items, target):
low, high = 0, len(items)
while low < high:
mid = (low + high) // 2
if items[mid] < target:
low = mid + 1
else:
high = mid
return low
for row, targets in [
([], [-1, 0]),
([1,1,2,4], [0,1,2,3,4,5]),
([-5,0,0,8], [-8,-5,0,1,9])
]:
for target in targets:
index = lower_bound(row, target)
assert index == bisect_left(row, target)
assert all(value < target for value in row[:index])
assert all(value >= target for value in row[index:])
print("PASS: leftmost insertion, duplicates, empty and boundaries")
Απόδειξη ορθότητας
Σε κάθε επανάληψη το διάστημα [low, high) περιέχει τον πρώτο επιτρεπτό δείκτη εισαγωγής. Όσα στοιχεία προηγούνται του low είναι μικρότερα από τον στόχο, ενώ όσα βρίσκονται από το high και μετά είναι μεγαλύτερα ή ίσα. Αν το μεσαίο στοιχείο είναι μικρότερο, μετακινούμε το low στο mid+1. Διαφορετικά, η σωστή θέση βρίσκεται στο mid ή αριστερότερα και μεταφέρουμε το high στο mid. Το διάστημα μικραίνει αυστηρά μέχρι οι δύο δείκτες να συμπέσουν. Για n ταξινομημένα στοιχεία απαιτούνται O(log n) συγκρίσεις και O(1) βοηθητική μνήμη.
Ασκήσεις με σαφή αναμενόμενα αποτελέσματα
- Άλλαξε τη σύγκριση σε μικρότερο-ή-ίσο και παρατήρησε πώς τα διπλότυπα οδηγούν στη δεξιά θέση εισαγωγής.
- Δοκίμασε κενή λίστα, μία τιμή, ίδιες τιμές, αρνητικά και απούσα τιμή. Πρόβλεψε πρώτα κάθε δείκτη.
- Εφάρμοσε τη συνάρτηση σε αταξινόμητη λίστα και κατέγραψε την παραβίαση του συμβολαίου. Αποφάσισε αν θα γίνεται ταξινόμηση από τον καλούντα ή απόρριψη.
- Γράψε παραλλαγή που επιστρέφει δείκτη υπαρκτής τιμής ή None. Εξήγησε γιατί η αρχική λύση βοηθά και σε αναζητήσεις διαστήματος.
Παραδοτέα: PASS, περιγραφή του αμετάβλητου διαστήματος και τουλάχιστον δέκα οριακές συγκρίσεις.