计算机算法设计与分析第1章算法概述
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12
(一)算法性质
(3) 同一个问题可以存在多种解决的算法。
(4) 同一个问题的几种算法可能会基于完全不
同的解题思路,而且解题速度也会有显著不
同。
13
(二)问题求解过程
1)问题的陈述 用科学规范的语言,对所求解的问题做准确的 描述. 2)建立数学模型 通过对问题的分析,找出其中的所有操作对象 及操作对象之间的关系并用数学语言加以描 述. 3)算法设计 根据数学模型设计问题的计算机求解算法. 14
38
为此,我们引入以下渐进意义下的记号: O o
θ
39
(1)渐近上界记号O
在下面的讨论中,对所有n,时间复杂性函数
f(n) 0,g(n) 0, g(n)也称为 f(n)的阶函数 。
渐近上界记号O——给出函数f的一个上限
O(g(n)) = { f(n) | 存在正常数c和n0使得对所有 n n0有:0 f(n) cg(n) }
40
(1)渐近上界记号O——例
例1:【线性函数】考察f(n)=3n+2。 当n>=2时,3n+2<=3n+n=4n,所以f(n)=O(n), f(n)是一个线性变化的函数。类似地, 100n+6=O(n)。 特别地,当f(n)是一个常数c时,如f(n)=9,可 以记为f(n)=O(1)。
21
4、算法的一个c++程序语言实现
int Euclid(int m,int n) // 计算gcd(m,n) // 输入:非负整数m,n,其中m,n不同时为零 // 输出:m,n的最大公约数 { int r=0; if(m*n==0) return 0; // m,n不符合输入规范时返回0 while (n > 0) { r = m mod n; m = n; n = r; } return m; }
35
四、算法的渐近复杂性
随着要求用计算机解决的问题越来越复杂, 规模越来越大,对这类问题的求解算法做复 杂性分析具有特别重要的意义。 因此,对于规模充分大,结构又十分复杂的 算法,人们提出了如何简化其复杂性分析, 及求解其复杂性函数f(n)的上界和下界的问 题。
36
渐近复杂性的数学表述
31
3、算法的改进
上面例子中顺序查找算法的改进有: 进行二分(折半)查找,即反复把供查找的 数组分成两半,然后在其中一半继续查找。
A[mid]>c
A[mid]<c
A[1]
A[mid]
A[m]
32
3、算法的改进
int search_Bin(int A[ ], int c, int m) { int low=1,high=m, mid=0, found=0; while( found==0 && high>=low) { mid=(low+high)/2; if( A[mid]==c) found=1; else if( A[mid]<c) low=mid+1 else high=mid-1 } if ( found==1) return mid; else return 0; }
33
3、算法的改进
在最坏情况下,查找成功时最多只需检测A [1...m]中的∟logm」+1个分量,而改进前 最坏情况下需要比较m个分量。 如:c=5, A[1...11]={ 1,2,3,.....,11} 对于查找算法,减少比较次数可以最有效地 降低算法时间复杂度。 算法改进的目的就是为了提高效率! 注:本书中出现的logn相当于log2n。
2、算法的时间复杂性计算
最好情况:比较次数为1 Tmin (m)=2a+2t - -时间复杂度函数 最坏情况:比较次数为m Tmax(m) =(m+1)a+(2m+1)t+(m-1)s
平均情况:假定所有数组元素是不同的,并 且每个元素被查找的概率是相同的。则平均 比较次数为(m+1)/2 Tavg(m)=0.5(m+3)a+0.5(2m+3)t+0.5(m-1)s
4
授课内容
第1章 算法概述 第2章 递归与分治策略 第3章 动态规划 第4章 贪心算法 第5章 回溯法 第6章 分支限界法 *7-9章属研究生学习内容,可自学了解。
5
第1章 算法概述
学习要点:
一、理解算法的概念,以及问题求解的 过程。
二、掌握算法的几种描述方式。 三、理解算法的计算复杂性概念。
用形式简单的函数代替形式复杂的函数: T(n) , as n ;(这里是指充分大) (T(n) - t(n) )/ T(n) 0 ,as n; t(n)是T(n)的渐近性态,为算法的渐近复
杂性。
37
渐近复杂性的数学表述
(T(n) - t(n) )/ T(n) 0 ,as n;
20
3、算法的一个伪代码描述
ALGORITHM Euclid(m,n) // 计算gcd(m,n) // 输入:非负整数m,n,其中m,n不同时为零 // 输出:m,n的最大公约数 while n ≠ 0 do r ← m mod n m ← n n ← r return m
行次数是有限的,执行每条指令的时间也是 有限的。
10
(一)算法的性质
(5)可实现性:此性质是指算法中有待实现的 运算都是相当基本的,每种运算至少在原理 上能由人用纸和笔在有限的时间内完成。 (补充)
11
(一)算法性质
2、关于算法有几个要点:
(1) 算法所处理的输入的值域必须严格定义。 (2) 同样一种算法可以用几种不同的形式来描 述。
在数学上, t(n)是T(n)的渐近表达式,是T(n)略
去低阶项留下的主项。它比T(n) 简单。
例如: T(n)=3n2+4nlogn+7; t(n) =3n2 T(n)=4nlogn+7n; t(n) =4nlogn 因此,只要考察当问题规模充分大时,算法复 杂性在渐进意义下的阶,就可以判定出哪一个 算法的效率高。
8
图1.1 算法的概念图
(一)算法的性质
1、算法具有某些特性,如下几条:
(1)输入:有零个或多个外部提供的量作为算
法的输入。
(2)输出:算法产生至少一个量作为输出。这 些输出是和输入有某种特定关系的量。
9
(一)算法的性质
(3)确定性:组成算法的每条指令是清晰,无
歧义的。
(4)有限性(有穷性):算法中每条指令的执
29
2、算法的时间复杂性计算
int search(int A[ ], int m, int c) { int i=1; while( A[i]<c && i<m ) i=i+1; if (A[i]==c) return i; else return 0; }
a
2mt
(m-1)(s+a) t
a
30
分析算法包括 定量的分析算法需要多少计算 时间和存储空间,分析算法不仅可以预计 算 法能否有效得完成任务,而且可以知道算法 在最坏、最好和平均情况下的运算时间,对 解决同一问题的不同算法的优劣作出比较。
18
二、算法的几种描述方式
1、计算两个整数的最大公约数问题的一个现 代数学术语表述 欧几里得算法基于的方法是重复应用下列 等式: gcd (m , n) = gcd (n , m mod n) , 直到m mod n等于0。
16
(四)如何确认算法(证明其正确性)
证明算法对所有可能的输入都能算出正确的 答案,这一工作称为算法确认。这一领域是 当前许多计算机工作者集中研究的对象,还 处于相当初期的阶段。 在学习本课程中,我们仅对算法的正确性进 行一般的非形式化讨论,以及对算法的程序 实现进行测试验证。
17
(五)如何分析(评价)算法
gcd(60,24)=gcd(24,12)=gcd(12,0)=12 注:gcd (m , 0) =m,m mod n 表示m除以n之后的余 数,称为模运算
19
2、算法的一个结构化的描述 计算gcd(m,n)的欧几里得算法: 第一步:如果n=0,返回m的值作为结果,同 时过程结束;否则,进入第二步。 第二步:用n去除m,将余数赋给r。 第三步:将n的值赋给m,将r的值赋给n,返 回第一步。
课程安排
理论课:1~10周,40学时 周二(5-6)、周五(1-2)
上机: 18学时
期末考试: 闭卷笔试,第 11周
上课点名三次不到者取消考试资格; 迟到或作业缺交,一次扣10分(平时成绩)。
1
教学目的和要求
本课程是计算机类专业的专业基础课程; 通过课程学习和上机实践,对计算机常用算 法有一个较全面的了解,掌握通用算法的一 般设计方法; 学会对算法的时间、空间复杂度分析,掌握 提高算法效率的方法和途径。
2
学习算法的重要性
(一) 从理论和实践的角度理解 —计算机科学的基石;掌握标准算法 (二)从算法对于程序的重要性来讲 —皮之不存,毛将附焉? (三) 从对同学们的能力培养看 —开发分析问题的能力
3
算法分析与设计课程 与 数据结构课程
(一)数据结构关心的对象 各种数据结构的作用和效率、具体的问题 (二)算法设计与分析关心的对象 算法设计技术的适用性和效率、一般性方 法
34
4、时间复杂性的计量
算法的时间复杂性计量是算法的运算时间, 但对于同一类问题,采用算法的基本运算次 数作为算法的运算时间。 “汉诺塔”的基本运算是圆盘的移动次数; 查找、排序算法:元素的比较次数; 矩阵相乘:两个数的相乘; 树的搜索:节点的访问; 图的算法:节点和边的访问。
22
其他方法
程序流程图等,不再一一列举。
23
三、算法复杂性分析
算法复杂性是算法效率的度量,是评价算法优劣的 重要依据。
算法复杂性的高低体现在运行算法所需要的计算机 资源,即时间和空间(存储器)资源的多少上。
算法的时间复杂性T(n),空间复杂性S(n)。 其中n是问题的规模(输入大小)。
27
2、算法的时间复杂性计算
例:顺序查找算法的时间复杂度计算: 已知不重复,从小到大排列的m个整数的数 组A[1...m],m=2K,K为正整数。 对于给定的整数c,要求找到一个下标i,使得 A[i]=c.找不到返回0。
A[1]
A[i]=c
A[m]
28
分析: 问题的规模为m 设元运算执行时间:赋值 a, 判断 t, 加法 s 设 c 在A中查找成功
41
(1)渐近上界记号O——例
例2:【平方函数】考察f(n2)= 10n2 +4n+2 。 当n>=2时,10n2 +4n+2 <= 10n2 +5n , 当n>=5时,10n2 +5n<= 10n2 +n2 =11 n2 , 所以f(n)=O(n2) 。 同理, 对于f(n)= 6×2n+n2 , f(n)=O(2n) 。 (当n>=4时, n2 <= 2n )
(二)问题求解过程
4)算法的正确性证明 证明算法对一切合法输入均能在有限次计算 后产生正确输出. 5)算法的程序实现 将算法正确地编写成机器语言程序. 6)算法分析 对执行该算法所消耗的计算机资源进行估算.
15
(三)如何设计算法
通过学习已被实践证明是有用的一些基本设 计策略,如递归、回溯等,掌握一般的算法 设计方法,学会设计高效的算法。
Tmin(n) = min{ T(I) | size(I)=n }
其中 size(I)= n 表示 I 是规模为n的实例
26
1、算法的三种时间复杂性
(3)平均情况下的时间复杂性
Tavg(n) =
size ( I ) n
p( I )T ( I )
其中 p(I) 是实 例I出现的概率。
24
三、算法复杂性分析
本课程主要对算法的时间复杂性进行分析。
关于算法的复杂性,有两个问题要弄清楚:
(1)用怎样的一个量(指标)来表达一个算法的
复杂性;
(2)对于一个算法,怎样具体计算它的复杂性。
25
1、算法的三种时间复杂性
算法的最坏、最好和平均时间复杂性 (1)最坏情况下的时间复杂性 Tmax(n) = max{ T(I) | size(I)=n } (2)最好情况下的时间复杂性
四、掌握算法渐近复杂性的数学表述。
6
什么是算法?
我们来编写一个烧开水的算法:
百度文库
输入自来水 循环(反复)加热直到水开 输出开水
7
一、算法(Algorithm)
算法概念:通俗地讲,算法是指解决问题
的一种方法或一个过程。严格地讲,算法是 由若干条指令组成的有穷序列。
问题
算法 输入 “计算设备” 输出