繁体   English   中英

有人可以告诉我任何其他方法来使此代码更快吗?

[英]Could someone tell me any different way to make this code faster?

该代码可以正确运行,并且可以执行预期的操作,但是有人告诉我可以通过使用布尔表达式来提高它的速度,但是我真的不知道在哪里将其插入。 问题是:

给定一个由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;

}

例如,您不必要地拨打两次remote电话(在某些情况下)。 考虑使用此:

#include <algorithm>

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

这还将缩短并阐明代码。


另外,划分可能很慢。 尝试(分析后!)替换

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

通过

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

注意 @Donnie&others在注释中声称编译器将进行后一种优化,并且它们可能是正确的。

我想向您展示我的机器上的计时:

版本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);

在我的机器上,我只有20毫秒。

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)瓶颈现在在输入语句中。 通过优化循环的其余部分获得的任何增益都会浪费输入时间。 没有更多的投资回报率可作进一步的改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM