分治法的合并步骤是算法的
关键所在。有些问题的合并
方法比较明显,有些问题合并
方法比较复杂,或者是有多种合并方案;或者是合并方案不明显。究竟应该怎样合并,没有统一的模式,需要具体问题具体分析。
【问题】 大整数乘法
问题描述:
通常,在分析一个算法的计算复杂性时,都将加法和乘法运算当作是基本运算来处理,即将执行一次加法或乘法运算所需的计算
时间当作一个仅取决于计算机硬件处理速度的常数。
这个假定仅在计算机硬件能对参加运算的整数直接表示和处理时才是合理的。然而,在某些情况下,我们要处理很大的整数,它无法在计算机硬件能直接表示的范围内进行处理。若用浮点数来表示它,则只能近似地表示它的大小,计算结果中的有效数字也受到限制。若要精确地表示大整数并在计算结果中要求精确地得到所有位数上的数字,就必须用软件的方法来实现大整数的算术运算。
请设计一个有效的算法,可以进行两个n位大整数的乘法运算。
设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。如果将每2个1位数的乘法或加法看作一步运算,那么这种方法要作O(n2)步运算才能求出乘积XY。下面我们用分治法来设计一个更有效的大整数乘积算法。
图6-3 大整数X和Y的分段
我们将n位的二进制整数X和Y各分为2段,每段的长为n/2位(为简单起见,假设n是2的幂),如图6-3所示。
由此,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),我们有:
(2)
由此可得T(n)=O(n2)。因此,用(1)式来计算X和Y的乘积并不比小学生的方法更有效。要想改进算法的计算复杂性,必须减少乘法次数。为此我们把XY写成另一种形式:
XY=AC2n+[(A-B)(D-C)+AC+BD]2n/2+BD (3)
虽然,式(3)看起来比式(1)复杂些,但它仅需做3次n/2位整数的乘法(AC,BD和(A-B)(D-C)),6次加、减法和2次移位。由此可得:
(4)
用解递归方程的套用公式法马上可得其解为T(n)=O(nlog3)=O(n1.59)。利用式(3),并考虑到X和Y的符号对结果的影响,我们给出大整数相乘的完整算法MULT如下:
function MULT(X,Y,n); {X和Y为2个小于2n的整数,返回结果为X和Y的乘积XY}
begin
S=SIGN(X)*SIGN(Y); {S为X和Y的符号乘积}
X=ABS(X);
Y=ABS(Y); {X和Y分别取绝对值}
if n=1 then
if (X=1)
and(Y=1) then return(S)
else return(0)
else begin
A=X的左边n/2位;
B=X的右边n/2位;
C=Y的左边n/2位;
D=Y的右边n/2位;
ml=MULT(A,C,n/2);
m2=MULT(A-B,D-C,n/2);
m3=MULT(B,D,n/2);
S=S*(m1*2n+(m1+m2+m3)*2n/2+m3);
return(S);
end;
end;
上述二进制大整数乘法同样可应用于十进制大整数的乘法以提高乘法的效率减少乘法次数。
分享到:
相关推荐
《软考常用算法设计方法一2》是一份关于软件工程师资格考试(软考)中算法设计部分的重要参考资料,包含了大约30页的DOC文档。这份资料深入浅出地讲解了在软件工程和软件开发过程中至关重要的算法设计技巧,旨在帮助...
软考常用算法设计方法1.doc
【软考常用算法设计方法详解】 在信息技术领域,软件设计师经常需要解决各种复杂的问题,而算法设计是解决问题的关键。算法是一系列明确的指令,用于解决特定问题或执行特定任务。在软考(全国计算机技术与软件专业...
软考软件设计师常用算法是软件设计师备考资料,涵盖了各种常用算法设计方法,包括迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等。这些算法是解决问题的关键,正确选择和设计算法可以提高程序的...
《软考中级软件设计师历年真题》是一份针对国家计算机技术与软件专业技术资格(水平)考试,即“软考”中的中级软件设计师资格认证的重要学习资料。这份压缩包包含了历年的考试真题,是备考者熟悉考试形式、掌握考试...
《软考中级软件设计师学习资料》是一份专为准备参加国家软考中级软件设计师考试的学员精心准备的综合学习资源。这份压缩包包含了丰富的课程内容,旨在帮助考生全面理解和掌握软件设计领域的核心知识,提高考试通过率...
2. **数据结构与算法**:理解和应用基本的数据结构(如数组、链表、树、图等)以及常用的排序和查找算法,这是软件设计的基础。 3. **编程语言与编程技术**:掌握至少一种主流编程语言(如C++、Java、Python等)的...
3. **算法设计与分析**:掌握常用算法(排序、搜索、递归、动态规划)并能进行时间复杂度和空间复杂度分析,这对解决问题和优化程序性能至关重要。 4. **操作系统基础**:了解操作系统的基本原理,包括进程管理、...
根据提供的标题“软考嵌入式系统设计师教程高清珍藏”和描述“嵌入式系统设计师教程”,可以推断出这份材料主要针对的是参加软件水平考试(简称软考)中的嵌入式系统设计师这一科目的考生。软考是评估信息技术专业...
这涵盖了计算机科学的基础理论、软件工程方法、编程语言、数据结构、算法分析、操作系统、数据库管理、网络技术等多个领域。 这份资料中的“软考软件设计师教程(第5版)”可能包含了以下内容: 1. **软件工程基础...
本章“第 24 章:常用算法设计”深入探讨了这一主题,旨在帮助考生增强算法思维,提升问题解决能力。 一、算法基础 算法是解决问题或执行任务的精确步骤序列,它定义了一组明确的规则,这些规则可以被计算机执行。...
- **接口设计**:熟悉RESTful API等常用接口设计原则,能够设计出易于理解和使用的API。 #### 3. 编码实现 - **编程语言与工具**:熟悉至少一种主流编程语言(如Java、C#等),并熟练使用相应的开发工具(如Eclipse...
软考中级软件设计师是一项重要的认证,旨在考核从业者在软件设计、开发、维护等方面的专业技能和理论知识。这个压缩包文件包含了针对这一考试的专题复习笔记,是备考者的重要参考资料。 复习笔记涵盖了以下几个核心...
- 掌握二进制、八进制、十进制和十六进制等常用数制之间的转换方法。 - 了解不同数制在计算机系统中的应用。 2. **计算机内数据的表示** - 数的表示:掌握补码表示、整数和实数的表示方式,理解精度和溢出的概念...
你需要理解每个阶段的目标、任务和常用方法,如瀑布模型、迭代开发、敏捷开发等。同时,对软件质量保证、风险管理以及软件度量也应有深入认识。 二、程序设计与数据结构 这部分主要考察编程语言的基本语法、控制...
5. **数据结构与算法**:熟悉常见的数据结构(如数组、链表、树、图)及其操作,以及常用算法(排序、查找、图论算法等),这些是解决问题和优化代码效率的基础。 6. **软件设计与分析**:掌握模块化设计原则,面向...
- **CPU进制转换**:计算机中常用进制包括二进制、八进制、十进制和十六进制。16进制数0X000F可以表示为000FH,这是一种常见的十六进制表示方式。 - **原码、反码、补码和移码**:原码是直接表示数值的编码方式,...
计算机专业英语词汇软考常用词汇 计算机专业英语词汇是计算机专业人士必须掌握的基本知识之一,这些词汇是计算机科学和技术领域中常用的专业术语,涉及到计算机硬件、软件、网络、数据库、算法等多个方面。以下是...