所以我决定尝试Codility.第一项任务 – FrogJmp很容易,但令我惊讶的是我得了44%.解决方案,即使是正确的,在性能方面显然是不可接受的.
原始解决方案
public int solution2(int X, int Y, int D) {
return (int) Math.ceil((float)(Y -X)/D);
}
所以我决定用不同的代码尝试它,没有浮点运算.
public int solution(int X, int Y, int D) {
int diff = Y - X;
if (diff % D == 0)
return diff /D;
else
return diff/D + 1;
}
这次我得到了100%.所以我想自己检查性能并编写简单的测试:
class Solution {
public int solution(int X, int Y, int D) {
int diff = Y - X;
if (diff % D == 0)
return diff /D;
else
return diff/D + 1;
}
public int solution2(int X, int Y, int D) {
return (int) Math.ceil((float)(Y -X)/D);
}
private static Random ran = new Random(System.currentTimeMillis());
public static int getRandom(int a, int b){
return ran.nextInt(b - a + 1) + a;
}
public static void main(String[] args) {
int size = 1000_000;
int max = 1000_000_000;
int[] xs = new int[size];
int[] ys = new int[size];
int[] ds = new int[size];
for (int i = 0; i < size; i++) {
int y = getRandom(1, max);
int x = getRandom(1, y);
int d = getRandom(1, max);
xs[i] = x;
ys[i] = y;
ds[i] = d;
}
long start = System.nanoTime();
Solution sol = new Solution();
for (int i = 0; i < size; i++) {
sol.solution2(xs[i], ys[i], ds[i]);
}
long diff = System.nanoTime() - start;
System.out.println("took: " + diff/1000000 + "ms");
}
}
令我惊讶的是,在我的机器上,解决方案1平均需要13毫秒,而解决方案2(报告为绝对无效的10毫秒).
我错过了什么?
也许它必须对任务的预期时间和空间复杂性做一些事情.
expected worst-case time complexity is O(1); expected worst-case space
complexity is O(1).
解决方案2不具有恒定的时间和范围.空间复杂性?
另外,我无法理解44%解决方案的结果报告:
这是什么意思??
解决方法:
两种解决方案都具有O(1)时间复杂度.问题是第一个解决方案是返回错误的答案.性能测试测试答案和时间.您的解决方案失败可能是因为使用浮动的精确问题.
对于x = 1,y = 1000000000,d = 1,您的第一个解决方案给出1000000000作为答案,第二个给出
999999999.从(float)更改为(double)会更正此结果.
在这些算法测试中,尽可能避免浮点运算通常是一个好主意,以便更容易获得所有情况的确切答案.
标签:java,time-complexity
来源: https://codeday.me/bug/20190713/1454053.html