第1章 算法概述
最好情况( • (2)最好情况(Best case)下的时间复杂性 最好情况 •
Tmin(n) = min{ T(I) | size(I)=n }
• (3)平均情况(Average case)下的时间复杂性 平均情况( 平均情况 •
Tavg(n) =
size ( I ) =n
∑ p( I )T ( I )
算法是指解决问题的一种方法或一个过程。 • 算法是若干指令的有穷序列,满足性质: • (1)输入 输入:有外部提供的量作为算法的输入。 输入 • (2)输出 输出:算法产生至少一个量作为输出。 输出 • (3)确定性 确定性:组成算法的每条指令是清晰,无歧义的。 确定性 • (4)有限性 有限性:算法中每条指令的执行次数是有限的,执行每条指令 有限性 的时间也是有限的。 • (5)可行性:算法描述的操作可以通过已经实现的基本操作执行有 (5)可行性: 可行性 限次来实现。
用科学规范的语言,对所求解的问题做准确的描述. 用科学规范的语言,对所求解的问题做准确的描述.
2)建立数学模型
通过对问题的分析, 通过对问题的分析,找出其中的所有操作对象及操作对象之间 的关系并用数学语言加以描述. 的关系并用数学语言加以描述.
3)算法设计
根据数学模型设计问题的计算机求解算法. 根据数学模型设计问题的计算机求解算法.
c ⋅ g(n)
Running Time
f (n)
n0
Input Size
•算法运行时间的上限 算法运行时间的上限 •上界的阶越低,则评估就越精确,结果就越有价 上界的阶越低,则评估就越精确, 上界的阶越低 T(n)= 值。例:T(n) =3n2 ,T(n)=O(n2),而n2= 取前者。 O(n3), 取前者。
4)算法的正确性பைடு நூலகம்明
证明算法对一切合法输入均能在有限次计算后产生正确输出. 证明算法对一切合法输入均能在有限次计算后产生正确输出.
5)算法的程序实现
将算法正确地编写成机器语言程序. 将算法正确地编写成机器语言程序.
6)算法分析
对执行该算法所消耗的计算机资源进行估算. 对执行该算法所消耗的计算机资源进行估算.
1.1 算法及其重要特性
• 软件(software):程序及其各种文档资料的总称 • 程序(algorithm)=算法+数据结构 • 算法(procedure):解的描述(程序的灵魂) • 数据结构(data structure):现实世界的数据模型 • 语言(language):实现的工具
算法(Algorithm) 算法(Algorithm)
• (1)Tmax(n) = max{ T(I) | size(I)=n }=n • (2)Tmin(n) = min{ T(I) | size(I)=n }=1 • (3)在平均情况下,假设: • • (a) 搜索成功的概率为p ( 0 ≤ p ≤ 1 ); (b) 在数组的每个位置i ( 0 ≤ i < n )搜索成功的概率相同,均为
Meaning: for all data sets big 渐近复杂性分析的记号 enough (i.e., n>n0), the algorithm always executes in less than C|g(n)| 在下面的讨论中,对所有n,f(n) ≥ 0,g(n) ≥ 0。 (1)渐近上界记号O(Big-O) 渐近上界记号O 渐近上界记号 )
1.2 算法的描述方法
算法的描述方法 • 自然语言 – 优点:容易理解 – 缺点:冗长、二义性 – 使用方法:粗线条描述算法思想 – 注意事项:避免写成自然段 欧几里德算法:①输入m和n; ②求m除以n的余数r; ③若r等于0,则n为最大公约数,算法结束; 否则执行第④步; ④将n的值放在m中,将r的值放在n中; ⑤重新执行第②步。
举例:
例1 :f(n) = 2n + 3 = O(n) 当n≥3时,2n+3≤3n,所以,可选 = 3,n0 = 3。对于 时 ,所以,可选c , 。对于n≥n0,f(n) , = 2n + 3≤3n,所以,f(n) = O(n),即2n + 3∈O(n)。这意味着, ,所以, , ∈ 。这意味着, 不会超过3n, 当n≥3时, 2n + 3 不会超过 ,2n + 3 = O(n)。 时 。 例2: f(n) = 10n2 + 4n + 2 = O(n2) 对于n≥2时, 有10n2 + 4n + 2≤10n2 + 5n,并且当 对于 时 , 并且当n≥5时, 时 5n≤n2,因此,可选 = 11, n0 = 5;对于 因此,可选c ;对于n≥n0,f(n) = 10n2 + , 4n + 2≤11n2,所以 所以f(n) = O(n2)。 。 例3: f(n) = n!= O(nn) 对于n≥1,有n(n − 1)(n − 2) … 1≤nn,因此,可选c = 1,n0 = 对于 , 因此,可选 , 1。对于 所以, 。对于n≥n0,f(n) = n!≤nn,所以,f(n) = O(nn)。 , ! 。
– 优点:表达能力强、抽象性强、容易理解
欧几里德算法:1. r = m % n;
2. 循环直到r = 0; 2.1 m = n; 2.2 n = r; 2.3 r = m % n; 3. 输出n;
问题的求解(Problem Solving): 问题的求解(Problem Solving):
1)问题的陈述
算法分析与设计
Design and Analysis of Computer Algorithm
教材: 教材:算法设计与分析 王红梅 编著 清华大学出版社出版
课程简介
算法分析与设计是计算机的核心课程之一, 算法分析与设计是计算机的核心课程之一,在众多的计 算机系统软件和应用软件中都要用到本课程的内容。 算机系统软件和应用软件中都要用到本课程的内容。它是操 作系统、编译原理等课程的先行课程, 作系统、编译原理等课程的先行课程,在计算机的理论体系 中占有极其重要的位置。 中占有极其重要的位置。 通过本课程的学习, 通过本课程的学习,使学生掌握算法分析与设计的基本 理论,使学生学会算法分析与设计的基本方法,掌握 掌握计算机科 理论,使学生学会算法分析与设计的基本方法 掌握计算机科 学及应用领域常见的有代表性的非数值算法及算法设计的若 干重要方法,并学会用这些算法解决实际问题。 干重要方法,并学会用这些算法解决实际问题。 本课程以算法设计策略为知识单元, 本课程以算法设计策略为知识单元,介绍算法设计方法 和分析技巧,这些策略包括递归技术、分治、动态规划、贪 和分析技巧,这些策略包括递归技术、分治、动态规划、 心算法、回溯法、分支限界法等策略,它们的内容相对独立。 心算法、回溯法、分支限界法等策略,它们的内容相对独立。 其先修课为高等数学、程序设计、数据结构。 其先修课为高等数学、程序设计、数据结构。
算法渐近复杂性
设T(n)为算法A的时间复杂性函数,则它是n的单增函数,如果存在 为算法A的时间复杂性函数, 的单增函数, 一个函数 Ť(n) 使得当n→ ∞,有 T(n)- Ť(n)) / T(n)→0 时的渐进性态或 渐进复杂性 。 称Ť(n) 是T(n)当 n→ ∞ 时的 或 在数学上, 有相同的最高阶项. 为略去T( 在数学上,T(n)与 Ť(n)有相同的最高阶项.可取 Ť(n)为略去T(n)的 低阶项后剩余的主项. 代替T( 低阶项后剩余的主项.当n充分大时我们用Ť(n)代替T(n)作为算法复 杂性的度量,从而简化分析. 杂性的度量,从而简化分析. 例如 T(n)=3n2+4nlogn+7, 则 Ť(n)可以是3n2. 3n
其中I是问题的规模(input size)为n的实例,p(I)是实 例I出现的概率。
• 例:顺序搜索算法 在具有n个元素的数组a[1...n]中找出值等于 的元素的位置。 中找出值等于k的元素的位置 在具有 个元素的数组 的数组 中找出值等于 的元素的位置。
template<class Type> int seqSearch(Type *a, int n, Type k) { for(int i=0;i<n;i++) if (a[i]==k) return i; return -1; }
若存在正常数c和自然数 若存在正常数 和自然数n0 使得当 和自然数 n≥ n 0 时 , 有 0 ≤ f ( n ) ≤ cg ( n ) ≥ 充分大时有上 则称函数 f(n )在n充分大时有上 在 充分大时有 界, 且g(n)是它的一个上界, 记为 f(n) =O(g (n) ) , 也称 f(n) 的 阶 不 高 于 g ( n ) 的 阶 。
若进一步假定算法中所有不同元运算的单位执行时间相同,则可不 若进一步假定算法中所有不同元运算的单位执行时间相同, 考虑Ť(n)所包含的系数或常数因子。 ( 所包含的系数或常数因子。 渐进分析适用于n充分大的情况,当问题的规模很小时, 渐进分析适用于n充分大的情况,当问题的规模很小时,或比较的两 算法同阶时,则不能做这种简化. 算法同阶时,则不能做这种简化.
重要的问题类型
1. 查找问题 2. 排序问题 3. 图问题 4. 组合问题 5. 几何问题
1.3 算法分析
算法分析( Analysis): ):对算法所需要的 算法分析(Algorithm Analysis):对算法所需要的 两种计算机资源—— ——时间和空间进行估算 两种计算机资源——时间和空间进行估算 时间复杂性(Time Complexity) 时间复杂性( Complexity) 空间复杂性( Complexity) 空间复杂性(Space Complexity) 算法分析的目的: 算法分析的目的: 设计算法—— ——设计出复杂性尽可能低的算法 设计算法——设计出复杂性尽可能低的算法 选择算法—— ——在多种算法中选择其中复杂性最低者 选择算法——在多种算法中选择其中复杂性最低者