【发布时间】:2011-11-30 23:57:27
【问题描述】:
所以我在编码涉及时间复杂度的图像处理函数时有一个随机问题。以下是我原来的sn-p代码:
long start = System.currentTimeMillis();
for (int i = 0; i < newWidth; i++) {
for (int j = 0; j < newHeight; j++) {
double x = i * scaleX;
double y = j * scaleY;
double xdiff = x - (int) x;
double ydiff = y - (int) y;
int xf = (int) Math.floor(x);
int xc = (int) Math.ceil(x);
int yf = (int) Math.floor(y);
int yc = (int) Math.ceil(y);
double out = inputArray[xf][yf] * (1 - xdiff) * (1 - ydiff)
+ inputArray[xc][yf] * xdiff * (1 - ydiff)
+ inputArray[xf][yc] * (1 - xdiff) * ydiff
+ inputArray[xc][yc] * xdiff * ydiff;
outputArray[i][j] = (int) out;
}
}
long elapsed = System.currentTimeMillis() - start;
System.out.println("Time used: " + elapsed);
在编写完该代码后,我想知道不为下限和上限值创建 4 个临时变量是否会更快,而是直接在数组索引中计算它们。所以我这样修改:
long start = System.currentTimeMillis();
for (int i = 0; i < newWidth; i++) {
for (int j = 0; j < newHeight; j++) {
double x = i * scaleX;
double y = j * scaleY;
double xdiff = x - (int) x;
double ydiff = y - (int) y;
double out = inputArray[(int) Math.floor(x)][(int) Math.floor(y)] * (1 - xdiff) * (1 - ydiff)
+ inputArray[(int) Math.ceil(x)][(int) Math.floor(y)] * xdiff * (1 - ydiff)
+ inputArray[(int) Math.floor(x)][(int) Math.ceil(y)] * (1 - xdiff) * ydiff
+ inputArray[(int) Math.ceil(x)][(int) Math.ceil(y)] * xdiff * ydiff;
outputArray[i][j] = (int) out;
}
}
long elapsed = System.currentTimeMillis() - start;
System.out.println("Time used: " + elapsed);
我原以为后者会更快(因为您不必写入临时变量然后访问它),但事实证明后者至少比之前的代码慢 2.5 倍。使用的测试用例是 1024x768 图像的 3 倍缩放。
旧代码:使用时间:812 后来的代码:使用时间:2140
那么造成时差的原因是什么?
【问题讨论】:
标签: java time complexity-theory