iPhone/Android アプリのユーザーが検索する必要がある文字列の大きなリストがあります。文字列はアルファベット順にソートされていますが、検索クエリが文字列の先頭だけでなく文字列内のどこかにある場合、文字列を結果に含める必要があるため、実際にはそれほど有用ではありません。ユーザーが検索クエリを入力しているときに、現在入力した内容の結果を反映するように検索を更新する必要があります。(たとえば、「cat」と入力すると、「c」、「ca」、および「cat」の結果が表示されます)。
私の現在のアプローチは次のとおりです。
空から始まる「検索結果」のスタックがあります。ユーザーが検索クエリを長くするために何かを入力した場合、現在の検索結果をスタックにプッシュし、現在の検索結果のみを検索して新しい結果を検索します (何かが完全な文字列リストにあることは不可能ですが、現在のリストにはありません)。この場合の結果)。
ユーザーがバックスペースを押した場合、検索結果をスタックからポップして復元するだけで済みます。これはほぼ瞬時に実行できます。
このアプローチは、「後方」検索 (検索クエリを短くする) や、検索クエリがすでに十分に長く、結果の数が少ない場合に最適です。ただし、ユーザーが入力する最初の数文字のそれぞれについて、文字列の完全なリストを O(n) 時間で検索する必要があり、非常に時間がかかります。
私が検討したアプローチの 1 つは、2 文字または 3 文字の可能なすべての検索クエリの結果を事前にコンパイルしたリストを用意することです。このアプローチの問題点は、26^2 または 26^3 のようなリストが必要になり、かなりのスペースを占有することです。
考えられる他の最適化または代替アプローチはありますか?