- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
应用举例1求最大值和最小值 例:求2^n(2=n=10^9)个元素中的最大元与最小元。 【分析】假设数据个数为n,存放在数组a[1..n]中。可以直接进行比较: minn=a[1];maxx=a[1]; for(i=2;i=n;i++) if(a[i]maxx)maxx=a[i] else if(a[i]minn) min=a[i]; 使用这一算法,比较次数为2(n-1)。若n=10,则比较18次。 用分治法解决这个问题就是把集合a分成a1,a2两个子集,每个子集有n/2个元素,应用递归结构找出两个子集的最大元和最小元,比较得到的两个最大元和最小元即可得到整个集合a中的最大元和最小元。 ? divide:把n个数分成两半 ? conquer:各需要t(n/2)次比较 ? combine:最大值相互比较,最小值也相互比较, 共2次 int max1,min1,max2,min2,maxx,minn; void maxmin(int r1,int r2) { if(r2==r1+1) { if(a[r2]a[r1]){ max1=a[r2];min1=a[r1];} else {min1=a[r2];max1=a[r1];} } else{ d=(r1+r2)/2; maxmin(r1,d); max2=max1;min2=min1; maxmin(d,r2); if(max1max2)maxx=max1; else maxx=max2; if(min1min2)minn=min2; else minn=min1; } } int main() { for(i=1;i=n;i++)cina[i]; maxmin(1,n); coutmaxx“ ”minnendl; return 0; } 应用举例2:一元三次方程求解 【问题描述】:有形如:ax^3+bx^2+cx+d=0这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后4位。 提示:记方程f(x)=ax3+bx2+cx+d,若存在2个数x1和x2,且x1x2,f(x1)*f(x2)0,则在(x1,x2)之间一定有一个根。 【样例输入】:1 -5 -4 20 【样例输出】:-2.00 2.00 5.00 如果精确到小数点后两位,可用简单的枚举法:将x从-100.00 到100.00(步长0.01) 逐一枚举,得到20000个 f(x),取其值与0最接近的三个f(x),对应的x即为答案。而题目已改成精度为小数点后4位,枚举算法时间复杂度将达不到要求。 直接使用求根公式,极为复杂。加上本题的提示给我们以启迪:采用二分法逐渐缩小根的范围,从而得到根的某精度的数值 当已知区间(a,b)内有一个根时,用二分法求根,若区间(a,b)内有根,则必有f(a)*f(b)0。重复执行如下的过程: (1).若a+0.0001b或f((a+b)/2)=0,则可确定根为(a+b)/2并退出过程; (2).若f(a)* f((a+b)/2)0,则由题目给出的定理可知根在区间(a,(a+b)/2)中,故对区间重复该过程; (3).若f(a)* f((a+b)/2)0,则必然有f((a+b)/2)* f(b)0,根在((a+b)/2,b)中,对此区间重复该过程。 执行完毕,就可以得到精确到0.0001的根。 分 析 void divide(double x1,double x2) { double x0,y0,y1,y2; x0=(x1+x2)/2; y1=cal(x1); y2=cal(x2); y0=cal(x0); if(x2-x10.001y1*y20) {printf(%.2f ,(x2+x1)/2);return;} if(y1*y00||x0-x11) divide(x1,x0); if(y0*y20||x2-x01) divide(x0,x2); } 核心代码 4.4.4 案例实现 例题的显式条件分别是A、X和C讲的三句假话: ①A说:他和X
文档评论(0)