两个n位大整数相乘算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

求最大元和次大元

1.问题描述

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

分治发的基本思想是将一个规模为n 的问题分解为k 个规模较小的子问题,这些子问题相互独立与原问题相同。递归地解决这些问题,然后将各个子问题的解合并得到原问题的解。基于课堂的分析知道,对于本问题k 的值取为2,这样可以使子问题的规模是相同的,有利于算法实现。

为平衡分治时子问题的规模,这里约定需要查找元素的规模n 是2的幂次方。

用数组存储需要查找的元素,用结构体存储返回的最大元和最小元。每次得到局部的最大元和局部次大元,然后局部最大元和最大元比较得到新的局部最大元,次大元和次大元比较得到新的局部次大元。深入分析,这种方式局部次大元是错误的。如两组元素中,a1>b1,a2>b2,当然a1和a2中较大的是新的局部最大元,但是b1和b2中较大的元素不是这四个元素中第二大的。

这样的方法漏掉了b1可能是次大元的情况,也就是说所有的元素中的次大元可能在与最大元比较的时候被漏掉了。弥补的方法就是每次将每个元素比自身小的元素都用一个淘汰数组保存起来,最后次大元就是最大元的淘汰数组中第二大的那个元素。

3.算法分析

运用分治算法解决此问题,是因为这种方法的优越行,下面通过时间复杂度的比较来说明。

通常算法,设置一个变量,等于需要比较的数组的第一个元素,然后依次与后面的n-1经行比较,需要比较n-1次得到最大元。同理,求得最小元的比较次数仍然是n-1次。设()n T 表示比较的次数则对于这种算法得到()n T 的值为

()22n T n =-

分治算法求最大元比较

1

()2()22

T n n

T ⎧⎪=⎨+⎪⎩ 解方程结果为() 1.52T n n =-,虽然二者都是线性增长的,可是增长率要小一些。实际编程

时的实现有细微差距。另外,求最大元,次大元的时候次大元总是在最大元的淘汰数组中,所以求次大元时,多了从最大元数组中找次大元的情形,n取对数,增长率仍然是比较小的。

4.代码

#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

}

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

g[i]=a[i];

Search(g,&max1,&second1,m);

for(i=0;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<<"输入"<

for(i=0;i

cin>>a[i];

Search(a,&max,&second,N);

cout<<"输出结果:\n";

cout<<"max="<

cout<<"second="<

}

两个n位大整数相乘算法

(1)问题的描述

通过分治法求两个大整数的乘法

(2)算法设计思想及算法分析

设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)(C2n/2+D)=AC2n+(AD+CB)2n/2+BD (1)

如果按式(1)计算XY,则我们必须进行4次n/2位整数的乘法(AC,AD,BC和BD),

以及3次不超过n位的整数加法(分别对应于式(1)中的加号),此外还要做2次移位(分别对应于式(1)中乘2n和乘2n/2)。所有这些加法和移位共用O(n)步运算。设T(n)是2个n位整数相乘所需的运算总数,则由式(1),我们有:

相关文档
最新文档