代码之家  ›  专栏  ›  技术社区  ›  23ElCaliente

有人能告诉我任何不同的方法使这个代码更快吗?

  •  0
  • 23ElCaliente  · 技术社区  · 10 年前

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

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

    限制条件:
    10000元和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 回复  |  直到 10 年前
        1
  •  1
  •   Ami Tavory    10 年前

    首先,你在打电话 remote 两次(在某些情况下)是不必要的。 考虑使用以下方法:

    #include <algorithm>
    
    z = std::max(z, remote(x, y));
    

    这也将缩短和澄清代码。


    此外,也有可能是分裂缓慢。尝试(分析后!)更换

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

    通过

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

    笔记 @唐尼&其他人在评论中声称编译器将进行后一种优化,他们可能是正确的。

        2
  •  1
  •   ead    10 年前

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

    版本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。未经优化编译:均为60毫秒。

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

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

    ios_base::sync_with_stdio(false);
    

    在我的机器上,我的速度降到20毫秒。

        3
  •  0
  •   Thomas Matthews    10 年前

    1) 将临时值指定给 remote 功能:

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

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

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