我遇到了一个问题,我正在尝试优化我的查询,该查询是为了计算增加的N值和误差近似值的Nmin值而创建的。 我不是来自编程背景,而是刚刚开始接受它。
这是计算效率低,因为它甚至在找到Nmin后计算Nmin。
现在减少我在下面做的时间减少函数调用没有任何改进:
#include<iostream>
#include<cmath>
#include<time.h>
#include<iomanip>
using namespace std;
double f(int);
int main(void)
{
double err;
double pi = 4.0*atan(1.0);
cout<<fixed<<setprecision(7);
clock_t start = clock();
for (int n=1;;n++)
{
if((f(n)-pi)>= 1e-6)
{
cout<<"n_min is "<< n <<"\t"<<f(n)-pi<<endl;
}
else
{
break;
}
}
clock_t stop = clock();
//double elapsed = (double)(stop - start) * 1000.0 / CLOCKS_PER_SEC; //this one in ms
cout << "time: " << (stop-start)/double(CLOCKS_PER_SEC)*1000 << endl; //this one in s
return 0;
}
double f(int n)
{
double sum=0;
for (int i=1;i<=n;i++)
{
sum += 1/(1+pow((i-0.5)/n,2));
}
return (4.0/n)*sum;
}
有没有办法减少时间并使第二个查询有效? 任何帮助将不胜感激。
答案 0 :(得分:0)
我没有看到任何优化算法本身的直接方法。但是,通过不为每次迭代写入标准输出,可以显着减少时间。此外,每次迭代不要多次计算f(n)。
for (int n=1;;n++)
{
double val = f(n);
double diff = val-pi;
if(diff < 1e-6)
{
cout<<"n_min is "<< n <<"\t"<<diff<<endl;
break;
}
}
但请注意,由于我们将条件更改为diff < 1e-6
,因此会产生更高的n_min(与版本的结果相比增加1)。