- 1、本文档共59页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]算法复习
1.3.2渐近表示(P8) 定义1.1如果存在三个正常数 第2章 分 治 法 递归(recursion)是数学与计算机科学中的基本概念。程序设计语言中的递归程序可被简单地定义为对自己的调用。递归程序必须有终止条件。 例2.1 斐波那契(Fibonacci)序列。 找最大值与最小值 在含有N个不同元素的集合中同时找出它的最大值和最小值(maximumminimum)的最简单方法是将元素逐个进行比较。算法中用max和min分别表示最大值和最小值。算法描述如下: 如果数组中元素按照递增的次序排列,则找出最大值和最小值所需的元素比较次数为N一1,这是最佳的情况。如果数组中元素按照递减的次序排列,则找出最大值和最小值所需的元素比较次数为2(n-1),这是最坏情况。在平均情况下,A中将有一半元素使得第3行的比较为真,找出最大值和最小值所需的元素比较次数为3(n-1)/2。 Strassen矩阵乘法 矩阵乘法是科学计算中最基本的问题之一。设A和B是两个n×n的矩阵,它们的乘积C=AB也是一个n×n的矩阵。其中乘积矩阵中的元素Cij定义为 由此可得,计算矩阵C中的每个元素需要n次乘法和n-1次加法。因此,计算矩阵C的n2个元素所需的时间为O(n3)。 假设n为2的幂,运用分治策略,将矩阵分成4块大小相等的子矩阵,每个子矩阵都 如果子矩阵的规模大于2,则可以继续划分这些子矩阵,直至每个矩阵变成2 X 2的矩阵。对于2 X 2的矩阵的计算,只需8次乘法和4次减法,计算时间为0(1)。 设T(n)表示两个n×n矩阵相乘所需的计算时间,则由Cij(C=1,2)的计算可以看出,可将T(n)的计算转化为 计算8个 的矩阵相乘和4个 矩阵相 加,而计算 矩阵加法所需时间为O(n2),可得 该递归方程符合主定理的第一种情形,其解为T(n)=O(nlb8)=O(n3)。因此,直接的分治策略并没有降低算法的计算复杂度。1969年,Strassen经过对问题的分析,在分治策略的基础上,通过数学技巧,使算法的计算复杂度从O(n3)降到了O(n2.81)。当此结果第一次发表时,震动了数学界。在Strassen矩阵相乘(Strassen matrtrix multiplication)算法中,只用了7 个 的矩阵相乘,但增加了1 0个矩阵加、减法运算。这7个矩阵乘法是: 该递归方程仍然符合主定理的第一种情形,其解为 两个n位整数相乘(integer multiplication)的标准算法所需计算时间为 算法是此的自然,以至于我们可能会觉得没有更好的算法了。在这里,我们却要通过分治策略向大家展示一种确实存在的更好的算法。 采用分治法,将x和y都分成两部分: 可表示为如下的式子: 归并排序 归并排序(merge sorting)是分治法应用的另一个实例,由以下三步组成: (1)划分:将待排序孢个元素的序列划分成两令规模为n/2的子序列。 (2)解决:用归并排序递归地对每一子序列排序。 (3)合并:归并两个有序序列,得到排序结果。 当划分的子序列规模为1时,递归结束。因为一个元素的序列被认为是有序的。 1.归并算法及其运行时间 归并排序的关键操作是归并两个已排序的子序列的过程。用过程MERGE(A,p,q,r)表示归并两个有序序列A[p..q]和A[q+1..r]。当过程MERGE(A,p,q,r)执行完成后A[p..r]中包含的元素有序。过程MERGE(A,p,q,r)描述如下: * 算法 算法(algorithm)可以被定义为一个良定的计算过程,它具有一个或者若干输入值,并产生一个或者若干输出值。 人们采用一般术语陈述问题,确定输入/输出关系,而算法则是描述这种输入/输出关系的特定计算过程。 算法正确性:对每一个输入实例算法都能终止,并给出正确输出。 算法设计和分析的步骤可概括: (1)问题的陈述。 (2)模型的选择。 (3)算法的设计。 (4)算法的程序实现。 (5)算法分析。 算法具有以下五大特性 (1)确定性。一个算法中给出的每一个计算步骤,必须是精确的定义、无二义性的。 (2)有穷性。一个算法在执行有穷个计算步骤后必须停止。 (3)可行性。算法中要执行的每一个计算步骤都是可以在有
文档评论(0)