克服n ^ 2运行时程序

时间:2015-05-06 08:37:46

标签: c++ c++11 types absolute-value

有没有办法克服C ++ 11中的嵌套循环递归?我的程序运行缓慢。或者更确切地说,是否有更有效的方法来解决以下公式z=|a-b|*|x-y|,其中a,b,x和y是10000整数数组中的元素?

以下是代码:

#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

ifstream in("int.in");

int main()
{
    long long n, n1, z, x, y, in2=0;
    in>>n
    long long l[n], p[n];
    for(x=0;x!=n;x++)
        in>>l[x]>>p[x];
    for(x=0;x!=n;x++)
    {
        for(y=x+1;y<n;y++)
        {
            ineq+=(abs(l[x]-l[y])*abs(p[x]-p[y]))); //executes slow
            /*n1=l[x]-l[y]; //Alternative algorithm
            if(n1<0)
                n1*=-1;
            z=p[x]-p[y];
            if(z<0)
                z*=-1;
            in2+=n1*z;*/
        }
    }
    cout<<in2<<"\n";
}

我尝试将数据类型更改为short intlonglong longunsigned,但它会转储垃圾值或执行“Segmentation Core Fault”错误。

对于绝对值公式,我最初尝试使用硬编码方法(注释掉),但它似乎输出了垃圾值。我还尝试使用abs()函数ineq+=abs(l[x]-l[y])*abs(p[x]-p[y]));优化abs解决方案,但似乎执行速度较慢。我不知道我可以实现的任何其他优化,所以请推荐一些。

Linux友好的解决方案首选。谢谢。

旁注:a,b,x和y的值都在1<=a,b,x,y<=10000范围内。

侧注:此程序从文件中读取&#34; int.in&#34;,取第一个整数(项数)并按对读取每个新行(l [x]和p [x]是对)。

侧注:我也尝试过只使用多维数组,但我读到某个地方,一维数组在CPU缓存中,而多维数据分散在内存中并且速度较慢。

1 个答案:

答案 0 :(得分:1)

问题可以用另一种方式得出:你在等式z=c*d(当然是c is |a-b|和{{}中寻找c和d(都是正) 1}})。

首先订购你的数组。然后查找d is |x-y|的解,然后找出哪个a和b使z=c*d为真,x和y使c == a - b为真。

一旦完成,你就得到了使你的方程成立的所有值,因为abs(a-b)与abs(b-a)相同