当前位置:
文档之家› 计算机算法设计与分析第1章算法概述
计算机算法设计与分析第1章算法概述
课程安排
理论课:1~10周,40学时 周二(5-6)、周五(1-2)
上机: 18学时
期末考试: 闭卷笔试,第 11周
上课点名三次不到者取消考试资格; 迟到或作业缺交,一次扣10分(平时成绩)。
1
教学目的和要求
本课程是计算机类专业的专业基础课程; 通过课程学习和上机实践,对计算机常用算 法有一个较全面的了解,掌握通用算法的一 般设计方法; 学会对算法的时间、空间复杂度分析,掌握 提高算法效率的方法和途径。
24
三、算法复杂性分析
本课程主要对算法的时间复杂性进行分析。
关于算法的复杂性,有两个问题要弄清楚:
(1)用怎样的一个量(指标)来表达一个算法的
复杂性;
(2)对于一个算法,怎样具体计算它的复杂性。
25
1、算法的三种时间复杂性
算法的最坏、最好和平均时间复杂性 (1)最坏情况下的时间复杂性 Tmax(n) = max{ T(I) | size(I)=n } (2)最好情况下的时间复杂性
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
在数学上, t(n)是T(n)的渐近表达式,是T(n)略
去低阶项留下的主项。它比T(n) 简单。
例如: T(n)=3n2+4nlogn+7; t(n) =3n2 T(n)=4nlogn+7n; t(n) =4nlogn 因此,只要考察当问题规模充分大时,算法复 杂性在渐进意义下的阶,就可以判定出哪一个 算法的效率高。
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,返 回第一步。
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)。
22
其他方法
程序流程图等,不再一一列举。
23
三、算法复杂性分析
算法复杂性是算法效率的度量,是评价算法优劣的 重要依据。
算法复杂性的高低体现在运行算法所需要的计算机 资源,即时间和空间(存储器)资源的多少上。
算法的时间复杂性T(n),空间复杂性S(n)。 其中n是问题的规模(输入大小)。
2
学习算法的重要性
(一) 从理论和实践的角度理解 —计算机科学的基石;掌握标准算法 (二)从算法对于程序的重要性来讲 —皮之不存,毛将附焉? (三) 从对同学们的能力培养看 —开发分析问题的能力
3
算法分析与设计课程 与 数据结构课程
(一)数据结构关心的对象 各种数据结构的作用和效率、具体的问题 (二)算法设计与分析关心的对象 算法设计技术的适用性和效率、一般性方 法
16
(四)如何确认算法(证明其正确性)
证明算法对所有可能的输入都能算出正确的 答案,这一工作称为算法确认。这一领域是 当前许多计算机工作者集中研究的对象,还 处于相当初期的阶段。 在学习本课程中,我们仅对算法的正确性进 行一般的非形式化讨论,以及对算法的程序 实现进行测试验证。
17
(五)如何分析(评价)算法
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; }
4
授课内容
第1章 算法概述 第2章 递归与分治策略 第3章 动态规划 第4章 贪心算法 第5章 回溯法 第6章 分支限界法 *7-9章属研究生学习内容,可自学了解。
5
第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; }
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) }
分析算法包括 定量的分析算法需要多少计算 时间和存储空间,分析算法不仅可以预计 算 法能否有效得完成任务,而且可以知道算法 在最坏、最好和平均情况下的运算时间,对 解决同一问题的不同算法的优劣作出比较。
18
二、算法的几种描述方式
1、计算两个整数的最大公约数问题的一个现 代数学术语表述 欧几里得算法基于的方法是重复应用下列 等式: gcd (m , n) = gcd (n , m mod n) , 直到m mod n等于0。
35
四、算法的渐近复杂性
随着要求用计算机解决的问题越来越复杂, 规模越来越大,对这类问题的求解算法做复 杂性分析具有特别重要的意义。 因此,对于规模充分大,结构又十分复杂的 算法,人们提出了如何简化其复杂性分析, 及求解其复杂性函数f(n)的上界和下界的问 题。
36
3、算法的改进
在最坏情况下,查找成功时最多只需检测A [1...m]中的∟logm」+1个分量,而改进前 最坏情况下需要比较m个分量。 如:c=5, A[1...11]={ 1,2,3,.....,11} 对于查找算法,减少比较次数可以最有效地 降低算法时间复杂度。 算法改进的目的就是为了提高效率! 注:本书中出现的logn相当于log2n。
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
四、掌握算法渐近复杂性的数学表述。
6
什么是算法?
我们来编写一个烧开水的算法:
输入自来水 循环(反复)加热直到水开 输出开水
7
一、算法(Algorithm)
算法概念:通俗地讲,算法是指解决问题
的一种方法或一个过程。严格地讲,算法是 由若干条指令组成的有穷序列。
问题
算法 输入 “计算设备” 输出
行次数是有限的,执行每条指令的时间也是 有限的。
10
(一)算法的性质
(5)可实现性:此性质是指算法中有待实现的 运算都是相当基本的,每种运算至少在原理 上能由人用纸和笔在有限的时间内完成。 (补充)
11
(一)算法性质
2、关于算法有几个要点:
(1) 算法所处理的输入的值域必须严格定义。 (2) 同样一种算法可以用几种不同的形式来描 述。
12
(一)算法性质
(3) 同一个问题可以存在多种解决的算法。