2011-12-10 5 views
0

私は自分のコードに問題があるので、どの構造体が最速であるかを調べようとしています。私は大量のデータを保存しています。たぶん何千ものノードが必要になるかもしれません。私の最初の考えはArrayListを作成することでしたし、後でそれらを使うために整数を追加し始めました。このArrayListは、ランダムアクセスファイルのバイトに高速アクセスするのに便利です。したがって、最初のノードは、ランダムアクセスファイルの最初のエントリへのポインタを表します。次に、同じ方法で、2番目を配置します。整数を処理するための最も速い構造体は何ですか(何千ものノードから読み込み、追加します)

整数をArrayListに入れるときに、プログラムが時間がかかりすぎます。 より速い構造を使用してコードを修正できますか? ArrayListintが、Integerラッパー型が含まれていないため

答えて

1

アンArrayListは、明らかにここで最速のものではありません。したがって、プレーンな配列int[] intArrayは最小のオーバーヘッドを持っています。

一方、リスト/配列を完全に省略して計算を瞬時に行うことができれば、オーバーヘッドはいくらか増えます。これはマイクロオプティマイゼーションを行わず、問題を考え、おそらく全く異なるアルゴリズムを使用するという方向につながります。

+0

お返事ありがとうございます。 Unfortunateley、私は上記の情報をどこかに保管する必要があります。なぜなら、ディスク上のファイルに書き込む必要があるからです。 – limas

2

はい、

あなたがLinkedListを使用することができ、あなたのArrayListのはO(1)の挿入をamartizedしているが、あなたは巨大な配列リストを持っており、それはサイズを変更する必要があるとき、それは新しいのArrayListを割り当てるために長い時間がかかるだろう、コピー現在の要素を削除し、続行します。

例:あなたがあなたのarraylistに1000万の要素を持っていて、それがいっぱいの場合、もう1つを挿入すると、arraylistは現在のサイズを倍にしてから、すべての要素を新しいものにコピーする必要があります。これは非常に高価な操作です。

LinkedListを使用する場合は、O(1)挿入がありますが、ランダムアクセスはありません。したがって、n番目の要素にアクセスする場合は、すべてのノードをn個までトラバースする必要があります。それはO(n)を要する。しかし、あなたは本当にそれをしますか?

リンクリストはあなたのオプションです。恐らくdoubly linked listです。

高速読み込みと高速挿入が必要な場合は、Dictionary、HashMapを使用できます。完璧なハッシュがある場合に限り、O(1)の書き込みと読み取りを行います。

しかし、内部的には、HashTable辞書は配列を使用するため、辞書が大きくなりすぎると同じ問題が発生し、配列が展開されるたびにハッシュコードが再計算されます。

Lognの書き込みと読み取りでツリーを使用できます。

Skiplistをlognの書き込みと読み取りに使用できます。

+0

詳しい解説ありがとうございました。私はハッシュ構造が非常に速いことを知っていますが、この時点では、ランダムアクセスファイルへのポインタのシーケンスを保持するだけです。だから、私はエントリが発生するバイトの数を維持する必要があります。だから、私の構造は、整数の大きなシーケンスが含まれます。私は二重リンクリストについて知らなかった。言及いただきありがとうございます。 LinkedListにフラグメント化されたメモリが必要かどうか知っていますか?再割り当ての問題を避けるために。 – limas

関連する問題