| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1528 人关注过本帖
标题:谁的效率高?
取消只看楼主 加入收藏
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
 问题点数:0 回复次数:11 
谁的效率高?
/*符号*/
Sign(int k)
{if(k==0) return 1;
else if(k==1) return(-2);
}

void Calculate(int count,int sum)
{char i;
for(i=0;i<2;i++)
{sum=sum+Sign(i)*stone[count];
if(count > 0)
Calculate(count-1,sum);/*递归调用直到count等于0*/
else if(count == 0)
{sum_no++;/*sum_no <= pow(2,count)*/
if(sum >= 0)
{if(min_sum > sum)
{min_sum=sum;
me[0]=sum_no;
me_total=1;
}
else if(min_sum == sum)
{
if(me_total < 15) me[me_total]=sum_no;
me_total++;
}
}
}
}
}


我将以上的函数Calculate(int count,int sum)改成下面的样子,主要是红色部分.

half=pow(2,count-1);

void Calculate(int count,int sum)
{char i;
for(i=0;i<2 && sum_no<half;i++)
{
sum=sum+Sign(i)*stone[count];
if(count > 0)
Calculate(count-1,sum);/*递归调用直到count等于0*/
else if(count == 0)
{sum_no++;/*sum_no <= pow(2,count-1)*/
if(min_sum > abs(sum))
{min_sum=abs(sum);
me[0]=sum_no;
me_total=1;
}
else if(min_sum == abs(sum);)
{
if(me_total < 15) me[me_total]=sum_no;
me_total++;
}
}
}
}

没改动前,程序将会执行pow(2,count)次函数Calculate(int count,int sum);
改动后只执行pow(2,count-1)次,少了一半;
但是,你看,我又增加了超过pow(2,count-1)次abs()函数的调用.
请问我这样改动能提高程序的执行效率吗???
为什么????

[此贴子已经被作者于2006-6-19 21:41:49编辑过]

搜索更多相关主题的帖子: 效率 
2006-06-19 21:36
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
以下是引用穆扬在2006-6-19 22:16:00的发言:
从效率的角度讲
应该先考虑把递归改成循环

另外我不清楚为什么要调用abs()
自己写一个表达式不就完了吗

你是说将abs()改为if(sum < 0) a=sum;else a=sum;
这样改跟直接调用差不多吧!!

从效率的角度讲
应该先考虑把递归改成循环-------->为什么??


Finding!!!
2006-06-19 22:25
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
没改动前,程序将会执行pow(2,count)次函数Calculate(int count,int sum);
改动后只执行pow(2,count-1)次,少了一半;
但是,你看,我又增加了超过pow(2,count-1)次abs()函数的调用.
请问我这样改动能提高程序的执行效率吗???
为什么????




那位可以回答我的问题!!!????

Finding!!!
2006-06-19 22:35
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
sum的值是不可以改变的(在for语句里的i等于2前)
不好意思,我没说清楚!!也许我的函数也难明白一些!

Finding!!!
2006-06-19 22:52
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
没改动前,程序将会执行pow(2,count)次函数Calculate(int count,int sum);
改动后只执行pow(2,count-1)次,少了一半;
但是,你看,我又增加了超过pow(2,count-1)次abs()函数的调用.
请问我这样改动能提高程序的执行效率吗???
为什么????




那位可以回答我的问题!!!????

Finding!!!
2006-06-19 22:53
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
实在不好意思!
一来题目很老了,有人讨厌我再提.
二来没必要看完全部代码.
三来我觉得我已将问题写清楚了,也许你不这样认为,你问一下不行吗!


stone[]确实是全局变量.

没改动前,程序将会执行pow(2,count)次函数Calculate(int count,int sum);
改动后只执行pow(2,count-1)次,少了一半;
但是,你看,我又增加了超过pow(2,count-1)次abs()函数的调用.
请问我这样改动能提高程序的执行效率吗???
为什么????


Finding!!!
2006-06-19 23:02
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
a=sum<0?-sum:sum ????
谢谢!!

Finding!!!
2006-06-19 23:32
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
以下是引用feng1256在2006-6-19 23:43:45的发言:

硬件现在的价格已经不像以前~ 所以不必过分追求效率

应该如13楼所讲 追求正确性,良好的可读性,然后才是效率

能说说怎样的程序具有"良好的可读性"吗?
或说要注意什么规范化的东西,能使程序更可读.
注释?
应该是"在什么地方下注释"更重要点吧!那一般是在什么地方下注释才必要呢??


Finding!!!
2006-06-19 23:54
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
以下是引用song4在2006-6-20 13:30:04的发言:
没改动前,程序将会执行pow(2,count)次函数Calculate(int count,int sum);
改动后只执行pow(2,count-1)次,少了一半;
但是,你看,我又增加了pow(2,count-1)次abs()函数的调用.
请问我这样改动能提高程序的执行效率吗???
为什么????

我就看这几句.
咱先加法学一遍.pow(2,count-1)+pow(2,count-1)=pow(2,count)
函数代价非常大,所以pow(2,count-1)+pow(2,count-1)次abs()函数的调用>pow(2,count)
楼主,编译器也愿做有规律的事情,单指效率是少用函数和全局.循环多的先执行(编译器优化代码后方便)
for(int i=0;i<4;i++)
{
for(int j=0;j<100;j++)
{
}
}
for(int i=0;i<100;i++)
{
for(int j=0;j<4;j++)
{
}
}
第一种效率比第二种好很多

"所以pow(2,count-1)+pow(2,count-1)次abs()函数的调用>pow(2,count)"
你这话的意思是宁可循环操作,也不调用函数,因为函数的代价太大了.
也就是说改后的程序效率不如没改的.

宁可循环操作,也不调用函数.有道理!

可惜你没看程序,其实在循环中也调用了函数Calculate(int count,int sum)啊!
不过还是谢谢你!在你的话中到经过头脑分析的东西!我也受益!


Finding!!!
2006-06-20 23:07
songweiwen
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2006-2-19
收藏
得分:0 
以下是引用–★–在2006-6-20 6:12:10的发言:

『数据结构与算法』告诉我们:
高效率的第一要素是算法设计

楼主不妨公布那道程序设计的题目,
比你高效N倍的程序定会跃然纸上。

往日无冤,近日无仇。俺–★–
为什么要“贬”楼主呢?因为
楼主的两版程序一个都没调通
证据:
1。如果都调通,效率高低立见分晓,何需问人?
2。新版不通。因为至少存在下列语法错误:
else if(min_sum == abs(sum);) //多了分号
{
if(me_total < 15) me[me_total]=sum_no;
me_total++;
}
3。老版不通。因为至少存在下列运行故障:
void Calculate(int count,int sum)
{ char i;
for(i=0;i<2;i++)
{ sum=sum+Sign(i)*stone[count];
if(count > 0)
Calculate(count-1,sum);
根据C的传值机制,红色累加的结果
无法通过目前的sum形参反馈回来。
4。新版程序的全局变量之多令人咋舌,
这就为调试埋伏下不少隐患。
===========================================
当然楼主下列自以为是的话语(floor 12)

实在不好意思!
一来题目很老了,有人讨厌我再提.
二来没必要看完全部代码.
三来我觉得我已将问题写清楚了,也许你不这样认为,你问一下不行吗!

出自一个求助者也令人厌恶。

楼主不妨公布那道程序设计的题目,
比你高效N倍的程序定会跃然纸上。
这话可是你说的哦!那我期待你高效N倍程序.
这题目本来很旧了,我也不想提,只是心里有点不甘,所以近段时间在想它.
下面是题目,你应该见过:

石头归并问题

转载:大家又没有比较好的思路阿!借鉴一下

Problem

你有一堆石头质量分别为W1,W2,W3...WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。

Input

该程序有多组测试数据,每组测试数据第一行为整数N(1<=N<=20),表示有N堆石子。接下去N行,为每堆石子的质量。

Output

每组测试数据只需输出合并后两堆的质量差的最小值。

Sample Input

5
5
8
13
27
14
2
4
4

Sample Output

3
0

"W<=100000",我没考虑那么重的石头!
这题目本身只重点要求一个结果:最的差值.
但我还想要具体分组的方法.没有这分组的方法,又怎样检验那个差值呢?是不是?
这个要求也有点合理吧?
石头的堆数也尽可能大些,我想计算30堆的,(这也是我不甘的地方,我没做到)
就是因为这点,所以我要比较程序执行的效率.
最好就是能用人脑去分析程序的效率啦!!!

还提这个题------->见笑了!!

Finding!!!
2006-06-20 23:29
快速回复:谁的效率高?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012630 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved