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

本文关键字:索引 最大值 数组 列表 存在 | 更新日期: 2023-09-27 18:11:50

我有一个列表,名为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来改善?如果是,我该怎么做?

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

我不认为你可以改变你的代码的时间复杂度。目前,你的代码的复杂性是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类。

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

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

所以你不会有装箱/拆箱访问li元素(GetValue是一个缓慢的方式来访问数组的元素)

更清楚:

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