0

私の問題は、配列に昇順で重複のない符号なし整数を含む巨大なテキスト ファイル (UTF-8 -1 バイト (ANSI)) を取得することです。速い!だから私は次のようなものに行きました:

while(scan.hasNextInt()) x.add(scan.nextInt());

しかし、ArrayList、Vectors、または何百万もの整数を含むファイルを含む単純な配列のいずれを使用する場合でも、後で配列サイズを大きくしないようにするために必要な最大容量を決定するのが賢明です。

File.length() を使用すると、ファイル内の桁数 + 改行数が取得されます。

最悪の場合、それは 0 から始まり、各行で 1 だけ増加します
。容量は組み合わせ論を使用して計算できますが、私は行き止まりです。小さい数字がゼロ (002) で埋められないという事実は、どういうわけか私をうんざりさせます.

最初の Int のサイズを考慮すると、実際の金額にもう少し近づくこともできると思います。

したがって、私の最も重要な質問は、[O(1) で] 必要な最大容量の概算を計算することです。

さらに、このかなりユニークな問題を考慮して scan.hasNextInt() と scan.nextInt() が最速であるかどうか、およびスレッドを介した並列化がプロセスをさらに高速化できるかどうかを自問しています(おそらくハードドライブからの読み取り機能を考慮して)いいえ)。

よろしくハロー

4

1 に答える 1

1

2 つの数値を区切るために使用されるバイトが 1 つだけであると仮定すると (たとえば、「\n」)、次のようになります。

  • 1桁の10個の数字 -> 20バイト
  • 2 桁の数字 90 個 -> 270 バイト
  • 3 桁の数字 900 個 -> 3600 バイト
  • ...パターンがわかります

ファイル サイズが 1000 バイトの場合、最大で 10 1 桁、2 桁が 90 桁、残りの 3 桁の数字は 710 バイトです。710/4 = 177.5 で、最大で 10+90+177 = 277 の数になります。

于 2013-01-13T20:39:57.783 に答える