私はたまたまPythonで二分探索を構築していますが、問題は二分探索構造全般に関係しています。
二分探索を使用して検索している約1000の適格な候補があると仮定しましょう。ソートされたデータセットを二等分し、このプロセスを繰り返して適格なセットを絞り込んで繰り返します。候補は単なる名前の文字列です (「ピーター ジャクソン」などの最初から最後までの形式)。
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
ここから適応したこのコード: https://stackoverflow.com/a/212413/215608
これが問題です。上記の手順では、完全に一致するものが 1 つあるか、結果がまったくないことを前提としています。クエリが単に "Peter" に対するものであったが、姓の異なる複数の Peter がいる場合はどうなるでしょうか? すべてのピーターを返すには、二分された「ビン」が、適格な結果を除外するほど小さくならないようにする必要があります。すべてのピーターを返すには、二分プロセスを停止して、正規表現/通常の古い文字列の一致のようなものに譲る必要があります。
私は、このタイプの検索が何と呼ばれるかほど、これを達成する方法を尋ねているわけではありません...「ビンサイズ」の区切り基準を持つバイナリ検索は何と呼ばれていますか? 条件付きでデータセットを二等分し、基準が満たされると、クエリに効果的に末尾のワイルドカードが存在することを保証するために、他の形式の文字列一致にフォールバックするもの (したがって、"Peter" の検索は "ピーター・ジャクソンズ」と「ピーター・エドワーズ」)
うまくいけば、私が何を意味するのかが明確になりました。典型的な DB シナリオでは、名前が分離されている可能性があることを認識しています。これは、概念実証として意図されているだけです。