効率性は、可能な単語の辞書がどのように構成されているかに大きく依存します。アルファベット順(Java配列またはArrayList)で構成されている場合、有効な組み合わせが構築されている(左から右へ)かどうかを確認すると、多数のチェックが除外されます。例えば、A JavaのTreeMapのがさらに良くデータすることができ
...「... ND」をチェックし、それから始まる全く言葉がNDLLO、NDLLK、NDLLL、NDLOOをチェック
ないことで時間を節約しません見つけます構造体はインクリメンタルサーチのために使用されますが、単語のソースが注文されている場合は単純な配列よりも構築に時間がかかり、メモリを増やす可能性があり、単純にすべての単語を含むファイルから配列に追加しています。
TreeMapとOrdersListのバイナリ検索は、それぞれO(log n)時間かかるので、最初の文字が可能な限り一致しなくなるとすぐに単語を除外することができます。 "NDA"のような略語を含む非常に徹底的な辞書は、より多くをチェックします。小さな辞書は、2文字の組み合わせにつき1つまたは2つの小切手しか必要としないことがあります(1つの文字が常に単語を開始するので、
初期設定時にO(n)ルックアップを行うために、単語セット(たとえば、Java HashMapを使用)のすべての単語の最初の数文字をハッシュすることができます。速度。 (HE、HEL、HELL、HELLO、YE、YEL、...大きなメモリコストです)すべてのインクリメンタルな可能性をハッシュした場合、インクリメンタルチェックはすべてO(n)になります。言葉を排除する。
より洗練:我々はワードセットの編成の制御を持っている場合、我々は素数のモジュロを使用して文字の異なる順序で単語を注文することができます:
"HELLO" rearranged by mod 7, for example would be: "HLOEL"
これは、より良い性能を与えることができるので、共通の接頭語の周りに自然に発生するクラスタリングのいくつかを削除します。素数が高いほど、(フラットな)分布が良くなります。これを最初のn回のルックアップでハッシュと組み合わせると、O(n)とO(log n)の間でパフォーマンスが変化します。
改善が必要な既存の非効率的な実装について教えてください。 –
@RichardTingle私はまだコードを書いていません。何が私の心に来るのかは非常に効率が悪かったので、私が始める前にいくつかの提案を集めることを考えました。 – daipayan