达到列表中存在的数组的相等索引的最大值
本文关键字:索引 最大值 数组 列表 存在 | 更新日期: 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
(其中n²
是二维数组的大小)。
你可以改变迭代的顺序,但它不会改变复杂度。根据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]);