一个简单算法的优化问题

QuickPai 2009-12-31 03:02:42
算法如下:

public static double evel(int n)
{
double[] c=new double[n+1];
c[0]=1.0;
for(int i=1;i<=n;i++){
double sum=0.0;
for(int j=0;j<i;j++){
sum+=c[j];
}
c[i]=2.0*sum/i+i;
}
return c[n];
}

以上算法时间复杂度是O(n2);
改进后时间复杂度为O(n);
谢谢!
...全文
108 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
QuickPai 2009-12-31
  • 打赏
  • 举报
回复
这是《数据结构与算法分析--java语言描述》-----Mark Allen Weiss
书上的一个例子,动态规划---用表代替递归
原来的递归算法是这样的:

public static double evel(int n)
{
if(n==0){
return 1.0;
}else{
double sum=0.0;
for(int i=0;i<n;i++){
sum+=eval(i);
}
return 2.0*sum/n+m;
}
}

对于用表代替递归还是没怎么太明白,递归中,比如:斐波那契数,F(i)都已经重复计算了,
如果用表代替递归,只要做一个for循环即可,多几个变量的声明来存储最近算出的斐波那契数。。。
bayougeng 2009-12-31
  • 打赏
  • 举报
回复
嘿嘿。。。
我一直以为数组是参数!
Dazzlingwinter 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chdw 的回复:]
很简单啊
Java codepublicstaticdouble evel2(int n) {double[] c=newdouble[n+1];double sum=0.0;
c[0]=1.0;for (int i=1; i<= n; i++) {
sum+= c[i-1];
c[i]=2.0* sum/ i+ i;
}return c[n];
}

Sum根本不需要重新计算,只是加上一个元素就行
是这样的。
evel1:
c[1]: 3.0
c[2]: 6.0
c[3]: 9.666666666666668
c[4]: 13.833333333333334
c[5]: 18.4
c[6]: 23.3
c[7]: 28.485714285714288
c[8]: 33.92142857142857
c[9]: 39.579365079365076
c[10]: 45.43730158730159
evel2:
c[1]: 3.0
c[2]: 6.0
c[3]: 9.666666666666668
c[4]: 13.833333333333334
c[5]: 18.4
c[6]: 23.3
c[7]: 28.485714285714288
c[8]: 33.92142857142857
c[9]: 39.579365079365076
c[10]: 45.43730158730159
[/Quote]
ChDw 2009-12-31
  • 打赏
  • 举报
回复
很简单啊
	public static double evel2(int n) {
double[] c = new double[n + 1];
double sum = 0.0;
c[0] = 1.0;
for (int i = 1; i <= n; i++) {
sum += c[i - 1];
c[i] = 2.0 * sum / i + i;
}
return c[n];
}


Sum根本不需要重新计算,只是加上一个元素就行
bayougeng 2009-12-31
  • 打赏
  • 举报
回复
我看了下,似乎没有什么办法。
因为后面的计算依赖前面的计算结果,数组也没有什么特别之处。
Dazzlingwinter 2009-12-31
  • 打赏
  • 举报
回复
LZ是这是哪里的题目?
自己先用数学知识看能化简不能
相关推荐
发帖
Java

4.9w+

社区成员

Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
帖子事件
创建了帖子
2009-12-31 03:02
社区公告
暂无公告