ギザギザ配列の有用性を理解しようとしていますか? つまり、実際の状況でギザギザ配列のアプリケーションはありますか? 任意の提案をいただければ幸いです
3 に答える
「実際の状況」とは何ですか? すぐに頭に浮かぶ 1 つの例は、スパース行列の格納です。行列は通常、「密な」表現と呼ばれる 2D 配列として格納されます。配列のすべての要素を格納するため、密集と呼ばれます。しかし、場合によっては、配列の多くの要素が 0 (またはおそらく他の値) であり、それらを明示的に格納する意味がありません。確かに、疎行列表現の多くは少数の 1D 配列を使用しています。
本当にぎざぎざの配列は、各 1D 配列を同じ長さにしたくない場合に確実に役立ちます。また、ギザギザの配列を使用すると、「行」全体を簡単に交換できます。
少なくとも .NET では、ジャグ配列は通常、多次元配列よりも優れたパフォーマンスを発揮することに注意してください。
速度を重視する場合は、常に多次元配列よりもギザギザの配列を好みます。.NET ランタイム サポート (ジッターと CLR) では、ベクトルと配列が明確に区別されます。ベクトルは配列の特殊なケースであり、開始インデックスが 0 の 1 次元です。これはCLR 内で非常に高度に最適化されており、考えられるすべてのトリックを引き出します。そしてジッターは、配列境界チェックの除去に強い可能性を与えます。
ジャグ配列はベクトルのベクトルであり、使用するとすべてのランタイム最適化が得られます。多次元配列はそうではありません。速度の差は約2 倍です。
構文の利便性を優先し、配列のインデックス付けがプログラムのクリティカル パスにないことを確認した場合にのみ、多次元配列の使用を検討してください。
簡単な例を次に示します。
何らかの理由で整数を因数分解する必要があるとしましょう。小さい整数の場合、処理を高速化するためにルックアップ テーブルを作成するのが理にかなっている場合があります。それはギザギザの配列になります。
int[][] factors = new int[][]
{
null, // 0 doesn't have prime factors
new int[] { }, // 1 is the trivial case
new int[] { 2 },
new int[] { 3 },
new int[] { 2, 2 },
new int[] { 5 },
new int[] { 2, 3},
new int[] { 7 },
new int[] { 2, 2, 2 },
new int[] { 3, 3 },
new int[] { 2, 5 },
// ... and so on
};
int[] PrimeFactorsOf(int value)
{
if (value < factors.Length)
{
return factors[value];
}
else
{
// do the work
}
}