什么情况下锯齿状阵列优于普通矩形阵列?

时间:2013-11-10 07:06:17

标签: c# algorithm programming-languages

我想弄清楚锯齿状数组的用处是什么? 我的意思是在现实生活中有锯齿阵列的应用吗? 任何建议将不胜感激

3 个答案:

答案 0 :(得分:3)

什么算作“真实生活情境”?立即想到的一个例子是存储稀疏矩阵。矩阵通常作为2D阵列存储在所谓的“密集”表示中。它被称为密集,因为它存储了数组的每个元素。但在某些情况下,数组的许多元素都是0(或者可能是其他一些值),并且显式存储它们没有意义。许多稀疏矩阵表示使用少量的1D数组。

在您不希望每个1D阵列具有相同长度的情况下,真正的锯齿状阵列绝对有用。锯齿状数组也使得更换整个“行”变得更容易。

应该注意的是,至少在.NET中,jagged arrays usually have better performance than multidimensional arrays

答案 1 :(得分:3)

如果您关心速度,那么总是更喜欢锯齿状阵列而不是多维数组。 .NET运行时支持(抖动和CLR)在向量数组之间做出了很大的区分。向量是数组的一个特例,一个维度的起始索引为0.在CLR内部非常进行了大量优化,拉动每个possible trick。并且抖动,为数组边界检查消除提供了很大的机会。

锯齿状数组是向量的向量,当您使用它们时,您将获得所有运行时优化。多维数组没有。速度差异约为factor of two

如果您喜欢语法方便并且已经验证数组索引不在程序的关键路径上,那么只考虑使用多维数组。

答案 2 :(得分:0)

这是一个简单的例子:

让我们说出于某种原因你需要对整数进行分解。对于小整数,创建查找表以加快速度可能是有意义的。那将是一个锯齿状的阵列。

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
    }
}