[解決済み] ダイナミックアロケーションアレイの理想的な成長率は?
質問
C++にはstd::vector、JavaにはArrayListがあり、その他多くの言語には独自の形式の動的割り当て配列があります。動的配列の容量が不足すると、より大きな領域に再割り当てされ、古い値が新しい配列にコピーされます。このような配列の性能の中心的な問題は、配列のサイズがどの程度の速さで大きくなるかということです。もし、常に現在のプッシュが収まるだけの大きさにしか成長しないのであれば、毎回再割り当てすることになります。ですから、配列のサイズを2倍にするか、あるいは1.5倍程度にするのが理にかなっています。
理想的な成長率はあるのでしょうか?2x? 1.5x? 理想的というのは、数学的に正当化され、パフォーマンスと無駄なメモリのバランスをとるのに最も適しているという意味です。理論的には、アプリケーションにはどのようなプッシュの分布もあり得るので、これは多少アプリケーションに依存するものだと理解しています。しかし、私は、最適な値があるかどうか、または何らかの厳密な制約の中で最適と見なされる値があるかどうかを知りたいと考えています。
このことに関する論文がどこかにあると聞いたことがありますが、見つけられませんでした。
どのように解決するのですか?
それは完全にユースケースに依存します。データをコピーして無駄になる時間 (および配列の再割り当て) と余分なメモリのどちらを気にしますか? 配列はどのくらいの期間使用されるのでしょうか。もし、長くは続かないのであれば、より大きなバッファを使用することは良いアイデアかもしれません。ペナルティは短時間で済みます。配列が長く続く場合 (たとえば Java では、ますます古い世代に移行します) は、明らかにより大きなペナルティになります。
理想的な成長因子というものはないのです。 理論的には
アプリケーションに依存するだけでなく 間違いなく アプリケーションに依存しています。
2 はかなり一般的な成長因子です - 確かそれは
ArrayList
と
List<T>
を.NETで使用します。
ArrayList<T>
は、Javaでは1.5を使用しています。
編集部:Erichさんのご指摘の通り
Dictionary<,>
は、ハッシュ値をバケット間で合理的に分散できるように、"サイズを2倍にしてから次の素数まで増やす"を使用しています。(最近、素数はハッシュ バケットを分散させるのに実はそれほど適していないことを示唆するドキュメントを見たような気がしますが、それは別の回答のための議論です)。
関連
-
[解決済み] 数値の配列の和の求め方
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] JavaScriptで配列の先頭に新しい配列要素を追加するにはどうすればよいですか?
-
[解決済み] 配列の反復処理に "for...in "を使用するのは、なぜ良くないのでしょうか?
-
[解決済み] 配列の最後の項目を取得する
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] 配列の最初の要素を取得する
-
[解決済み] w(array)とはどういう意味ですか?
-
[解決済み] JavaScriptの配列宣言で「Array()」と「[]」はどう違うのですか?
-
[解決済み] bash補完における${array[*]}と${array[@]}の混同について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】IndexError: Index 10 is out of bounds for axis 0 with size 10
-
[解決済み] Angular 2のTypeScriptで配列にフィルタをかけるには?
-
[解決済み] MASMアセンブリの配列 (非常に混乱している初級者)
-
[解決済み] GCCです。配列型に不完全な要素型がある
-
[解決済み] Ruby: ハッシュの配列で Enumerator を取得しようとすると nil:NilClass の未定義メソッド `[]' が発生する。
-
[解決済み】GCC: 配列の型が不完全な要素型である
-
[解決済み] 並べ替えられた2つの配列の和で、k番目に小さい要素を見つけるにはどうすればよいですか?
-
[解決済み] Perl の配列を繰り返し処理する最良の方法
-
[解決済み] Linux Bashでlsを配列に割り当てるには?
-
[解決済み] CoffeeScriptで、Arrayに値を追加するにはどうしたらいいですか?