下载此文档

两个n位大整数相乘算法.doc


文档分类:高等教育 | 页数:约6页 举报非法文档有奖
1/6
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/6 下载此文档
文档列表 文档介绍
求最大元和次大元

从多个数中一次性查找出元素最大的值和最小值,查找元素规模即元素的个数n,用分治的思想编制程序,实现分治的最大元和最小元求法。进一步改进算法,使之能一次性求出最大和和次大元(即第二大元素)。

分治发的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立与原问题相同。递归地解决这些问题,然后将各个子问题的解合并得到原问题的解。基于课堂的分析知道,对于本问题k的值取为2,这样可以使子问题的规模是相同的,有利于算法实现。
为平衡分治时子问题的规模,这里约定需要查找元素的规模n是2的幂次方。
用数组存储需要查找的元素,用结构体存储返回的最大元和最小元。每次得到局部的最大元和局部次大元,然后局部最大元和最大元比较得到新的局部最大元,次大元和次大元比较得到新的局部次大元。深入分析,这种方式局部次大元是错误的。如两组元素中,a1>b1,a2>b2,当然a1和a2中较大的是新的局部最大元,但是b1和b2中较大的元素不是这四个元素中第二大的。
这样的方法漏掉了b1可能是次大元的情况,也就是说所有的元素中的次大元可能在与最大元比较的时候被漏掉了。弥补的方法就是每次将每个元素比自身小的元素都用一个淘汰数组保存起来,最后次大元就是最大元的淘汰数组中第二大的那个元素。
算法分析
运用分治算法解决此问题,是因为这种方法的优越行,下面通过时间复杂度的比较来说明。
通常算法,设置一个变量,等于需要比较的数组的第一个元素,然后依次与后面的n-1经行比较,需要比较n-1次得到最大元。同理,求得最小元的比较次数仍然是n-1次。设表示比较的次数则对于这种算法得到的值为
分治算法求最大元比较
解方程结果为,虽然二者都是线性增长的,可是增长率要小一些。实际编程时的实现有细微差距。另外,求最大元,次大元的时候次大元总是在最大元的淘汰数组中,所以求次大元时,多了从最大元数组中找次大元的情形,n取对数,增长率仍然是比较小的。
代码
#include ""
#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

两个n位大整数相乘算法 来自淘豆网www.taodocs.com转载请标明出处.