克服 n^2 运行时程序

Posted

技术标签:

【中文标题】克服 n^2 运行时程序【英文标题】:Overcoming an n^2 runtime program 【发布时间】:2015-05-06 08:37:45 【问题描述】:

有没有办法克服 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,但它要么转储垃圾值,要么执行“分段核心故障”错误。

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

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

旁注:a、b、x、y的值都在1&lt;=a,b,x,y&lt;=10000的范围内。

旁注:该程序从文件“int.in”中读取,获取第一个整数(项目数)并逐对读取每个新行(l[x] 和 p[x] 是成对的)。

旁注:我也尝试仅使用多维数组,但我在某处读到一维数组位于 CPU 缓存中,而多维数组分散在内存中并且速度较慢。

【问题讨论】:

你能解释一下你为什么要计算这个吗?那么建议替代算法可能会更容易。 相关,你想在大局中完成什么?例如,我认为傅立叶变换在n log n 中运行,所以如果你可以将其移至 FFT 域,你将获得加速。 而 z 可以是什么?您想要所有解决方案还是只有一个? |a-b|*|x-y|z=|(a-b)(x-y)| 完全相同。这为您节省了一个绝对的电话 您的替代方法并不比另一种更好,因为如果编译器不够智能,n1*=-1; 将比n1 = -n1; 更昂贵,并且if 可能会在abs 产生分支会用最有效的方式取绝对 【参考方案1】:

这个问题可以用另一种方式来描述:你在等式z=c*d(当然是c is |a-b|d is |x-y|)中寻找c和d(都是正数)。

所以首先订购您的阵列。然后寻找z=c*d的解决方案,然后找出使c == a - b为真的a和b以及使d == x - y为真的x和y。

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

【讨论】:

以上是关于克服 n^2 运行时程序的主要内容,如果未能解决你的问题,请参考以下文章

启动应用程序时如何克服此错误?

使用 qBittorrent 运行脚本时如何克服 Python 中的 IO 错误 13

当我试图运行路径分析时,如何克服R中MetaboAnalyst的问题?

将网络测功机添加到 Heroku django 应用程序时如何克服“无法找到该编队”错误?

Java常见的运行起异常(runtime exception)

在Ionic v3中需要帮助克服此错误