第1章 算法引论
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当和是无穷的,且|x|<1时,即得无穷递减几何级数
1 Msort (n) Msort (n / 2) Msort (n / 2) n
n2 n2
递归分解
1 x 1 x j 1
j
比较进行了多少次? 怎样分析算法的时间复杂度?
从递归算法推出递推关系式(也叫递归方程),上 例关系式如下:
例:f(n)= n2+3n+5 仅考虑n2
执 行 次 数
c×g(n) f(n)
• 常见感兴趣的阶 -多项式阶: logn, n, nlogn, n2, n3;
-指数阶: 2n, n!, nn
n0 之 前 的 情况无关 紧要 n0 大O符号的含义 问题规模n
这个定义说明f 没有g的某个常数 倍增长快,可以看 做一个上界
不满意
满意
根据算法编写代码
3
算法的基本概念
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
重要的问题类型
计算领域感兴趣的问题(问题重要) (1). 查找问题 (2). 排序问题 (3). 图问题 (4). 组合优化问题 (5). 几何问题
提 纲
算法的基本概念 算法分析 数学预备 数据结构
例:f(n)= n2+3n+5
用来表示算法的渐进运行时间的记号是用定义域为自然数N={0,1,2,…}的函 数来定义的。
大O符号(经常使用)
定义 令f(n)和g(n)是两个函数,如果存在一个自然数n0和一个正常数 c,对于任意n≥n0,都有f(n)≤c×g(n),则称f(n)=O(g(n))。
• 关心大规模的输入数据: - 在小输入数据上讨论算法一般没有意义 • 增长的阶: - 随着n越来越大,高阶系数和低阶部分逐渐不起作用
j 1 j 1 j 1
n
n
n(n 1) n n2 2
6
几何级数:
对于实数x≠1,和式
xj
j 1
n
x n 1 1 x 1
递推关系
引例:二路归并排序算法的时间复杂度分析,为简单 起见,假定n是2的整次幂
边界条件
例:
2
j 1 n
n
j
2 n 1 1
1 1 2 n 2 j 2 2 j 1
最好情况,最坏情况和平均情况
影响算法时间代价的最主要因素是问题规模,但是,在 某些算法中,如果输入数据不同,其时间代价也不同。
例:起泡算法 void bubble_sort(int a[ ], int n){ for (i=n-1,change=true; i>=1&&change;--i){ change=false; for(j=0; j<=i;++j) if(a[j]>a[j+1]) {a[j]↔a[j+1];change=true;} } } 最好:0次 最坏:n*(n-1)/2
⑴ 自然语言
例:求两个正整数 a 和 b 的最大公约数(辗转相除法): 1. a ÷ b,令r为所得余数(0≤r<b) 若 r = 0,算法结束;b 即为答案。 2. 互换:置 a←b,b←r, 并返回第一步。
抽象的级别
2
⑵ 流程图
优点是直观易懂,缺点是 灵活性不如自然语言,严密 性不如程序设计语言
4
大Ω符号(很少使用)
定义 令f(n)和g(n)是两个函数,如果存在一个自然数n0和一个正常数 c,对于任意n≥n0,都有f(n)≥c×g(n),则称f(n)= Ω(g(n))
Θ符号(很少使用)
定义 令f(n)和g(n)是两个函数,如果存在一个自然数n0和两个正常数 c1,c2,对于任意n≥n0,都有c1 g(n) ≤ f(n) ≤c2g(n),则称f(n)= Θ(g(n))
⑶ 程序设计语言
输入a, b
优点是可由计算机直接执行。
r←mod(a,b) a ←b b ←r F
缺点是抽象性差,描述算法的具体细节,很难观察算法的 整体逻辑。
r=0 T 输出a
⑷ 伪代码 伪代码(Pseudocode)是介于自然语言和程序设计语言 之间的描述语言,它采用某一程序设计语言的基本语法, 操作指令可以结合自然语言来设计。 伪代码不是一种实际的编程语言,但在表达能力上类 似于编程语言,同时极小化了程序语言中的技术细节,是 比较合适的描述算法的方法,被称为“算法语言”
第1章 算法引论
课程目标 算法理论研究的是算法的设计和分析技术,前者是 指面对一个问题,如何设计一个有效的算法;后者是 指对已有算法,如何评价或判断其优劣。
提 纲
算法的基本概念 算法分析 数学预备知识 数据结构 枚举法(蛮力法)
算法的基本概念
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
• 对数
logx=log2x lnx=logex
• 底函数x和 顶函数x • 阶乘和二项式系数 n n! n - 二项式系数:n选k, k C k k !( n k )! , n k 0 - 重要等式:
n n (1) k n k
最好情况: 很少关注最好情况 最坏情况: 非常重要,给出一个上界 平均情况:
n: 输入规模; m: 不同输入的组数 pi: 第i组输入的概率 ti : 算法计算第i组数据的时间
提 纲
算法的基本概念 算法分析 数学预备知识 数据结构 枚举法(蛮力法)
等概率情况
考虑算法要处理的不同输入
• 和式
当一个算法中包含像while或for循环控制结构时,其运行时间 可以表示成循环体每次执行时间的总和。 求和公式 有限序列 a1, a2, … , an求和,可以写成
例 令G=(V, E)是一个连通的无向图,有m个顶点,令p是G中访问n>m个 顶点的一条路径,那么p必定包含一条回路。
a
j 1
A(n) pi * ti
i 1
m
1 m A(n) ti m i 1
5
数学预备知识
集合 关系
- 令A和B是两个集合,A和B的笛卡儿积是所有有序对(a, b)的集 合,其中a∈A, b ∈ B,笛卡儿积记为AB,即 AB={(a, b)| a ∈ A且b ∈ B}, R AB 称R为从A到B的一个二元关系 - 偏序、等价关系 - 例如:R={(x, y)|x, y是整数,且xy(mod n)}, xy(mod n):x和y被n除的时候,余数相同。称为:x和y模n同余
求解递递归方程的技术
(1) 猜测技术 (2) 扩展递归技术 (3) 通用分治递推式
1 T ( n) 2T (n / 2) n
n2 n2
很多算法设计的方法都会导出递归的算法: 例如:分治法、动态规划法、回溯法,等等。 对于所有的递归算法,运行时间的界都是用递归形式 来表达的,这使得求解递归方程对于递归算法分析来说极 为重要!
算法分析
对算法有效性的度量:时间和空间,即当给出合法输 入时,为了得到输出,该算法所需要的时间和空间
200 180 160 140 120 100 80 60 40 20 0 2 6 10 14 18 22 26 30 34 38
x2/8 3*x2 x+10 2*log x
渐进符号
• 时间: - 当问题规模为n时,基本操作重复执行的次数
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
算法的描述方法
细节的程度和抽象
食谱
取365克粉 取一点粉状 …. 在粉状的糖 中搅拌 …. 的糖,倒进 融化的巧克 力中并搅 拌,在取一 点,搅拌…. 状的糖,把 它们倒进融 化的巧克力 中,拿一把 勺子,成环 形移动进行 搅拌…
为什么要学习算法
学科核心:用计算机求解任何问题都离不开程序设计,而程序 设计的核心是算法设计。 引例:烤蛋糕
配料:input 食谱:algorithm 蛋糕:output
魔法般 的指示 (软件) (硬件) 烤箱 器具 面包师 配料 有限能 力
对程序设计的研究可以分为四个层次:
工具 语言 方法学 算法
⑴ 输入:一个算法有零个或多个输入 ⑵ 输出:一个算法有一个或多个输出 ⑶ 有穷性:一个算法必须总是(对任何合法的输入)在执行有穷 步之后结束。 ⑷ 确定性:算法中给出的每一个计算步,必须是精确地定义的, 无二义性的。 ⑸ 可行性:算法中要执行的每一个计算步都是可以在有限时间内 做完的。
算法的基本概念
辗转相除法的伪代码描述 1. Read m, n; 2. 循环直到 n=0 2.1 r=m % n; 2.2 m=n; 2.3 n=r; 3. 输出 m;
算法的基本概念
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
算法设计的一般过程
理解问题 预测所有可能的输入 确定: 精确解还是近似解 确定数据结构 算法设计技术 设计并描述算法 跟踪算法 分析算法的效率
j 1 j 1
n
n
j
j 1 n
n
2
n(n 1)(2n 1) 6 n 2 (n 1) 2 4
等差级数:
n
j 1
n(n 1) j 1 2 n ( n 2 ) 2
j
j 1
3
例:求
n
(2 j 1)
j 1
(2 j 1) 2 j 1 2
n n k nk x y ( 2)( x y ) n k 0 k
n n (3)2 n k 0 k
鸽巢原理
如果把n个球分别放在m个盒子中,那么: (1) 存在一个盒子,必定至少装n/m个球; (2) 存在一个盒子,必定最多装n/m个球。
算法的基本概念
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
推动发展:算法研究始终是推动计算机技术发展的关键。 1. 检索技术:大规模数据 2. 压缩与解压缩:多媒体 3. 信息安全与数据加密:电子商务
算法及其重要特性
算法(Algorithm):通俗地讲,算法是解决问题的方 法,严格地说,算法是对特定问题求解步骤的一种描述, 是指令的有限序列。
n
j
证明:存在一个顶点,必定至少访问过n/m次
当n=0,该和式的值定义为0,有穷级数的值总是有定义的,并 且,它的项可以按任何顺序相加。
线性性质
对任意实数c和任意有限序列 a1, a2, … , an和b1, b2, … , bn ,有:
平方和与立方和:
(ca
j 1
n
j
n
ຫໍສະໝຸດ Baidu
b j ) c a j b j
Tubor C, VC++, .Net, …. Cobol, Fortran, Pascal, C, …. 面向过程,面向对象,面向架构
食谱
快速排序,折半查找,迪杰斯特拉
实例:更换漏气的轮胎 制造自制橱柜 查电话号码等
蛋糕
1
提升能力:学习算法还能够提高人们分析问题的能力。
算法可以看作是解决问题的一类特殊方法——它不是问题的答 案,而是经过精确定义的、用来获得答案的求解过程。 Knuth: “将知识表述为一种算法……比起简单地按照常规去理解事物,用 算法将其形式化会使我们获得更加深刻的理解。”
为了计算方便,假定n=2k
(1) 猜测技术 例:
1 T ( n) 2T ( n / 2) n n2 n2
执 行 次 数
f(n) c×g(n)
执 行 次 数
c1×gn) f(n) c2×g(n)
可以看做一个下界
n0 之 前 的 情况无关 紧要 n0 大Ω符号的含义 问题规模n n0 之 前 的 情况无关 紧要 n0 Θ符号的含义 问题规模n
算法在运行时间上 有确切界限
推论 f(n)=Θ(g(n)),当且仅当f(n)= O(g(n))并且f(n)= Ω(g(n)) 证明:从定义可知 例 T(n)=3n-1 当n≥1时,3n-1≤3n=O(n) 当n≥1时,3n-1≥3n-n=2n=Ω(n) 当n≥1时,3n≥3n-1≥2n,则3n-1=Θ(n) 例 T(n)=5n2+8n+1 当n≥1时,5n2+8n+1≤5n2+8n+n=5n2+9n≤5n2+9n2≤14n2=O(n2) 当n≥1时,5n2+8n+1≥5n2=Ω(n2) 当n≥1时,14n2≥5n2+8n+1≥5n2,则5n2+8n+1=Θ(n2)
1 Msort (n) Msort (n / 2) Msort (n / 2) n
n2 n2
递归分解
1 x 1 x j 1
j
比较进行了多少次? 怎样分析算法的时间复杂度?
从递归算法推出递推关系式(也叫递归方程),上 例关系式如下:
例:f(n)= n2+3n+5 仅考虑n2
执 行 次 数
c×g(n) f(n)
• 常见感兴趣的阶 -多项式阶: logn, n, nlogn, n2, n3;
-指数阶: 2n, n!, nn
n0 之 前 的 情况无关 紧要 n0 大O符号的含义 问题规模n
这个定义说明f 没有g的某个常数 倍增长快,可以看 做一个上界
不满意
满意
根据算法编写代码
3
算法的基本概念
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
重要的问题类型
计算领域感兴趣的问题(问题重要) (1). 查找问题 (2). 排序问题 (3). 图问题 (4). 组合优化问题 (5). 几何问题
提 纲
算法的基本概念 算法分析 数学预备 数据结构
例:f(n)= n2+3n+5
用来表示算法的渐进运行时间的记号是用定义域为自然数N={0,1,2,…}的函 数来定义的。
大O符号(经常使用)
定义 令f(n)和g(n)是两个函数,如果存在一个自然数n0和一个正常数 c,对于任意n≥n0,都有f(n)≤c×g(n),则称f(n)=O(g(n))。
• 关心大规模的输入数据: - 在小输入数据上讨论算法一般没有意义 • 增长的阶: - 随着n越来越大,高阶系数和低阶部分逐渐不起作用
j 1 j 1 j 1
n
n
n(n 1) n n2 2
6
几何级数:
对于实数x≠1,和式
xj
j 1
n
x n 1 1 x 1
递推关系
引例:二路归并排序算法的时间复杂度分析,为简单 起见,假定n是2的整次幂
边界条件
例:
2
j 1 n
n
j
2 n 1 1
1 1 2 n 2 j 2 2 j 1
最好情况,最坏情况和平均情况
影响算法时间代价的最主要因素是问题规模,但是,在 某些算法中,如果输入数据不同,其时间代价也不同。
例:起泡算法 void bubble_sort(int a[ ], int n){ for (i=n-1,change=true; i>=1&&change;--i){ change=false; for(j=0; j<=i;++j) if(a[j]>a[j+1]) {a[j]↔a[j+1];change=true;} } } 最好:0次 最坏:n*(n-1)/2
⑴ 自然语言
例:求两个正整数 a 和 b 的最大公约数(辗转相除法): 1. a ÷ b,令r为所得余数(0≤r<b) 若 r = 0,算法结束;b 即为答案。 2. 互换:置 a←b,b←r, 并返回第一步。
抽象的级别
2
⑵ 流程图
优点是直观易懂,缺点是 灵活性不如自然语言,严密 性不如程序设计语言
4
大Ω符号(很少使用)
定义 令f(n)和g(n)是两个函数,如果存在一个自然数n0和一个正常数 c,对于任意n≥n0,都有f(n)≥c×g(n),则称f(n)= Ω(g(n))
Θ符号(很少使用)
定义 令f(n)和g(n)是两个函数,如果存在一个自然数n0和两个正常数 c1,c2,对于任意n≥n0,都有c1 g(n) ≤ f(n) ≤c2g(n),则称f(n)= Θ(g(n))
⑶ 程序设计语言
输入a, b
优点是可由计算机直接执行。
r←mod(a,b) a ←b b ←r F
缺点是抽象性差,描述算法的具体细节,很难观察算法的 整体逻辑。
r=0 T 输出a
⑷ 伪代码 伪代码(Pseudocode)是介于自然语言和程序设计语言 之间的描述语言,它采用某一程序设计语言的基本语法, 操作指令可以结合自然语言来设计。 伪代码不是一种实际的编程语言,但在表达能力上类 似于编程语言,同时极小化了程序语言中的技术细节,是 比较合适的描述算法的方法,被称为“算法语言”
第1章 算法引论
课程目标 算法理论研究的是算法的设计和分析技术,前者是 指面对一个问题,如何设计一个有效的算法;后者是 指对已有算法,如何评价或判断其优劣。
提 纲
算法的基本概念 算法分析 数学预备知识 数据结构 枚举法(蛮力法)
算法的基本概念
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
• 对数
logx=log2x lnx=logex
• 底函数x和 顶函数x • 阶乘和二项式系数 n n! n - 二项式系数:n选k, k C k k !( n k )! , n k 0 - 重要等式:
n n (1) k n k
最好情况: 很少关注最好情况 最坏情况: 非常重要,给出一个上界 平均情况:
n: 输入规模; m: 不同输入的组数 pi: 第i组输入的概率 ti : 算法计算第i组数据的时间
提 纲
算法的基本概念 算法分析 数学预备知识 数据结构 枚举法(蛮力法)
等概率情况
考虑算法要处理的不同输入
• 和式
当一个算法中包含像while或for循环控制结构时,其运行时间 可以表示成循环体每次执行时间的总和。 求和公式 有限序列 a1, a2, … , an求和,可以写成
例 令G=(V, E)是一个连通的无向图,有m个顶点,令p是G中访问n>m个 顶点的一条路径,那么p必定包含一条回路。
a
j 1
A(n) pi * ti
i 1
m
1 m A(n) ti m i 1
5
数学预备知识
集合 关系
- 令A和B是两个集合,A和B的笛卡儿积是所有有序对(a, b)的集 合,其中a∈A, b ∈ B,笛卡儿积记为AB,即 AB={(a, b)| a ∈ A且b ∈ B}, R AB 称R为从A到B的一个二元关系 - 偏序、等价关系 - 例如:R={(x, y)|x, y是整数,且xy(mod n)}, xy(mod n):x和y被n除的时候,余数相同。称为:x和y模n同余
求解递递归方程的技术
(1) 猜测技术 (2) 扩展递归技术 (3) 通用分治递推式
1 T ( n) 2T (n / 2) n
n2 n2
很多算法设计的方法都会导出递归的算法: 例如:分治法、动态规划法、回溯法,等等。 对于所有的递归算法,运行时间的界都是用递归形式 来表达的,这使得求解递归方程对于递归算法分析来说极 为重要!
算法分析
对算法有效性的度量:时间和空间,即当给出合法输 入时,为了得到输出,该算法所需要的时间和空间
200 180 160 140 120 100 80 60 40 20 0 2 6 10 14 18 22 26 30 34 38
x2/8 3*x2 x+10 2*log x
渐进符号
• 时间: - 当问题规模为n时,基本操作重复执行的次数
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
算法的描述方法
细节的程度和抽象
食谱
取365克粉 取一点粉状 …. 在粉状的糖 中搅拌 …. 的糖,倒进 融化的巧克 力中并搅 拌,在取一 点,搅拌…. 状的糖,把 它们倒进融 化的巧克力 中,拿一把 勺子,成环 形移动进行 搅拌…
为什么要学习算法
学科核心:用计算机求解任何问题都离不开程序设计,而程序 设计的核心是算法设计。 引例:烤蛋糕
配料:input 食谱:algorithm 蛋糕:output
魔法般 的指示 (软件) (硬件) 烤箱 器具 面包师 配料 有限能 力
对程序设计的研究可以分为四个层次:
工具 语言 方法学 算法
⑴ 输入:一个算法有零个或多个输入 ⑵ 输出:一个算法有一个或多个输出 ⑶ 有穷性:一个算法必须总是(对任何合法的输入)在执行有穷 步之后结束。 ⑷ 确定性:算法中给出的每一个计算步,必须是精确地定义的, 无二义性的。 ⑸ 可行性:算法中要执行的每一个计算步都是可以在有限时间内 做完的。
算法的基本概念
辗转相除法的伪代码描述 1. Read m, n; 2. 循环直到 n=0 2.1 r=m % n; 2.2 m=n; 2.3 n=r; 3. 输出 m;
算法的基本概念
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
算法设计的一般过程
理解问题 预测所有可能的输入 确定: 精确解还是近似解 确定数据结构 算法设计技术 设计并描述算法 跟踪算法 分析算法的效率
j 1 j 1
n
n
j
j 1 n
n
2
n(n 1)(2n 1) 6 n 2 (n 1) 2 4
等差级数:
n
j 1
n(n 1) j 1 2 n ( n 2 ) 2
j
j 1
3
例:求
n
(2 j 1)
j 1
(2 j 1) 2 j 1 2
n n k nk x y ( 2)( x y ) n k 0 k
n n (3)2 n k 0 k
鸽巢原理
如果把n个球分别放在m个盒子中,那么: (1) 存在一个盒子,必定至少装n/m个球; (2) 存在一个盒子,必定最多装n/m个球。
算法的基本概念
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
推动发展:算法研究始终是推动计算机技术发展的关键。 1. 检索技术:大规模数据 2. 压缩与解压缩:多媒体 3. 信息安全与数据加密:电子商务
算法及其重要特性
算法(Algorithm):通俗地讲,算法是解决问题的方 法,严格地说,算法是对特定问题求解步骤的一种描述, 是指令的有限序列。
n
j
证明:存在一个顶点,必定至少访问过n/m次
当n=0,该和式的值定义为0,有穷级数的值总是有定义的,并 且,它的项可以按任何顺序相加。
线性性质
对任意实数c和任意有限序列 a1, a2, … , an和b1, b2, … , bn ,有:
平方和与立方和:
(ca
j 1
n
j
n
ຫໍສະໝຸດ Baidu
b j ) c a j b j
Tubor C, VC++, .Net, …. Cobol, Fortran, Pascal, C, …. 面向过程,面向对象,面向架构
食谱
快速排序,折半查找,迪杰斯特拉
实例:更换漏气的轮胎 制造自制橱柜 查电话号码等
蛋糕
1
提升能力:学习算法还能够提高人们分析问题的能力。
算法可以看作是解决问题的一类特殊方法——它不是问题的答 案,而是经过精确定义的、用来获得答案的求解过程。 Knuth: “将知识表述为一种算法……比起简单地按照常规去理解事物,用 算法将其形式化会使我们获得更加深刻的理解。”
为了计算方便,假定n=2k
(1) 猜测技术 例:
1 T ( n) 2T ( n / 2) n n2 n2
执 行 次 数
f(n) c×g(n)
执 行 次 数
c1×gn) f(n) c2×g(n)
可以看做一个下界
n0 之 前 的 情况无关 紧要 n0 大Ω符号的含义 问题规模n n0 之 前 的 情况无关 紧要 n0 Θ符号的含义 问题规模n
算法在运行时间上 有确切界限
推论 f(n)=Θ(g(n)),当且仅当f(n)= O(g(n))并且f(n)= Ω(g(n)) 证明:从定义可知 例 T(n)=3n-1 当n≥1时,3n-1≤3n=O(n) 当n≥1时,3n-1≥3n-n=2n=Ω(n) 当n≥1时,3n≥3n-1≥2n,则3n-1=Θ(n) 例 T(n)=5n2+8n+1 当n≥1时,5n2+8n+1≤5n2+8n+n=5n2+9n≤5n2+9n2≤14n2=O(n2) 当n≥1时,5n2+8n+1≥5n2=Ω(n2) 当n≥1时,14n2≥5n2+8n+1≥5n2,则5n2+8n+1=Θ(n2)