【发布时间】:2013-06-10 20:46:22
【问题描述】:
此逻辑是在数组中查找数字 n,其中 n 和 n + 5 之间的范围将包含数组中最多的数字。我想出了一个解决方案,但它需要一个嵌套循环,因此它有点慢。有什么方法可以提高它的性能吗?提前致谢。
保证数组是有序的。
int[] myArray = new int[]{1,2,4,5,7,9,15,19};
int bestNumber = 0;
int MaxMatchFound = 0;
for (int o = 0; o < myArray.Length; o++)
{
int TempMatchFound = 0;
for (int i = 0; i < myArray.Length; i++)
{
if (myArray[i] >= myArray[o] && myArray[i] <= (myArray[o] + 5))
{
TempMatchFound++;
}
}
if (TempMatchFound > MaxMatchFound)
{
bestNumber = myArray[o];
MaxMatchFound = TempMatchFound;
}
}
return bestNumber;
【问题讨论】:
-
它需要执行多快,您将为此使用多大的数据集?
-
你能保证数组最初是排序的吗?
-
请注意,如果您确保输入数据已排序,则可以在值大于上限时立即跳出内循环,并且可以在当前项目,而不是开始时。
-
@JoelCoehoorn 是的,它已排序。我忘了提。
-
另外,解释@Servy 的第一条评论:性能是相对和昂贵。相对而言,对于样本数据集的大小,您现在拥有的已经足够快了。昂贵,因为程序员的时间通常比 CPU 时间更昂贵(而且稀缺)。优化此代码所花费的时间是以优化其他代码为代价的。如果您需要优化某些东西,您是否将时间花在此处或其他地方取决于您需要查看多少数据以及 cpu 可以花多长时间。
标签: c# arrays performance sorting loops