【发布时间】:2016-10-20 22:03:41
【问题描述】:
在CodinGame学习平台,C#教程中作为示例使用的问题之一是:
这个练习的目的是检查一个数字在一个 数组。
规格:项目是按升序排列的整数。 该数组最多可包含 100 万个项目。该数组永远不会是
null。 实现方法 booleanAnswer.Exists(int[] ints, int k)以便 如果k属于ints,则返回true,否则该方法应 返回false。重要提示:尽可能节省 CPU 周期。
例子:
int[] ints = {-9, 14, 37, 102};
Answer.Exists(ints, 102)返回true。Answer.Exists(ints, 36)返回false。
我的建议是这样做:
using System;
using System.IO;
public class Answer
{
public static bool Exists(int[] ints, int k)
{
foreach (var i in ints)
{
if (i == k)
{
return true;
}
if (i > k)
{
return false;
}
}
return false;
}
}
测试结果是:
- ✔ 该解决方案适用于“小”数组(200 分) - 问题解决
- ✔ 该解决方案适用于空数组(50 分) - 可靠性
- ✘ 该解决方案在合理的时间内适用于一百万个项目(700 分) - 问题解决
我不明白最后一点。看来代码可能比我建议的更优化。
如何优化这段代码? 二分搜索是一个实际的解决方案(假设数组中的值已经排序),还是我错过了一些更简单的方法?
【问题讨论】:
-
看来练习的重点是推导出自己的算法。不然你用
BinarySearch学到什么(除了怎么用)? -
顺便说一句:
if (i > k) return false;并没有太大的改进。它可以让您避免循环迭代i>k,但它还为每次迭代添加了额外的比较操作。从好的方面来说,CPU 分支预测器可能会以非常高的准确度预测该比较的结果。
标签: c# algorithm optimization binary-search