【问题标题】:Could someone tell me any different way to make this code faster?有人能告诉我有什么不同的方法可以让这段代码更快吗?
【发布时间】:2016-05-13 04:23:05
【问题描述】:

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

给定n个点及其坐标的序列,编写一个程序remote,它计算一个点的最小距离值,该点在正方形之外。如果一个点既不在正方形内部,也不属于正方形轮廓,则该点位于正方形之外。如果正方形外没有点,你的程序必须输出 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;

}

【问题讨论】:

  • 附加信息:在平面上,给出一个边长为 a 且中心位于坐标系原点的正方形。边平行于坐标轴。我们称给定点的“远程性”,即点坐标绝对值的总和。例如坐标为(2,-3)的点的距离为5。
  • 您的代码看起来正在尝试找到最大的远程位置,而您的要求要求找到最小的位置。
  • 如需改进工作代码请在SE Code Review询问。
  • signomi,我现在还在现场 :)
  • 每个人都不知何故开始了。我建议那些因为这个问题(否决票)而指责 23ElCalente 的人看看他们的旧问题。他表现出努力并寻求帮助。 To πάντα ῥεῖ:现在有很多关于堆栈交换的讨论。但是对于许多人来说,stackoverflow 仍然是与编程相关的主要讨论。

标签: c++ algorithm optimization min


【解决方案1】:

一方面,您不必要地(在某些情况下)两次调用remote。 考虑使用这个:

#include <algorithm>

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

这也将缩短和澄清代码。


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

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

通过

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

注意 @Donnie 和其他人在 cmets 中声称编译器会进行后一种优化,他们可能是正确的。

【讨论】:

  • 位移而不是 / 2(或 2 的其他幂)是大多数编译器都会执行的优化。
  • @Donnie 这听起来很合乎逻辑。我真的不熟悉那么多编译器。我想你是对的。我试图保持谨慎(“可能”、“个人资料”等)
  • 你的意思是: if ((x a || (y a) { z = min(z, remote(x, y)); }
  • @23ElCaliente 是的,这是两个建议的结合。
  • 但它给了我一个关于“max”的错误,我应该放什么标题?
【解决方案2】:

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

版本 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。

优化的第一步是了解您的程序在哪里花费时间。读取/解析数据是瓶颈。

您可以通过将第一行添加到 main 来加快速度:

ios_base::sync_with_stdio(false);

在我的机器上,我的时间缩短到了 20 毫秒。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 2020-10-30
      • 2010-11-08
      • 2020-03-05
      • 2021-06-23
      • 2021-05-22
      • 1970-01-01
      • 2015-09-20
      相关资源
      最近更新 更多