Zdarza się, że buduję wyszukiwanie binarne w Pythonie, ale pytanie ma więcej wspólnego z ogólną strukturą wyszukiwania binarnego.Wyszukiwanie binarne ciągów - minimalna szerokość kosza?
Załóżmy, że mam około tysiąca kwalifikujących się kandydatów, których przeszukuję, korzystając z wyszukiwania binarnego, wykonując klasyczne podejście dzielenia posortowanego zestawu danych i powtarzania tego procesu w celu zawężenia kwalifikującego się zestawu do iteracji. Kandydaci są tylko ciągi nazw, (pierwszy-ostatni formatu, np „Peter Jackson”) początkowo posortować ustawione alfabetycznie, a następnie postępuj zgodnie ze wskazówkami bisekcji użyciu coś takiego:
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
Ten kod dostosowany stąd: https://stackoverflow.com/a/212413/215608
Oto rzeczy, powyższa procedura zakłada pojedynczy dokładny mecz lub brak wyniku. Co jeśli zapytanie dotyczyło tylko "Piotra", ale jest kilka peterów o różnych nazwiskach? Aby zwrócić wszystkich Petersów, należałoby się upewnić, że podzielone na dwie części "kosze" nigdy nie były tak małe, jak tylko przy uwzględnieniu kwalifikujących się wyników. Proces bisekcji musiałby zakończyć się i przekształcić w coś podobnego do regex/regularnego starego dopasowania, aby zwrócić wszystkich Peters.
Nie jestem tak bardzo pytający, jak to osiągnąć, jako , co to jest wyszukiwanie o nazwie ... co to jest wyszukiwanie binarne z ograniczonymi kryteriami dla "rozmiaru bin" o nazwie? Coś, co warunkowo przecina zbiór danych, a po spełnieniu kryteriów, powraca do innej formy dopasowywania ciągów znaków w celu zapewnienia, że w zapytaniu może być skutecznie kończąca się wieloznacznikowa (tak, aby wyszukiwane było słowo "Peter"). Peter Jacksons "i" Peter Edwards ")
Mam nadzieję, że jasne było, co mam na myśli. Zdaję sobie sprawę, że w typowym scenariuszu DB nazwy mogą być rozdzielone, co ma służyć jedynie jako dowód koncepcji.
w najgorszym przypadku może to być cały peters, czyż nie? – kdubs
Rzeczywiście, w najgorszym scenariuszu (czy powinienem powiedzieć, że zamierzałem?) Wszyscy Peterzy zostaną sprowadzeni. – DeaconDesperado
, więc wydaje się, że musiałbyś sortować według tego, czego możesz szukać. Zgaduję, że możesz zrobić plik binarny, dopóki nie znajdziesz dopasowania, a następnie wykonać liniowe wyszukiwanie w obu kierunkach, aby znaleźć wszystkie inne dopasowania. nie jestem pewien, czy nazwałbym te pojemniki, ale twoje dane zostaną uporządkowane w drzewo binarne i liniowe. – kdubs