Mi sembra che stia costruendo la ricerca binaria in Python, ma la questione ha più a che fare con la struttura di ricerca binaria in generale.Ricerca stringa binaria - larghezza minima del cestino?
Supponiamo di avere circa un migliaio di candidati idonei che sto cercando utilizzando la ricerca binaria, facendo l'approccio classico di bisecare il set di dati ordinato e ripetere questo processo al fine di restringere il set idoneo per iterare sopra. I candidati sono solo stringhe di nomi, (prima ultimo formato, ad esempio, "Peter Jackson") inizialmente a ordinare il set in ordine alfabetico e quindi procedere con bisezione usando qualcosa di simile:
hi = len(names)
lo = 0
while lo < hi:
mid = (lo+hi)//2
midval = names[mid].lower()
if midval < query.lower():
lo = mid+1
elif midval > query.lower():
hi=mid
else:
return midval
return None
Questo codice adattato da qui: https://stackoverflow.com/a/212413/215608
Ecco la cosa, la procedura precedente presuppone una singola corrispondenza esatta o nessun risultato. Che cosa succede se la query è stata solo per un "Peter", ma ci sono diversi peters con cognomi diversi? Al fine di restituire tutti i Peters, si dovrebbe garantire che i "bidoni" bisecati non siano mai stati così piccoli da escludere i risultati ammissibili. Il processo di bisection dovrebbe cessare e cedere a qualcosa come una regex/normale vecchia stringa per far tornare tutti i Peters.
io non sono così tanto che chiede come fare questo come ciò che questo tipo di ricerca è chiamato ... che cosa è una ricerca binaria con un criterio delimitati per "dimensioni bin" chiamato? Qualcosa che condiziona in modo condizionale il set di dati, e una volta che i criteri sono soddisfatti, ricade su qualche altra forma di abbinamento di stringhe per garantire che possa effettivamente essere un carattere jolly finale sulla query (quindi una ricerca per un "Peter" otterrà " Peter Jacksons "e" Peter Edwards ")
Spero di essere stato chiaro cosa intendo. Mi rendo conto che nel tipico scenario DB i nomi potrebbero essere separati, questo è solo inteso come una prova di concetto.
nel peggiore dei casi potrebbe essere tutto peters, non è possibile? – kdubs
Infatti, nello scenario peggiore (o dovrei dire quello previsto?) Tutto il Peters verrebbe scoperto. – DeaconDesperado
quindi sembra che avresti dovuto bin in base a ciò che si potrebbe cercare. Immagino che tu possa fare un binario finché non hai trovato una corrispondenza, e poi fare una ricerca lineare in entrambe le direzioni per trovare tutte le altre partite. non sono sicuro se lo chiamerei bins, ma i tuoi dati saranno organizzati in un albero binario e lineare. – kdubs