2013-11-10 24 views

回答

3

什麼是「真實的生活情況」?立即想到的一個例子是存儲稀疏矩陣。通常將矩陣存儲爲稱爲「密集」表示的二維數組。它被稱爲密集的,因爲它存儲數組的每個元素。但是在某些情況下,數組中的許多元素都是0(或者可能是其他值),並且明確地存儲它們是沒有意義的。許多稀疏矩陣表示使用少量的一維數組。

真正參差不齊的陣列在你不希望每個1D陣列具有相同長度的情況下非常有用。鋸齒形數組也使得更換整個「行」變得更容易。

需要注意的是,在.NET中至少應該指出jagged arrays usually have better performance than multidimensional arrays

3

如果你關心速度,那麼你總是傾向於鋸齒陣列在多維數組上。 .NET運行時支持(抖動和CLR)在載體陣列之間進行了很強的區分。一個向量是一個數組的特殊情況,一個維度的起始索引爲0.它是非常的在CLR內部進行了大量優化,拉動了每個possible trick。抖動,爲數組邊界檢查消除提供了強大的可能性。

鋸齒狀數組是向量的向量,當您使用它們時,您可以獲得所有的運行時優化。多維數組不。速度差約爲factor of two

如果您偏​​愛語法便利性並驗證了數組索引不在您的程序的關鍵路徑中,那麼請考慮使用多維數組。

0

下面是一個簡單的例子:

比方說,由於某種原因,你需要factorise整數。對於小整數來說,創建一個查找表可能是有意義的,以加快速度。那將是一個鋸齒狀的陣列。

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