达到列表中存在的数组的相等索引的最大值

时间:2011-10-21 09:12:05

标签: c# arrays

我的项目中有一个名为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 个答案:

答案 0 :(得分:1)

如果li是整数数组,则可以将代码更改为:

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

所以你不会有装箱/取消装箱来访问li元素(GetValue是一种访问数组元素的慢速方法)

更清楚地说明:

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

答案 1 :(得分:1)

我认为您无法更改代码的时间复杂度。目前,代码的复杂性为O(n²·f),这是您可以期望的最佳状态,因为您必须至少访问n²·f个元素才能创建array2(其中是二维数组的大小。)

您可以更改迭代的顺序,但不会改变复杂性。根据{{​​1}}:

的实现,它可以更加缓存一点
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的不同部分。如果您使用的是4.0框架,则可以使用Parallel class