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 int
データ型を、 long
、long long
およびに変更しようとしましたが、unsigned
ガベージ値をダンプするか、「セグメンテーション コア フォールト」エラーを実行します。
絶対値式については、もともとハードコーディング(コメントアウト)でやってみたのですが、どうやらガベージ値を出力しているようです。abs()
functionを使用して abs ソリューションを最適化しようとしましたineq+=abs(l[x]-l[y])*abs(p[x]-p[y]));
が、実行が遅くなるようです。実装できる他の最適化については知りませんので、いくつかお勧めしてください。
Linux に適したソリューションが推奨されます。ありがとうございました。
補足: a、b、x、y の値はすべて範囲内にあります1<=a,b,x,y<=10000
。
補足: このプログラムはファイル "int.in" から読み取り、最初の整数 (アイテムの数) を取り、新しい行をペアで読み取ります (l[x] と p[x] はペアです)。
補足: 多次元配列のみを使用してみましたが、1 次元配列が CPU キャッシュにあり、多次元はメモリに散らばっていて速度が遅いことをどこかで読みました。