2017算法设计及其高效实现教案

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

安徽大学本科教学课程教案

课程名称:算法设计及其高效实现

课程代码:

开课单位:安徽大学计算机科学与技术学院

授课教师:**

职称/学位:副教授/博士

开课时间:二○一六至二○一七学年第二学期

第1次课程教学方案

第1次教学活动设计

第2次课程教学方案

第2次教学活动设计

教学

环节

内容设计与手段

导入新课由上节了解的算法过程,理解一些具体的算法实现。理解递归方程求解一般过程,掌握猜想法,迭代法。掌握主方法解递归方程。

讲授内容用迭代法估计递归方程解的渐近阶不要求推测解的渐近表达式,但要求较多的代数运算。方法的思想是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计来达到对方程左端即方程的解的估计。

作为一个例子,考虑递归方程:

接连迭代二次可将右端项展开为:

由于对地板函数有恒等式:

上式化简为:

这仍然是一个递归方程,右端项还应该继续展开。容易看出,迭代i次后,将有:

而且当时,

方程解为T(n)=O(n)。

用主方法为估计形如:T(n)=aT(n/b)+f(n) 的递归方程解的渐近阶提供三个可套用的公式,其中a≥1和b≥1是常数,f (n)是一个确定的正函数。该方程是一类分治法的时间复杂性所满足的递归关系,即一个规模为n的问题被分成规模均为n/b的a个子间题,递归地求解这a个子问题,然后通过对这a个子间题的解的综合,得到原问题的解。如果用T(n)表示规模为n的原问题的复杂性,用f(n)表示把原问题分成a个子问题和将a个子问题的解综合为原问题的解所需要的时间,我们便有该方程。

归纳总结通过具体例子来理解递归方程求解的一般过程。掌握了猜想法,迭代法等方法的算法流程。

第3次课程教学方案

第3次教学活动设计

第4次课程教学方案

第4次教学活动设计

教学

环节

内容设计与手段

导入新课理解快速排序、大整数乘法算法的实现分治法的问题分解和合并。

讲授内容

快速排序的基本思想是基于分治策略的。对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分三步处理:

分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。合并(Merge):由于对分解出的两个子序列的排序是就地进行的,所以在L[p..q]和L[q+1..r]都排好序后不需要执行任何计算L[p..r]就已排好序。

设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。下面我们用分治法来设计一个更有效的大整数乘积算法。

我们将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),我们有:

(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(n log3)=O(n1.59)。

归纳总结懂得快速排序算法的具体实现过程

通过例子了解了大整数乘法算法的实现

第5次课程教学方案

第5次教学活动设计

教学

环节

内容设计与手段

导入新课Strassen矩阵乘法问题。最接近点对问题

讲授内容

若A和B是2个n×n的矩阵,则它们的乘积C=AB同样是一个n×n的矩阵。A和B的乘积矩阵C中的元素C[i,j]定义为:

若依此定义来计算A和B的乘积矩阵C,则每计算C的一个元素C[i,j],需要做n个乘法和n-1次加法。因此,求出矩阵C的n2个元素所需的计算时间为0(n3)。

60年代末,Strassen采用分治技术,将计算2个n阶矩阵乘积所需的计算时间改进到O(n log7)=O(n2.18)。

首先,我们还是需要假设n是2的幂。将矩阵A,B和C中每一矩阵都分块成为4个大小相等的子矩阵,每个子矩阵都是n/2×n/2的方阵。由此可将方程C=AB重写为:

(1)

由此可得:

C11=A11B11+A12B21 (2)

C12=A11B12+A12B22 (3)

C21=A21B11+A22B21 (4)

2个n/2×n/2矩阵的加法显然可以在c*n2/4时间内完成,这里c是一个常数。因此,上述分治法的计算时间耗费T(n)应该满足:

这个递归方程的解仍然是T(n)=O(n3)。因此,该方法并不比用原始定义直接计算更有效。

最接近点对问题的提法是:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小。

此时S中的点为平面上的点,它们都有2个坐标值x和y。为了将平面上点集S线性分割为大小大致相等的2个子集S1和S2,我们选取一垂直线l:x=m来作为分割直线。其中m为S中各点x坐标的中位数。由此将S分割为S1={p∈S|p x≤m}和S2={p∈S|p x>m}。从而使S1和S2分别位于直线l的左侧和右侧,且S=S1∪S2 。由于m是S中各点x坐标值的中位数,因此S1和S2中的点数大致相等。

归纳总结根据具体事例来理解Strassen矩阵乘法问题。了解到最接近点对问题的具体算法步骤。

相关文档
最新文档