有人可以告诉我任何不同的方法来使这段代码更快吗?

时间:2016-02-03 19:35:16

标签: c++ algorithm optimization min

代码正确运行并且它完成了它应该做的事情,但我被告知我可以通过使用布尔表达式来加快速度,但不知道在哪里插入它们。问题是:

  

给定一个带有坐标的n个点的序列,编写一个远程程序,它计算一个点的最小远程值,该点在广场之外。如果一个点不在正方形的内部,也不属于方形轮廓,则该点在正方形之外。如果方块外没有点,则程序必须输出0.

     

约束:
  1≤n≤10000且1≤a≤1000;
  示例:

     

输入:   5 4
  1 2
  4 6
  -3 2
  -2 2
  4 -1
  输出:5

有人可以建议我使用任何技术来提高代码效率吗?

int remote(int x, int y) {
    int z = abs(x) + abs(y);
    return z;
}   

int main() {

    int n, a;
    int x;
    int y;

    cin >> n >> a;

    int z=20001;
    for (int i = 1; i <= n; i++) {
        cin >> x >> y;
        if (x > a / 2 || y > a / 2) {
            if (z > remote(x, y)) {
                z = remote(x, y);
            }               
        }
    }    
    cout << z <<endl;

    return 0;

}

3 个答案:

答案 0 :(得分:1)

首先,你不必要地两次(在某些情况下)调用remote。 考虑使用这个:

#include <algorithm>

z = std::max(z, remote(x, y));

这也将缩短和澄清代码。

此外,分歧可能很慢。尝试(在分析之后!)替换

x > a / 2 || y > a / 2

通过

(x << 1) > a || (y << 1) > a

注意 @Donnie&amp;其他人在评论中声称编译器将进行后一种优化,并且它们可能是正确的。

答案 1 :(得分:1)

我想告诉你我机器上的时间:

版本1:

for (int i = 1; i <= n; i++) {
    cin >> x >> y;
   if (x > a / 2 || y > a / 2) {
        if (z > remote(x, y)) {
            z = remote(x, y);
        }               
    }
} 

第2版:

for (int i = 1; i <= n; i++) {
    cin >> x >> y;
/*    if (x > a / 2 || y > a / 2) {
        if (z > remote(x, y)) {
            z = remote(x, y);
        }               
    }
 */
} 

对于n = 10 ^ 5,用-O3编译都产生60ms。编译时没有优化:都是60ms。

优化的第一步是了解您的计划花费时间的地方。阅读/解析数据是瓶颈。

你可以通过添加第一行来加快它的速度:

ios_base::sync_with_stdio(false);

在我的机器上,我降到了20ms。

答案 2 :(得分:0)

1)为remote函数分配一个临时值:

if (x > a / 2 || y > a / 2)
{
    const int r = remote(x,y);
    if (z > r)
    {
        z = r;
    }
}

2)将remote的调用替换为remote的内容,消除了函数调用的开销:

if (x > a / 2 || y > a / 2)
{
    const int r = abs(x) + abs(y);
    if (z > r)
    {
        z = r;
    }
}

3)用一个常量临时变量替换a / 2

const int midpoint = a >> 1;
if (x > midpoint || y > midpoint)

4)将编译器优化级别更改为高 - 以提高速度。

5)瓶颈现在在输入语句中。通过优化循环的其余部分获得的任何增益都会被输入时间所浪费。没有更多的投资回报可以进一步改变。