找到矩阵中最大元素和位置的最有效方法是什么?此外,每个列中最大的元素带有位置

本文关键字:位置 元素 此外 是什么 有效 方法 | 更新日期: 2023-09-27 17:52:46

我已经编写了以下代码,但看起来效率很低。

//Find largest in tempRankingData
int largestIntempRankingData = tempRankingData[0, 0];
for (int i = 0; i < count; i++)
{
    for (int j = 0; j < count; j++)
    {
        if (tempRankingData[i, j] > largestIntempRankingData)
        {
            largestIntempRankingData = tempRankingData[i, j];
        }
    }
}
//Find position of largest in tempRankingData
List<string> positionLargestIntempRankingData = new List<string>();
for (int i = 0; i < count; i++)
{
    for (int j = 0; j < count; j++)
    {
        if (tempRankingData[i, j] == largestIntempRankingData)
        {
            positionLargestIntempRankingData.Add(i + "," + j);
        }
    }
}
//Find largest in each column
int largestInColumn = 0;
List<string> positionOfLargestInColumn = new List<string>();
Dictionary<int, List<string>> position = new Dictionary<int, List<string>>();
for (int i = 0; i < count; i++)
{
    largestInColumn = tempRankingData[0, i];
    positionOfLargestInColumn = new List<string>();
    for (int j = 0; j < count; j++)
    {
        if (tempRankingData[j, i] > largestInColumn)
        {
            largestInColumn = tempRankingData[j, i];
        }
    }
    for (int j = 0; j < count; j++)
    {
        if (tempRankingData[j, i] == largestInColumn)
        {
            positionOfLargestInColumn.Add(j + "," + i);
        }
    }
    position.Add(i, positionOfLargestInColumn);
}

所以,我想检查一下最有效的方法。

找到矩阵中最大元素和位置的最有效方法是什么?此外,每个列中最大的元素带有位置

当您在每列中找到最大值时,也可以找到最大值。您还可以在移动时捕捉位置:

//Find largest in each column
int largestInColumn = 0;
int largestOverall = int.MinValue;
List<string> positionOfLargestInColumn;
Dictionary<int, List<string>> position = new Dictionary<int, List<string>>();
List<string> positionLargestIntempRankingData = new List<string>();
for (int i = 0; i < count; i++)
{
    largestInColumn = tempRankingData[0, i];
    positionOfLargestInColumn = new List<string>();
    positionOfLargestInColumn.Add("0," + i);
    for (int j = 1; j < count; j++)
    {
        if (tempRankingData[j, i] > largestInColumn)
        {
            largestInColumn = tempRankingData[j, i];
            positionOfLargestInColumn.Clear();
            positionOfLargestInColumn.Add(j + "," + i);
        }
        else if(tempTankingData[j,i] == largestInColumn)
        {
            positionOfLargestInColumn.Add(j + "," + i);
        }
    }
    position.Add(i, positionOfLargestInColumn);
    if(largestInColumn > largestOverall)
    {
      positionLargestIntempRankingData.Clear();
      positionLargestIntempRankingData.AddRange(positionOfLargestInColumn);
      largestOverall = largestInColumn;
    }
    else if(largestInColumn == largestOverall)
    {
      positionLargestIntempRankingData.AddRange(positionOfLargestInColumn);
    }
}

1(。您可以在一个方法中找到最大元素及其位置并进行检索。您的方法的调用者是否关心位置或实际值,这是一个具体的例子。

2( 您可以在矩阵搜索中使用"yield return"技术(用于基于列的搜索(,因此不要计算所有列的最大值并将其推入字典。字典不如数组快,如果你能避免使用它们,那就这么做吧。

3( 您可以将矩阵保持为一维长数组。具有[]访问运算符过载,以"模拟"矩阵访问。为什么?若在程序运行过程中经常需要查找最大值,那个么一个foreach循环比嵌套两个循环更快。在大矩阵的情况下,单阵列搜索可以很容易地在不同的核心之间并行化。

如果您不关心大矩阵和/或频繁调用,只需像第(1(、(2(点那样简化代码即可。

对于您的前两个任务,您可以用以下内容替换:

 //Find largest in tempRankingData
int largestIntempRankingData = tempRankingData[0, 0];
List<KeyValuePair<double,string>> list = new List<KeyValuePair<double,string>>();
for (int i = 0; i < count; i++)
{
    for (int j = 0; j < count; j++)
    {
        if (tempRankingData[i, j] > largestIntempRankingData)
        {
            largestIntempRankingData = tempRankingData[i, j];
            list.Add(new KeyValuePair<double, string>(largestIntempRankingData, i + "," + j));   //Add the value and the position;
        }
    }
}
//This gives a list of strings in which hold the position of largestInItemRankingData example "3,3"
            //Only positions where the key is equal to the largestIntempRankingData;
list.Where(w => w.Key == largestIntempRankingData).ToList().Select(s => s.Value).ToList(); 

您可以在一次扫描中获得所有这些信息,只需稍微摆弄一下。类似这样的事情(将行和列转换为字符串是微不足道的,而且最好在最后完成(:

int? largestSoFar = null;    // you could populate this with myMatrix[0,0]
                             // but it would fail if the matrix is empty
int largestCol = 0;
int largestRow = 0;
int?[] largestPerColumn = new int?[numOfCols];    // You could also populate this with
                                                  // the values from the first row but
                                                  // it would fail if there are no rows
int[] largestColumnRow = new int[numOfCols];
for (int i = 0; i < numOfRows; i++)
{
    for (int j = 0; j < numOfCols; i++)
    {
        if (largestSoFar < myMatrix[i,j]) 
        {
            largestSoFar = myMatrix[i,j];
            largestCol = j;
            largestRow = i;
        }
        if (largestPerColumn[j] < myMatrix[i,j])
        {
            largestPerColumn[j] = myMatix[i,j];
            largestColumnRow[j] = i;
        }
    }
}
// largestSoFar is the biggest value in the whole matrix
// largestCol and largestRow is the column and row of the largest value in the matrix
// largestPerColumn[j] is the largest value in the jth column
// largestColumnRow[j] is the row of the largest value of the jth column

如果你确实需要在一列中捕获所有的"最大值"(因为没有更好的词,因为这不是你真正在做的(,你可以把上面的代码改成这样:

int? largestSoFar = null;    // you could populate this with myMatrix[0,0]
                             // but it would fail if the matrix is empty
int largestCol = 0;
int largestRow = 0;
int?[] largestPerColumn = new int?[numOfCols];    // You could also populate this with
                                                  // the values from the first row but
                                                  // it would fail if there are no rows
List<int>[] largestColumnRow = new List<int>[numOfCols];
for (int i = 0; i < numOfRows; i++)
{
    for (int j = 0; j < numOfCols; i++)
    {
        if (largestSoFar < myMatrix[i,j]) 
        {
            largestSoFar = myMatrix[i,j];
            largestCol = j;
            largestRow = i;
        }
        if (largestPerColumn[j] < myMatrix[i,j])
        {
            largestPerColumn[j] = myMatix[i,j];
            largestColumnRow[j].Add(i);
        }
    }
}
// Now largestColumnRow[j] gives you a list of all the places where you found a larger 
// value for the jth column