【发布时间】:2013-11-22 02:57:16
【问题描述】:
我想弄清楚锯齿状数组有什么用处? 我的意思是锯齿状数组在现实生活中是否有任何应用? 任何建议将不胜感激
【问题讨论】:
-
锯齿状数组的性能通常更好。
-
帕斯卡三角形是使用交错数组的一个很好的例子。
标签: c# algorithm programming-languages
我想弄清楚锯齿状数组有什么用处? 我的意思是锯齿状数组在现实生活中是否有任何应用? 任何建议将不胜感激
【问题讨论】:
标签: c# algorithm programming-languages
什么算作“现实生活中的情况”?立即想到的一个例子是存储稀疏矩阵。矩阵通常以所谓的“密集”表示形式存储为二维数组。之所以称为密集,是因为它存储了数组的每个元素。但在某些情况下,数组的许多元素都是 0(或者可能是其他值),显式存储它们没有意义。假设很多稀疏矩阵表示使用少量的一维数组。
真正锯齿状数组在您不希望每个一维数组具有相同长度的情况下绝对有用。锯齿状数组也使得交换整个“行”变得更加容易。
需要注意的是,至少在 .NET 中,jagged arrays usually have better performance than multidimensional arrays.
【讨论】:
如果您关心速度,那么您总是更喜欢锯齿状数组而不是多维数组。 .NET 运行时支持(jitter 和 CLR)在 vectors 和 arrays 之间有很大的区别。向量是数组的一种特殊情况,一维的起始索引为 0。它在 CLR 内部进行了非常的高度优化,每个possible trick 都拉取。还有抖动,为消除数组边界检查提供了很大的可能性。
锯齿状数组是向量的向量,当您使用它们时,您可以获得所有运行时优化。多维数组没有。速度差大约是factor of two。
只有在您喜欢语法便利并且已验证数组索引不在程序的关键路径上时,才考虑使用多维数组。
【讨论】:
这是一个简单的例子:
假设由于某种原因您需要对整数进行因式分解。对于小整数,创建查找表以加快处理速度可能是有意义的。那将是一个锯齿状数组。
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
}
}
【讨论】: