2

ギザギザ配列の有用性を理解しようとしていますか? つまり、実際の状況でギザギザ配列のアプリケーションはありますか? 任意の提案をいただければ幸いです

4

3 に答える 3

4

「実際の状況」とは何ですか? すぐに頭に浮かぶ 1 つの例は、スパース行列の格納です。行列は通常、「密な」表現と呼ばれる 2D 配列として格納されます。配列のすべての要素を格納するため、密集と呼ばれます。しかし、場合によっては、配列の多くの要素が 0 (またはおそらく他の値) であり、それらを明示的に格納する意味がありません。確かに、疎行列表現の多くは少数の 1D 配列を使用しています。

本当にぎざぎざの配列は、各 1D 配列を同じ長さにしたくない場合に確実に役立ちます。また、ギザギザの配列を使用すると、「行」全体を簡単に交換できます。

少なくとも .NET では、ジャグ配列は通常、多次元配列よりも優れたパフォーマンスを発揮することに注意してください。

于 2013-11-10T08:00:52.817 に答える
4

速度を重視する場合は、常に多次元配列よりもギザギザの配列を好みます。.NET ランタイム サポート (ジッターと CLR) では、ベクトル配列が明確に区別されます。ベクトルは配列の特殊なケースであり、開始インデックスが 0 の 1 次元です。これはCLR 内で非常に高度に最適化されており、考えられるすべてのトリックを引き出します。そしてジッターは、配列境界チェックの除去に強い可能性を与えます。

ジャグ配列はベクトルのベクトルであり、使用するとすべてのランタイム最適化が得られます。多次元配列はそうではありません。速度の差は約2 倍です

構文の利便性を優先し、配列のインデックス付けがプログラムのクリティカル パスにないことを確認した場合にのみ、多次元配列の使用を検討してください。

于 2013-11-10T10:27:45.103 に答える
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
    }
}
于 2013-11-10T10:43:56.630 に答える