【发布时间】:2022-11-29 09:27:48
【问题描述】:
我写了一段代码,以便在二维数组的行/列中找到 3 个重复的元素。
private static bool SearchInRows(int[,] matrix)
{
int count = 1;
int repeatElement = int.MaxValue;
//Search in rows
for (int i = 0; i < matrix.GetLength(0); i++)
{
repeatElement = matrix[i, 0];
for (int j = 1; j < matrix.GetLength(1); j++)
{
if (repeatElement == matrix[i, j])
{
count++;
if (count >= 3)
{
Console.WriteLine($"Repeated elements are in positions i:{i}, j:{j - 2}, {j - 1}, {j}");
return true;
}
}
else
{
repeatElement = matrix[i, j];
count = 1;
}
}
}
return false;
}
private static bool SearchInCols(int[,] matrix)
{
int count = 1;
int repeatElement = int.MaxValue;
//Search in cols
for (int j = 0; j < matrix.GetLength(1); j++)
{
repeatElement = matrix[0, j];
for (int i = 1; i < matrix.GetLength(0); i++)
{
if (repeatElement == matrix[i, j])
{
count++;
if (count >= 3)
{
Console.WriteLine($"Repeated elements are in positions j:{j}, i:{i-2}, {i-1}, {i}");
return true;
}
}
else
{
repeatElement = matrix[i, j];
count = 1;
}
}
}
return false;
}
它工作正常,但我会做这样的事情:
while (!SearchInRows(matrix) && !SearchInCols(matrix))
{
SearchInRows(matrix);
SearchInCols(matrix);
//modify the matrix
}
我想知道,如果我可以使用一些东西来提高我的代码的性能,比如在每个方法上添加 Task.Run 或其他东西(我为此将方法拆分为 cols 和 rows)。
【问题讨论】:
-
好吧,一个巨大的性能提升将是“缓存”结果,目前你在每次迭代中调用
SearchInRows和SearchInCols两次,因为你可以只调用一次并将结果保存在局部变量中以供重用 -
您可以将它们组合成一个方法,并为每个选定的元素与二维数组中右侧和底部的元素进行比较,如果它们匹配,则再次进行。由于您目前正在对每个元素进行两次迭代,因此您可以将要迭代的元素数量减半......
-
@dan-kli 好的,但是如果底部/右侧的元素不相同,我如何将它们从搜索中排除?
-
您获取当前元素并按住它。然后你把它和右边的元素比较,如果匹配,再和右边的元素比较。然后你可以将它与下面的元素进行比较,如果它们匹配则再次比较。这是两个独立的功能(并且可以放入它们自己的方法中)。如果两个功能都未返回 true,则您将移至下一个元素。从搜索中排除它们是什么意思?
-
^回复是对你之前的评论。我认为你之前说的是真的,理论上可以跳过对你已经有 2 个重复数字而第三个不匹配的特定情况的检查,但该信息也必须从某个地方存储和调用,这就像我说的那样再次消除了性能..
标签: c# algorithm performance