- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
两个位大整数相乘算法
求最大元和次大元
1.问题描述
从多个数中一次性查找出元素最大的值和最小值,查找元素规模即元素的个数n,用分治的思想编制程序,实现分治的最大元和最小元求法。进一步改进算法,使之能一次性求出最大和和次大元(即第二大元素)。
2.算法设计思想及描述
分治发的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立与原问题相同。递归地解决这些问题,然后将各个子问题的解合并得到原问题的解。基于课堂的分析知道,对于本问题k的值取为2,这样可以使子问题的规模是相同的,有利于算法实现。
为平衡分治时子问题的规模,这里约定需要查找元素的规模n是2的幂次方。
用数组存储需要查找的元素,用结构体存储返回的最大元和最小元。每次得到局部的最大元和局部次大元,然后局部最大元和最大元比较得到新的局部最大元,次大元和次大元比较得到新的局部次大元。深入分析,这种方式局部次大元是错误的。如两组元素中,a1>b1,a2>b2,当然a1和a2中较大的是新的局部最大元,但是b1和b2中较大的元素不是这四个元素中第二大的。
这样的方法漏掉了b1可能是次大元的情况,也就是说所有的元素中的次大元可能在与最大元比较的时候被漏掉了。弥补的方法就是每次将每个元素比自身小的元素都用一个淘汰数组保存起来,最后次大元就是最大元的淘汰数组中第二大的那个元素。
算法分析
运用分治算法解决此问题,是因为这种方法的优越行,下面通过时间复杂度的比较来说明。
通常算法,设置一个变量,等于需要比较的数组的第一个元素,然后依次与后面的n-1经行比较,需要比较n-1次得到最大元。同理,求得最小元的比较次数仍然是n-1次。设表示比较的次数则对于这种算法得到的值为
分治算法求最大元比较
解方程结果为,虽然二者都是线性增长的,可是增长率要小一些。实际编程时的实现有细微差距。另外,求最大元,次大元的时候次大元总是在最大元的淘汰数组中,所以求次大元时,多了从最大元数组中找次大元的情形,n取对数,增长率仍然是比较小的。
代码
#include "iostream.h"
#define N 10
int max(int a,int b)
{
return((a>b)?a:b);
}
int min(int a,int b)
{
return((a<b)?a:b);
}
void Search(int a[],int *max0,int *second0,int n)
{
int g[30];
int i,m;
int max1,max2,second1,second2;
if(n==1)
{*max0=a[0];
*second0=a[0];
}
else if(n==2)
{
*max0=max(a[0],a[1]);
*second0=min(a[0],a[1]);
}
else
{
m=n/2;
for(i=0;i<m;i++)
g[i]=a[i];
Search(g,&max1,&second1,m);
for(i=0;i<n-m;i++)
g[i]=a[i+m];
Search(g,&max2,&second2,n-m);
*max0=max(max1,max2);
*second0=max(min(max1,max2),max(second1,second2));
}
}
void main()
{
cout<<"用分治法同时求最大元和次大元\n";
int a[N];
int i,max,second;
cout<<"输入"<<N<<"个数:\n";
for(i=0;i<N;i++)
cin>>a[i];
Search(a,&max,&second,N);
cout<<"输出结果:\n";
cout<<"max="<<max<<"\n";
cout<<"second="<<second<<"\n";
}
两个n位大整数相乘算法
问题的描述
通过分治法求两个大整数的乘法
算法设计思想及算法分析
设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。如果将每2个1位数的乘法或加法看作一步运算,那么这种方法要作O(n2)步运算才能求出乘积XY。下面我们用分治法来设计一个更有效的大整数乘积算法。
x = |A|B| y=|C|D| 大整数X和Y的分段
我们将n位的二进制整数X和Y各分为2段,每段的长为n/2位(为简单起见,假设n是2的幂),如上
由此,X=A2n/2+B ,Y=C2n/2+D。这样,X和Y的乘积为:
XY=(A2n/2+B)
1亿VIP精品文档
相关文档
最近下载
- 《鱼类生理学》课程教学大纲.pdf
- 【课件】安全生产治本攻坚三年行动方案(2024-2026年)解读(43页).ppt
- Unit 3 Diverse cultures 重点单词、短语及句式精讲,课文重点小结 2020-2021学年【新教材】人教版(2019)高中英语必修第三册.docx
- 数值计算方法大作业.docx
- Kaplan&Norton--The Balanced Scorecard Measures That Drive Performance英文清晰.pdf
- 中美贸易战对中国出口业的影响.docx
- 【《中班幼儿分享行为现状及其培养策略分析(数据论文)》5000字】 .docx
- 贵州公务员面试真题及答案.docx
- 风景园林专业课程体系框架图.PDF
- 山东省潍坊市2020-2021学年高一下学期期中考试 生物 .doc VIP
文档评论(0)