4

私の辞書には300000語があります(実際には、AndroidデバイスのSDカードにtxt形式(改行で区切られています)で保存されています)。このデータ構造にtxtファイルから単語(String-s)を挿入するのにできるだけ時間がかからないデータ構造を構築したいと思います。そして、このDSは、単語が辞書(このDS)に存在するかどうかをチェックするために超高速でなければなりません。私はいくつかの組み込みDSを試しましたが、最速のIMOはTreeSetでした。DSの挿入/作成がより高速で、検索用のTreeSetと同等である他の(組み込みではない)DSはありますか?

そしてもう1つ、txtファイルを再配置する(単語を適切な順序に並べる)ことで、TreeSetの挿入を高速化する方法があります。

よろしく

4

1 に答える 1

5

まず、アプリケーションに最適な構造を見つけるための実験を行いました。多くの場合、実際のパフォーマンスデータを取得するためのさまざまなオプションを試さずに議論するでしょう。

ビルド時間を節約したいが、wordsファイルがあまり頻繁に変更されない場合、ビルド速度の明らかな改善はデータ構造のキャッシュです。使用しているデータ構造が何であれ、構造を一度構築してから、構造をSDカードに保存します(文字列を保存するだけではありません)。標準のjava.util構造は、 Serializationを使用して保存できます。

ビルド時間を最速にし、単語リストをアルファベット順に並べ替える、または並べ替えることができる場合は、文字列配列に格納するだけで済みます。ビルド時間は再び非常に速くなり、検索時間はTreeSetと同様になります(Arrays.binarySearch()を使用)。

より高速なルックアップが必要な場合は、Perfect HashingまたはTrieをチェックすることをお勧めしますが、これらはJava標準ライブラリにはありません。

トライは、これらのいずれよりもはるかにメモリ効率が高く、より高速になる可能性があります。(実装の検索に関する情報

実験では、TreeSetがHashSetよりも高速であることに驚いています。つまり、メモリ割り当てが高額な状況で操作している可能性があります。HashSetを割り当てたときに初期容量を設定したことを覚えていますか?高価な再ハッシュを避けることを忘れないでください。初期容量を少なくともアイテム数/0.75(負荷率)に設定する必要があります。

于 2011-06-16T11:50:42.057 に答える