辞書内の単語をすばやく検索するために DAWG を使用していると思います。DAWG にはO(LEN)
検索の複雑さがあります。
何年も前に、私は J2ME アプリを開発し、同じ問題に直面しました。しかし、その時代の電話は、500K以上の文字列を保存するために、そのようなRAM量のRAMメモリを明確に提供できませんでした)私が使用した解決策は次のとおりです:
- すべての単語を読み取り、並べ替え、ファイルに行ごとに入れ、単語ごとに precompute し
skipBytes
ます。- このワードの前のバイト数。skipBytes の計算は簡単です。擬似コードは
skipBytes[0]=words[0].bytesLen;
for i=1 to n skipBytes[i]=skipBytes[i-1]+words[i].getBytesLength
- アプリの起動時に、500k skipBytes を int 配列に読み取ります。500K 文字列よりもはるかに小さい)
- dict 内の単語の検索 - 二分検索。
array[i]
ソートされた配列でそれを実行していると想像してくださいRandomAccessFile.read(skipBytes[i])
。Google Java Random Access Files 私の疑似コードはもちろん間違っています。それは単なる方向性です。
複雑さ - O(LEN*LOG(N))
= 二分探索の LOG と文字列の比較は、線形の複雑さです。LOG(500000)~19, LEN ~ 最悪の場合の平均単語長は 50 (素晴らしい上限) であるため、検索操作は依然として非常に高速であり、マイクロ秒で実行される操作はわずか 1000 回程度です。利点 - メモリ使用量が少ない。
Web アプリの場合、多くのユーザーが検索を実行する場合LOG(N)
は重要になりますが、アプリが 1 人だけにサービスを提供する場合、ループ内で実行されていない場合、LOG(500000) はあまり変化しません)