2011-10-21 45 views
0

我的項目中有一個名爲li的列表,其中包含一些二維整數數組。我想擁有數組的相等索引的最大值並創建一個名爲array2的新數組。我寫了這段代碼,但速度很慢。達到列表中存在的數組的相等索引的最大值

for (int i = 0; i < 100; i++)//the size of each array is [100,100] 
    for (int j = 0; j < 100; j++) 
    { 
     int ma = -2; 
     int d = 0; 
     while (d <= f)//"f" is the number of items in the list 
     { 
      ma = Math.Max(ma, Convert.ToInt32(li[d].GetValue(i, j))); 
      d++; 
     } 

     array2[i, j] = ma; 

    } 

我該如何做一個更好的? 使用emguCv可以改善嗎?如果是的話,我該怎麼做? 在此先感謝。

+2

目前很難理解你的問題。一個簡短但完整的例子會有所幫助,因爲這會使你的問題主體和標題各自獨立,就像更謹慎地格式化代碼一樣。請閱讀http://tinyurl.com/so-hints –

+0

我會說一塊失蹤。你從'named li開始,' – xanatos

回答

1

如果li是一個整數數組,你可以改變你的代碼:

ma = Math.Max(ma, li[d][i, j]); 

所以你不會有一個拳擊/拆箱訪問li元素(GetValue是訪問元素緩慢的方式數組)的

爲了更清楚:

int[,] temp = li[d]; 
ma = Math.Max(ma, temp[i, j]); 
+0

你的代碼不起作用,而我使用了這個:int [,] temp = new int [picP.Height,picP.Width]; Array.Copy(li [d],temp,li [d] .Length); ma = Math.Max(ma,temp [i,j]);它非常慢 –

+0

@AsmaGood'li [d]'的類型是什麼?你還沒有寫過如何定義'li'。 – xanatos

1

我不認爲你可以改變的時間複雜度的代碼。目前您的代碼的複雜程度爲O(n²·f),這是您可以期望的最佳選擇,因爲您必須至少訪問n²·f元素才能創建array2(其中是二維數組的大小)。

您可以更改迭代順序,但不會改變複雜性。這可能是多一點的緩存友好的,這取決於GetValue實現:

for(int d=0; d<f; d++) 
{ 
    var arr = li[d]; 

    for(int i=0; i<100; i++) 
    { 
     for(int j=0; j<100; j++) 
     { 
      array2[i,j] = Math.Max(array2[i,j], Convert.ToInt32(arr.GetValue(i,j))); 
     } 
    } 
} 

您應該運行此代碼,使其與您當前的代碼兼容之前的array2每個值初始化爲-2

您可能想要嘗試並行化您的代碼並使用多個工作線程來計算array2的不同部分。如果您使用的是4.0框架,則可以使用Parallel class

+0

感謝您的嘗試,我嘗試了您的代碼,但速度較慢。 –

+0

是的,值得一試,但就像我說的,沒有辦法提高時間複雜度。所以它要麼是低級優化,要麼是並行化。 C#中低級別的優化並不像C或C++中那樣容易。 –

相關問題