我想弄清楚锯齿状数组的用处是什么? 我的意思是在现实生活中有锯齿阵列的应用吗? 任何建议将不胜感激
答案 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
}
}