4

私のプログラムには、新しい要素が配列の最後まで1つずつ成長する、成長する配列がたくさんあります。リストは、配列に比べてアクセス時間が遅いため、プログラムの重要な部分で速度のボトルネックであることがわかりました。配列に切り替えると、パフォーマンスが許容レベルまで大幅に向上しました。配列を大きくするには、Array.Resize を使用しています。私の実装では配列サイズが約 20 要素に制限されているため、これはうまく機能するため、Array.Resize の O(N) パフォーマンスは制限されます。

しかし、Array.Resize を使用せずに、最後に配列を 1 要素だけ増やす方法があれば、より良いでしょう。古い配列を新しいサイズの配列にコピーすると思います。

私の質問は、List または Array.Resize を使用せずに、配列の末尾に 1 つの要素を追加するためのより効率的な方法はありますか?

4

7 に答える 7

10

AListは、配列と同じように一定時間アクセスできます。「成長する配列」については、実際に使用する必要がありますList

配列に裏打ちされた構造に要素を追加する可能性があることがわかっている場合、一度に 1 つの新しいサイズを追加したくはありません。通常は、配列がいっぱいになったときにサイズを 2 倍にして、配列を拡張するのが最善です。

于 2010-02-16T10:24:39.977 に答える
1

List は最初に 4 つの要素を割り当て (作成時に容量を指定しない限り)、4 つの要素ごとに拡大します。

Array で同様のことを試してみませんか? つまり、4 つの要素を持つように作成し、次に 5 番目の要素を挿入するときに、最初に別の 4 つの要素で配列を拡張します。

于 2010-02-16T10:26:03.050 に答える
0

私の知る限り、配列を大きくするということは、新しい配列が割り当てられ、既存のコンテンツが新しいインスタンスにコピーされることを意味します。これは使用するよりも高速であるとは思えませんList...?

于 2010-02-16T10:28:28.160 に答える
0

チャンク (10 など) で配列のサイズを変更し、これを容量などの別の変数として格納し、容量に達したときにのみ配列のサイズを変更する方がはるかに高速です。これはリストの仕組みですが、配列を使用したい場合は、特に多数の Array.Resize 呼び出しがある場合は、より大きなチャンクでサイズを変更することを検討する必要があります

于 2010-02-16T10:32:38.613 に答える