算法设计与分析课件

合集下载

《算法设计与分析》课件

《算法设计与分析》课件

常见的贪心算法包括最小生成树算法 、Prim算法、Dijkstra算法和拓扑排 序等。
贪心算法的时间复杂度和空间复杂度 通常都比较优秀,但在某些情况下可 能需要额外的空间来保存状态。
动态规划
常见的动态规划算法包括斐波那契数列、背包 问题、最长公共子序列和矩阵链乘法等。
动态规划的时间复杂度和空间复杂度通常较高,但通 过优化状态转移方程和状态空间可以显著提高效率。
动态规划算法的时间和空间复杂度分析
动态规划算法的时间复杂度通常为O(n^2),空间复杂度为O(n)。
04 经典问题与算法实现
排序问题
冒泡排序
通过重复地遍历待排序序列,比较相邻元素的大小,交换 位置,使得较大的元素逐渐往后移动,最终达到排序的目 的。
快速排序
采用分治策略,选取一个基准元素,将比基准元素小的元 素移到其左边,比基准元素大的元素移到其右边,然后对 左右两边的子序列递归进行此操作。
动态规划是一种通过将原问题分解为若干个子 问题,并从子问题的最优解推导出原问题的最 优解的算法设计方法。
动态规划的关键在于状态转移方程的建立和状态 空间的优化,以减少不必要的重复计算。
回溯算法
01
回溯算法是一种通过穷举所有可能情况来求解问题的算法设计方法。
02
常见的回溯算法包括排列组合、八皇后问题和图的着色问题等。
空间换时间 分治策略 贪心算法 动态规划
通过增加存储空间来减少计算时间,例如使用哈希表解决查找 问题。
将问题分解为若干个子问题,递归地解决子问题,最终合并子 问题的解以得到原问题的解。
在每一步选择中都采取当前状态下最好或最优(即最有利)的 选择,从而希望导致结果是最好或最优的。
通过将问题分解为相互重叠的子问题,并保存子问题的解,避 免重复计算,提高算法效率。

算法设计与分析第04章 贪心算法PPT课件

算法设计与分析第04章 贪心算法PPT课件
9
4.1 活动安排问题
若被检查的活动i的开始时间Si小于最近选择的活动j 的结束时间fi,则不选择活动i,否则选择活动i加入集 合A中。
贪心算法并不总能求得问题的整体最优解。但对 于活动安排问题,贪心算法greedySelector却总能求 得的整体最优解,即它最终所确定的相容活动集合A的 规模最大。这个结论可以用数学归纳法证明。
•}
6
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列,所 以算法greedySelector每次总是选择具有最早完成 时间的相容活动加入集合A中。直观上,按这种方法 选择相容活动为未安排活动留下尽可能多的时间。也 就是说,该算法的贪心选择的意义是使剩余的可安排 时间段极大化,以便安排尽可能多的相容活动。
算法greedySelector的效率极高。当输入的活 动已按结束时间的非减序排列,算法只需O(n)的时间 安排n个活动,使最多的活动能相容地使用公共资源。 如果所给出的活动未按非减序排列,可以用O(nlogn) 的时间重排。
7
4.1 活动安排问题
例:设待安排的11个活动的开始时间和结束时间按结 束时间的非减序排列如下:
13
4.2 贪心算法的基本要素
3.贪心算法与动态规划算法的差异
贪心算法和动态规划算法都要求问题具有最优子结构 性质,这是2类算法的一个共同点。但是,对于具有最 优子结构的问题应该选用贪心算法还是动态规划算法 求解?是否能用动态规划算法求解的问题也能用贪心算 法求解?下面研究2个经典的组合优化问题,并以此说 明贪心算法与动态规划算法的主要差别。
11
4.2 贪心算法的基本要素
1.贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通 过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动 态规划算法的主要区别。

算法设计与分析 课件 一

算法设计与分析 课件 一

Assessment
Marks from these components and from your final examination will be combined to produce a single mark as follows: –30% (3 x 10%) for home works –30% (3 x 10%) for assignments –40% for the final examination (written, close book, close note) Attendance – 0 to -10
Getting to 1st base
If your program fails to compile you will receive zero credit. Please also ensure that it runs as per the specification given. If you are not sure as to the exact requirements, please ask.
Assignments: general advice
For all assignments, use at least the given test data. Your program will be tested with this and some other data and it must behave at least as well as my version, which is by no means perfect. Examine the sample output for each program. From this it should be clear that you need to check for various error conditions.

清华大学第二版算法分析与设计课件第二章pdf

清华大学第二版算法分析与设计课件第二章pdf

Average case: A(n) – “average” over inputs of size n
• Number of times the basic operation will be executed on typical input • NOT the average of worst and best case • Expected number of basic operations repetitions considered as a random variable under some assumption about the probability distribution of all possible inputs of size n
Design and Analysis of Algorithms - Chapter 2 5
Example: Sequential search
Problem: Given a list of n elements and a search key K, find an element equal to K, if any. Algorithm: Scan the list and compare its successive elements with K until either a matching element is found (successful search) of the list is exhausted (unsuccessful search) Worst case Best case Average case
See table 2.1
Design and Analysis of Algorithms - Chapter 2

算法设计与分析课件--NP完全性理论-P类和NP类问题

算法设计与分析课件--NP完全性理论-P类和NP类问题
➢ 若用邻接矩阵C表示图G,使用二进制串表示C和k,则
团问题的一个实例可以用长度为n2 + log k + 1 的二
进位串表示。
➢ 无向图的团问题可表示为语言:
• CLIQUE = {w#v|w,v∈{0,1}*,以w为邻接矩阵的图G有一个k 顶点的团。其中,w是C的二进制表示,v是k的二进制表示。}
• STEP3:确定性地检查V’的团性质。若V’是一个团则接受输入,
否则拒绝输入。时间复杂度为O(n 4 ) 。 • 因此,整个算法的时间复杂性为:O(n 4 ) 。
❖非确定性算法在多项式时间内接受语言CLIQUE,故CLIQUE∈NP。
16
8.2 P类问题和NP类问题
◼ P类问题和NP类问题的关系:
算法设计与分析
1
第八章 NP完全性理论
目录
8.1 易解问题和难解问题
8.2 P类问题和NP类问题
8.3
NP完全问题
8.4 NP完全问题的近似算法
2
8.1 易解问题和难解问题
◼ 常见的几类算法复杂性:
➢ O(1):常数阶; ➢ O(log2n), O(nlog2n):对数阶; ➢ O(n), O(n2), O(n3), …, O(nk): 多项式阶。多项式时间算法; ➢ O(2n), O(n!), O(nn):指数阶。指数时间算法。
12
8.2 P类问题和NP类问题
◼ NP(Non-deterministic Polynomial)类问题:
➢ 如对于某个判定问题,存在一个非负整数k,对于输入规模为n的实 例,能以O(nk)的时间运行一个非确定性算法得到是或否的答案。 • 能用非确定算法在多项式时间内求解的判定问题。如哈密尔顿回 路问题。 • NP类问题是难解问题的一个子类。 • NP类问题并不要求给出一个算法来求解问题本身,而只要求给 出一个确定性算法在多项式时间验证它。

算法设计技巧与分析课件

算法设计技巧与分析课件
2013-7-14 华南师范大学 计算机学院 2
Chapter 1 Basic Concepts in Algorithmic Analysis 内容
• • • • • • • • • 1.8 Time Complexity 1.8.1 Order of growth 1.8.2 The O-notation 1.8.3 The fl-notation l.8.4 The e-notation 1.8.5 MamPles 1.8.6 Complekity classes and the o-notation 1.9 Space Complexity 1.10 Optimal Algorithms
2013-7-14
华南师范大学 计算机学院
23
算法1.4 选择selectionsort, 算法1.5 插入排序insertionsort
• 算法1.4 比较次数,(n-1)+…+1的连续和 • 复制次数:0 到3(n-1) • 算法1.5 :比较次数n-1到n(n-1)/2之间。元 素赋值次数为 比较次数加上n-1.
一个算法应该是可以信赖的,而且学习一个算法直到彻 底掌握的最好方法是反复进行试验。 因此,遇到一个算法时,应该找出这个算法的一个例子, 给出该例子的要点进行试验。
2013m)
• 程序是算法用某种程序设计语言的具体实现。
• 程序可以不满足算法的有限性的性质。例如操作系统,是一个
2013-7-14 华南师范大学 计算机学院 5
算法 几点说明
1. “算法”的 几个词:Algorithm、Logarithm、Algorism 2. “算法”的现代诠释 算法的现代意义十分类似于处方、过程、方法、规程、程 序,一个算法就是有穷规则的集合。其中,规则规定了一个 解决某一特定类型的问题的运算序列。 3. 学习“算法”的方法

计算机算法设计与分析第5章 回溯算法PPT课件

计算机算法设计与分析第5章 回溯算法PPT课件
注意:同一个问题可以有多种表示,有些 表示方法更简单,所需表示的状态空间更 小(存储量少,搜索方法简单)。
22.09.2020
15
5.1.1 问题的解空间
为了用回溯法求解一个具有n个输入的问题,一 般情况下,将其可能解表示为满足某个约束条 件的等长向量X=(x1, x2, …, xn),其中分量xi (1≤i≤n) 的取值范围是某个有限集合Si={ai1, ai2, …, airi}, 所有可能的解向量构成了问题的解空间。
22.09.2020
2
提纲
一、回溯法的算法框架 二、装载问题 三、n后问题 四、0-1背包问题 五、最大团问题 六、图的m着色问题 七、旅行售货员问题
22.09.2020
3
提纲
一、回溯法的算法框架 二、装载问题 三、n后问题 四、0-1背包问题 五、最大团问题 六、图的m着色问题 七、旅行售货员问题
17
2 旅行售货员问题
问题描述:某售货员 要到若干城市去推销 商品,一直各城市之 间的路程,他要选定 一条从驻地出发,经 过每个城市一遍,最 后回到住地的路线, 使总的路程最短。
(a) 二维搜索空间无解
(b) 三维搜索空间的解
错误的解空间将不能搜索到正确答案!
22.09.2020
13
5.1.1 问题的解空间
对于任何一个问题,可能解的表示方式和它相应的 解释隐含了解空间及其大小。
例如,对于有n个物品的0/1背包问题,其可能解的 表示方式可以有以下两种:
(1)可能解由一个不等长向量组成,当物品i(1≤i≤n)装入 背包时,解向量中包含分量i,否则,解向量中不包含分 量i,当n=3时,其解空间是:
计算机算法设计与分析
Design and Analysis of Computer Algorithms

算法设计与分析:第02章 递归与分治策略

算法设计与分析:第02章 递归与分治策略

2.1
递归的概念
例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前 缀得到的排列。R的全排列可归纳定义如下: 当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。
分治法的基本步骤
divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 } 人们从大量实践中发现,在用分治法设计算法时,最好使 子问题的规模大致相同。即将一个问题分成大小相等的k个子问 题的处理方法是行之有效的。这种使子问题规模大致相等的做 法是出自一种平衡(balancing)子问题的思想,它几乎总是比子 问题规模不等的做法要好。
1 5 n1 1 5 n1 1 F (n) 2 5 2
但本例中的Ackerman函数却无法找到非递归的定义。
2.1
例3 Ackerman函数
递归的概念
• A(n,m)的自变量m的每一个值都定义了一个单变量函数: • M=0时,A(n,0)=n+2 • M=1时,A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2,和A(1,1)=2故 A(n,1)=2*n • M=2时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2),和 A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2^n 。

北京大学屈婉玲算法设计与分析课件

北京大学屈婉玲算法设计与分析课件

11
1
1
1
1 2
5
1
1
1
21
3
23 11
21 11
1
1
1
1
最邻近法的性能
定理8.3 对于货郎问题所有满足三角不等式的 n 个城市的 实例 I, 总有
NN(I )

1 2
(⎡log2
n⎤
+
1) OPT(I ).
而且, 对于每一个充分大的 n, 存在满足三角不等式的 n 个
城市的实例 I 使得
NN(I )
8.4 背包问题
0-1背包问题的优化形式:
任给 n 件物品和一个背包, 物品 i 的重量为 wi , 价值为 vi , 1≤ i ≤ n, 背包的重量限制为 B, 其中 wi , vi 以及 B 都是正 整数.
把哪些物品装入背包才能在不超过重量限制的条件下使 得价值最大? 即, 求子集 S*⊆{1,2,…,n} 使得
G-MPS(I) = 2m−1.
最优分配方案是把前 m(m−1) 项作业平均地分配给 m−1 台机 器, 每台 m 项, 最后一项分配给留下的机器,
OPT(I) = m.
G-MPS是2-近似算法
m=5的紧实例
1
6
11 16
21
2
7
12 17
3
8
13 18
4
9
14 19
5
10 15 20
G-MPS算法的解
(3) 研究问题本身的可近似性, 即在P≠NP(或其他更强)的假 设下, 该问题近似算法的近似比的下界.
8.2 多机调度问题
多机调度问题:
任给有穷的作业集 A 和 m 台相同的机器, 作业 a 的处理时

计算机算法设计与分析总复习公开课获奖课件百校联赛一等奖课件

计算机算法设计与分析总复习公开课获奖课件百校联赛一等奖课件
边界条件
1
n0
F
(n)
1
n 1
F (n 1) F (n 2) n 1
递归方程
第n个Fibonacci数可递归地计算如下: int fibonacci(int n)
{ if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2);
}
分治算法总体思想
环被执行了O(logn) 次。
if (x < a[m]) r = m-1;
循环体内运算需要O(1)
else l = m+1; } return -1; }
时间,所以整个算法在最 坏情况下旳计算时间复杂 性为O(logn) 。
合并排序
基本思想:将待排序元素提成大小大致相同旳2个子集合,分 别对2个子集合进行排序,最终将排好序旳子集合合并成为所 要p求{ub旳lic排s复t好a杂t序ic度旳vo分集id析合Tm(。en)rgeS2Tor(nt(/CO2o()1m) Opa(nra) bnnlea11[], int left, int right)
多项式时间算法:可用多项式(函数)对其计 算时间限界旳算法。
常见旳多项式限界函数有:
Ο(1) < Ο(logn) < Ο(n) < Ο(nlogn) < Ο(n2) < Ο(n3)
指数时间算法:计算时间用指数函数限界旳算 法。
常见旳指数时间限界函数:
Ο(2n) < Ο(n!) < Ο(nn)
阐明:当n取值较大时,指数时间算法和多项式
线性时间选择问题
问题描述:给定线性集中n个元素和一种整数
k,要求找出这n个元素中第k小旳元素,即假如 将这n个元素依其线性序排列时,排在第k个位 置旳元素即为我们要找旳元素。 当k=1时,即找最小元素;当k=n时,即找最大 元素;当k=(n+1)/2时,称为找中位数。

算法设计与分析课件--NP完全性理论-NP完全问题及近似算法

算法设计与分析课件--NP完全性理论-NP完全问题及近似算法
算法设计与分析
1
第八章 NP完全性理论
目录
8.1 异解问题和难解问题
8.2 P类问题和NP类问题
8.3
NP完全问题
8.4 NP完全问题的近似算法
2
8.3 NP完全问题
问题变换:
➢ NP类问题在最坏情况下的时间复杂性一般都是快速增长的指数函 数。希望能够在NP类问题内部找到一种方法,比较两个问题的计 算复杂性。
❖该近似算法的相对误差定义为=
cc* c*
。若对问题的输
入规模n,有一函数ε(n)使得 c c* ≤ε(n),则称ε(n)
c*
为该近似算法的相对误差界。
13
8.4 NP完全问题的近似算法
NPC问题的近似算法示例 - TSP:
➢ 给定一个完全无向图G=(V,E),其每一条边(u,v)∈E有一非 负整数费用c(u,v)。要找出G的最小费用哈密顿回路。如果 TSP满足三角不等式性质,即对于任意3个顶点u,v,w∈V有 :c(u,w)≤c(u,v)+c(v,w),则称该TSP为欧几里得TSP,否 则称为一般TSP。
12
8.4 NP完全问题的近似算法
NPC问题的近似算法的性能:
❖若一个最优化问题的最优值为c*,求解该问题的一个近 似算法求得近似最优解相应的目标函数值为c,则将该近 似近≤似算ρ比法(是n的)问。近题ρ似输(比n入)定为规义1模时为n,的求=一m得a个x的c函c*近, c数c*似 ρ。解(在为n)通最,常优即情解m况a。x 下cc* ,,cc*该
➢ 传递性:设P1、P2和P3是3个判定问题。若P1∝τ(n)P2,且P2∝τ(n)P3 ,则P1∝τ(n)P3。
4
8.3 NP完全问题
多项式时间变换示例:

《算法设计与分析基础》课件-3.蛮力法

《算法设计与分析基础》课件-3.蛮力法

if A[j] < A[min] min j
swap A[i] and A[min]
7
2017/12/31
例题:对序列 {89,45,68,90,29,34,17}用选择排序 算法进行排序
• 第1遍: {89,45,68,90,29,34,17} //求最小元素 {17,45,68,90,29,34,89} //交换
• 第5遍: {17,29,34,45,90,68,89} {17,29,34,45,68,90,89}
• 第6遍: {17,29,34,45,68,90,89} {17,29,34,45,68,89,90} //排序结束
8
CHD
(本动画中,参与排序的是R[1]到R[n],R[0]作为交换中转的空 间;变量j对应前面算法中的变量min)
2017/12/31
ALGORITHM BubbleSort(A[0,…,n – 1]) // 冒泡排序算法在数组上的应用 // 输入:数组A,数组中的元素属于某偏序集 // 输出:按升序排列的数组A for i 0 to n – 2 do
for j 0 to n – 2 – i do if A[j+1] < A[j] swap(A[j], A[j+1])
CHD
(4)对解决一些小规模的问题实例仍然有效
(5)可作为衡量其他算法的参照。
2
2017/12/31
Brute Force Examples:
1. Computing an (a > 0, n a nonnegative integer)
2. Computing n!
3. Multiplying two matrices

算法分析与设计课件NP完全问题

算法分析与设计课件NP完全问题

17
近似算法的性能
若一个最优化问题的最优值为c*,求解该问题的一个 近似算法求得的近似最优解相应的目标函数值为c,则将 c * c max , 该近似算法的性能比定义为= c 。在通常情况 c* 下,该性能比是问题输入规模n的一个函数ρ(n),即 c * c max , ≤ρ(n)。 c c* 该近似算法的相对误差定义为= c * 。若对问题 cc* 的输入规模n,有一函数ε(n)使得 c * ≤ε(n),则称 ε(n)为该近似算法的相对误差界。近似算法的性能比 ρ(n)与相对误差界ε(n)之间显然有如下关系: ε(n)≤ρ(n)-1。
4
这种问题的答案,是无法直接计算得到的,只能通过间 接的“猜算”来得到结果。这也就是非确定性问题。而这些 问题的通常有个算法,它不能直接告诉你答案是什么,但可 以告诉你,某个可能的结果是正确的答案还是错误的。这个 可以告诉你“猜算”的答案正确与否的算法,假如可以在多 项式时间内算出来,就叫做多项式非确定性问题。而如果这 个问题的所有可能答案,都是可以在多项式时间内进行正确 与否的验算的话,就叫完全多项式非确定问题。
2
10
接受该语言CLIQUE的非确定性算法:用非确定性选择指令选 出包含k个顶点的候选顶点子集V,然后确定性地检查该子集是否 是团问题的一个解。算法分为3个阶段: 算法的第一阶段将输入串w#v分解,并计算出n= | w | ,以及 用v表示的整数k。若输入不具有形式w#v或|w|不是一个平方数就 2 拒绝该输入。显而易见,第一阶段可 O ( n ) 在时间内完成。 算法的第三阶段是确定性地检查V’的团性质。若V’是一个团 则接受输入,否则拒绝输入。这显然可以在 O ( n 4 ) 时间内完成。 4 因此,整个算法的时间复杂性为O ( n ) 。

算法的概念课件PPT

算法的概念课件PPT

动态规划
背包问题
给定一组物品和一个背包容量,如何选择物品放入背包以使得背 包内物品的总价值最大。
最长公共子序列(LCS)
给定两个序列,找出它们的最长公共子序列。
最优二叉搜索树
给定一组按概率排序的键和对应的搜索成本,构建一棵二叉搜索树 使得总的搜索成本最低。
04 算法性能分析
时间复杂度
时间复杂度的定义
空间复杂度
1 2
空间复杂度的定义
描述算法执行所需内存空间与问题规模之间的关 系,也用大O表示法表示。
常见空间复杂度类型
包括常数空间复杂度O(1)、线性空间复杂度O(n) 等。
3
空间复杂度的优化
通过减少不必要的内存占用、使用数据结构等方 式来降低空间复杂度。
稳定性与正确性评估
01
算法稳定性评估
稳定性指算法在输入数据发生微小变化时,输出结果不会发生较大变化
问题分类
根据问题的性质和求解方 法,将问题分为不同类型, 如排序问题、图论问题等。
问题建模方法
运用数学、逻辑等工具, 对问题进行形式化描述, 建立问题的数学模型。
数据结构选择
基本数据结构
掌握数组、链表、栈、队 列等基本数据结构的特点 和使用方法。
高级数据结构
了解并学会使用树、图、 堆等高级数据结构,以便 更有效地解决问题。
算法在各个领域的应用
随着算法技术的不断成熟和普及,其将在各个领域得到更广泛的应用,如医疗、金融、交 通等,为社会发展带来更多的便利和进步。
THANKS FOR WATCHING
感谢您的观看
描述算法执行时间与问题规模之间的关系,通常用大O表 示法表示。
常见时间复杂度类型
包括常数时间复杂度O(1)、线性时间复杂度O(n)、对数时 间复杂度O(logn)、线性对数时间复杂度O(nlogn)、平方 时间复杂度O(n^2)、立方时间复杂度O(n^3)等。

北京大学屈婉玲算法设计与分析 课件

北京大学屈婉玲算法设计与分析 课件

第6章算法分析与问题的计算复杂度6.1 平凡下界6.2 直接计数求解该问题所需要的最少运算6.26.3 决策树6.4 检索算法的时间复杂度分析6.5 排序算法的时间复杂度分析656.6 选择算法的时间复杂度分析算法正确性•正确性在给定有效输入后, 算法经过有限时间的计算并产生正确的答案, 就称算法是正确的.•正确性证明的内容:–方法的正确性证明——算法思路的正确性. 证明一系列与算法的工作对象有关的引理、定理以系列与算法的工作对象有关的引理定理以及公式.–程序的正确性证明——证明所给出的一系列指证明所给出的系列指令确实做了所要求的工作.2工作量‐‐时间复杂性分析计量工作量的标准: 对于给定问题,该算法所执行的基本运算的次数.的基本运算的次数基本运算的选择:根据问题选择适当的基本运算问题基本运算在表中查找x比较实矩阵相乘实数乘法排序比较较遍历二叉树置指针两种时间复杂性:最坏情况下的复杂性W(n)平均情况下的复杂性A(n)3占用空间‐‐空间复杂性分析•两种占用–存储程序和输入数据的空间–存储中间结果或操作单元所占用空间‐‐额外空间•影响空间的主要因素:–存储程序的空间一般是常数(和输入规模无关)–输入数据空间为输入规模O(n)–空间复杂性考虑的是额外空间的大小额外空间相对于输入规模是常数•, 称为原地工作的算法.•两种空间复杂性:–最坏情况下的复杂性–平均情况下的复杂性.4简单性•含义:算法简单,程序结构简单.•好处:容易验证正确性便于程序调试•简单的算法效率不一定高. 要在保证一定效率的前提下力求得到简单的算法5基于时间的最优性•含义:指求解某问题算法类中效率最高的算法•两种最优性最坏情况下最优:设A 是解某个问题的算法, 如果在解这,个问题的算法类中没有其它算法在最坏情况下的时间复杂性比A 在最坏情况下的时间复杂性低, 则称A 是解这个问题在最坏情况下的最优算法.平均情况下最优:设A 是解某个问题的算法, 如果在解这个问题的算法类中没有其它算法在平均情况下的时间复杂性比A 在平均情况下的时间复杂性低, 则称A 是解这个问题在平均情况下的最优算法6寻找最优算法的途径(1) 设计算法A, 求W(n),得到算法类最坏情况下时间复杂度的一个上界(2) 寻找函数F n使得对任何算法都存在一个规模为n 的输()(),入并且该算法在这个输入下至少要做F(n)次基本运算,得到该算类最坏情况时复杂度个界到该算法类最坏情况下时间复杂度的一个下界(3) 如果W(n)=F(n)或W(n)=Θ(F(n)), 则A是最优的.(4) 如果W(n)>F(n), A不是最优的或者F(n)的下界过低. (4))改进A或设计新算法A’使得W’(n)<W(n).重新证明新下界F’(n)使得F’(n)>F(n).,()()()(())重复以上两步, 最终得到W’(n) = F’(n) 或者W’(n) = ΘF’(n76.1 平凡下界算法的输入规模和输出规模是它的平凡下界例1问题:写出所有的n阶置换求解的时间复杂度下界为Ω(n!)例2问题:求n次实系数多项式多项式在给定x的值求解的时间复杂度下界为Ω(n)例3问题:求两个n×n 矩阵的乘积求解的时间复杂度下界是Ω(n2)6.2 直接计数最少运算数例4找最大算法Findmax输入数组L, 项数n≥1输出L中的最大项MAX1.1. MAX←L(1);i←2;2. while i≤n do3. if MAX<L(i) then MAX←L(i);3if)then4. i←i+1;W(n)=n-1以比较作为基本运算的算法类的上界:n1-1找最大问题的复杂度下界:在n 个数的数组中找最大的数, 以比较做基本运算的算法类中的任何算法在最坏情况下至少要做n-1 次比较.因为MAX是唯一的, 其它的n-1 个数必须在比较后被淘证是唯的1汰. 一次比较至多淘汰一个数, 所以至少需要n-1 次比较.结论: F indmax 算法是最优算法.106.3决策树(Decision Tree)二叉树的性质叉树的性质命题1 在二叉树的t 层至多2t 个结点命题2 深度为d 的二叉树至多2d+1-1 个结点.命题3 n个结点的二叉树的深度至少为⎣log n⎦.3l命题4 设t 为二叉树的树叶个数,d为树深,如果树的每个内结点都有2个儿子,则t≤2d.116.4 检索算法时间复杂度分析检索问题: 给定按递增顺序排列的数组L (项数n ≥1)和数x ,L 0算法1 如果x 在L 中, 输出x 的下标; 否则输出0. 顺序捡索输入: L , x 输出: j 1. j ←12. while j ≤n and L (j )≠x do j ←j +1 3if then3. if j >n then j ←0分析:设x 在L 中每个位置和空隙的概率都是1/(2n +1) W (n )=nA (n )=[(1+2+...+n )+n (n +1)]/(2n +1)≈3n /4.12二分捡索最坏时间复杂度定理1 W (n ) = ⎣log n ⎦+ 1 n ≥1证对n 归纳n =1时, 左= W (1)=1, 右= ⎣log 1⎦+1 = 1. n 假设对一切k , 1≤k <n , 命题为真, 则⎣⎦⎣⎦⎣⎦1log 1)(1)(22++=+=W n W n ⎣⎦1log ⎨⎧−+=n n 为偶数⎣⎦⎣⎦1log 1)1log(+=⎩+n n n 为奇数13二分捡索的平均时间复杂度令n =2k -1, S t 是算法做t 次比较的输入个数, 1≤t ≤k 则S 1=1=20, S 2=2=21, S 3=22, S 4=23, ... , S t = 2t −1, t <k S k = 2k −1 + n + 1其中2k −1 为x 在表中做k 次比较的输入个数1)...21(12)(21k kS S S n n A ++++=14求和1+=1)...21(12)(121+++−kS S S n n A k t k 1)]1(2[121++∑+==n k t n t )]1(12)1[(12−+++−+=n k k n k⎣⎦21log 21221+=−=+≈n k k k 15捡索问题的决策树设A是一个捡索算法, 对于给定输入规模n, A的一棵决策树是一棵二叉树, 其结点被标记为1, 2, ... , n, 且标记规则是: 棵二叉树12•根据算法A,首先与x 比较的L 的项的下标标记为树根.•假设某结点被标记为i,–i 的左儿子是:当x<L(i)时,算法A下一步与x比较的项的下标–i 的右儿子是:当x>L(i)时,算法A下一步与x比较的项的下标–若x<L(i) 时算法A 停止, 则i 没有左儿子.–若x>L(i) 时算法A 停止, 则i 没有右儿子.16实例改进顺序捡索算法和二分捡索算法的决策树,n =1512841231426101415135********给定输入, 算法A 将从根开始, 沿一条路径前进, 直到某.个结点为止. 所执行的基本运算次数是这条路径的结点个数. 最坏情况下的基本运算次数是树的深度+1.17检索问题的复杂度分析定理对于任何一个搜索算法存在某个规模为n 的输入使得该算法至少要做⎣log n⎦+1 次比较.证由命题3, n 个结点的决策树的深度d 至少为⎣log n⎦, 故3n dW(n)=d+1 = ⎣log n⎦+1.结论: 对于有序表搜索问题, 在以比较作为基本运算的算法类中, 二分法在最坏情况下是最优的.186.5 排序算法时间复杂度分析•冒泡排序•快速排序与二分归并排序•堆排序序算界•排序算法的复杂度下界19冒泡排序输入: L, n≥1.输出: 按非递减顺序排序的L.:算法bubbleSort1n//1. FLAG←n //标记被交换的最后元素位置2. while FLAG> 1 do3. k←FLAG13.−4. FLAG ←1j5. for =1 to k do6. if L(j) > L(j+1) then do7. L(j) ↔L(j+1)8. FLAG←j20实例5 3 26 9 1 4 8 73 2 5 6 14 8 7923 5 1 4 6 78 92 531467892 1345678 91 2 3 4 5 6 7 8 9特点交换发生在相邻素之间特点:交换发生在相邻元素之间21置换与逆序•逆序令L ={1,2,...,n }, 排序的任何输入为L 上的置换. 在置j )为该置换的个逆序换a 1a 2...a n 中若i <j 但a i >a j , 则称(a i ,a j ) 为该置换的一个逆序. 序序个•逆序序列在i 右边,并且小于i 的元素个数记作b i , i =1, 2,…,n . ( b 1, b 2, …, b n ) 称为置换的逆序序列•实例置换 3 1 6 5 8 7 2 4逆序序列为(0, 0, 2, 0, 2, 3, 2, 3)22序序列的性质逆序序列的性质•b1=0; b2=0,1; … ; b n= 0,1, … , n-1•总共n!个不同的逆序序列置换与它的逆序序列构成一一对应•逆序数:置换中的逆序总数b+ b+ … +b12n•实例置换 3 1 6 5 8 7 2 4逆序序列为( 0, 0, 2, 0, 2, 3, 2, 3 )逆序数1223冒泡排序算法复杂度分析•最坏情况分析:W(n)=O(n2), 至多巡回O(n)次,每次O(n).•对换只发生在相邻元素之间,每次相邻元素交换只消除1个逆序,比较次数不少于逆序数,最大逆序数n(n−1)/2,于是W(n)=Θ(n2).•平均情况:设各种输入是等可能的,置换α的逆序序列是(b1, b2, … , b n), 置换α′的逆序序列为(0−b1, 1−b2, … ,n−1−b,αα′的逆序数之和为n n−1)/2. n!个置换分成)与的逆序数和为()个换分成nn!/2个组,每组逆序之和为n(n−1)/2.平均逆序数()/,平均的交换次数为()/.n n−1)/4n n−1)/4.•冒泡排序的最坏和平均复杂性均为Θ(n2)24快速排序与二分归并排序•快速排序最坏情况O(n2)平均情况O(n log n))•二分归并排序最坏情况O(n log n)平均情况O(n log n))25堆排序•堆的定义•堆的运算–堆整理Heapify(A,i)H if(–复杂度分析–建堆Build-Heap(A)–复杂度分析•堆排序算法Heap-sort(A)–复杂度分析26堆的定义设T 是一棵深度为d 的二叉树,结点为L中的元素.若满足以下条件,称作堆.若满足以下条件称作(1) 所有内结点(可能一点除外)的度数为2(2) 所有树叶至多在相邻的两层所有树叶多在相邻的(3) d−1 层的所有树叶在内结点的右边(4) d−1 层最右边的内结点可能度数为1(没有右儿子)(5) 每个结点的元素不小于儿子的元素若只满足前(4)条,不满足第(5)条,称作堆结构27实例116141023793 845678910堆存储在数组A241A[i]:结点i 的元素,例如A[2]=14.left(i), right(i) 分别表示i 的左儿子和右儿子28堆的运算:整理算法Heapify(A,i)1. l ←left(i)1l l f2. r←right(i)3if]and]>]3. if l≤heap-size[A] and A[l] > A[i]4. then largest←lg5. else largest←i6. if r ≤heap-size[A] and A[r] > A[largest]7. then largest ←r8. if largest≠i8if l i9. then exchange A[i] ↔A[largest]10. Heapify(A, largest)10Heapify(29Heapify 实例p y 1641012316141012379314456797934456792818102818102)161410123Heapify(A ,2)79324184567891030(1)复杂度分析每次调用为O(1)子堆大小至多为原来的2/3递推不等式T(n) ≤T(2n/3) + Θ(1)解得T(n) = Θ(log n)或者T(h) = Θ(h) xh为堆的根的高度结点总数+1)/21(3(距树叶最大距离)x+(x-1)/2+1=(3x+1)/231堆的运算:建堆Build-Heap(A)算法Build Heap(1.heap-size[A] ←length[A]2.for i ←⎣length[A]/2⎦downto 13.do Heapify(A, i)do Heapify()32414113169102234567131691022345671487891041411487891013234567110169314234567实169102871489102878910例41161231610793142345671410793845679332818910241810时间复杂度分析•结点的高度:该结点距树叶的距离•结点的深度:该结点距树根的距离•同一深度结点分布在树的同一层同高度结点可以分布在树的不同的层同一高度结点可以分布在树的不同的层•思路:按照高度计数结点数,乘以O (h ), 再求和Heapify(i ) i p y()的复杂度依赖于的高度⎣⎦∑×==n h O h n T log )()(的结点数高为h 034计数高度为h 的结点数引理n 个元素的堆高度h 的层至多存在个结点.⎥⎥⎤⎢⎢⎡+12h n 证明思路: 对h 进行归纳.归纳基础⎡h =0, 命题为真,即证堆中树叶数为归纳步骤⎥⎥⎤⎢⎢2n 归步假设对h -1为真,证明对h 也为真.35归纳基础h =0,d -1d (),-10, 树叶分布在d 和d 1层,d 层( x 个), d 1 层(y 个).Case1: x 为偶数x +=−+=+−−222211x x y x d d ⎥⎥⎤⎢⎢⎡=⎥⎥⎤⎢⎢⎡−+=+=22122)2(n x x dd y 个每个内结点有2 个儿子,树叶数为(为偶数11)x 个( x 为偶数,d -1 层以前各层结点总数2d −1 )36归纳基础(续)Case2 x 为奇数(x 为奇数,n 为偶数)+−+=+−121x x y x d −+=−1221x d ⎤⎢⎡=−+=122n n x dy 个⎥⎥⎢=222x 个37归纳步骤假设命题对于高度h -1为真,证明对于高度为h 也为真.设T 表示n 个结点的树,从T 中移走所有的树叶得到树T’, T 与T ’的关系:T 为h 的层恰好是T’ 的高为h -1 的层. n =n ’+n T’ 的结点数为n ’, n 为T 的树叶数)0(,0T’38T归纳步骤(续)令n h 表示T 中高为h 的层的结点数根据归纳基础, n 0=⎥⎥⎤⎢⎢⎡2n '⎥⎢=−=n n n n 10'2−=⎥⎦⎢⎣h h n n ⎣⎦⎤⎡=⎥⎤⎢⎡≤⎥⎤⎢⎡=⎤⎡≤=−221''n n h h n n n n ⎥⎥⎢⎢⎥⎢⎥⎢⎥⎥⎢⎢+12222h h h h 39时间复杂度分析定理3n 个结点的堆算法Build-Heap 的时间复杂性是O (n )证明:对高为h 的结点调用Heapify 算法时间是O (h ), 根据引理高为h ⎤⎡n 根据引理,高为h 的结点数至多为, 因此时间复杂度⎥⎥⎢⎢+12h ⎣logn ⎡⎦)(2)(g 01h O n n T h h ⎥⎥⎤⎢⎢=∑∞=+)()2(01n O h n O h h ==∑=+40推导⎣⎦),()(log 1h O n n T n h ⎥⎤⎢⎡=∑+⎣⎦2.log 12221n k n k n kkk h ⎡=≤≤−≤<⎥⎢−=则,若,于是令21222)(10101chch ch n T k h h k kh h k ⎥⎥⎤⎢⎢⎡+=⎥⎤⎢=∑∑−=−−=+).()()(21111n O h O hn O ch ch k h k h k=+=+=⎥⎢∑∑−+−+2222100n kk h h <<−==则,若)(22222)(101101101n O ch ch ch n T k h h k k h h k k h h k===⎥⎤⎢⎡<∑∑∑−=+−=−−−=+⎥⎢求和∞h ...]2322210[2320++++=∑=h h......]2121[...]2121[...]2121[43322+++++++++=...]2121...][21211[22+++++=2)1(121221=−=42堆排序算法堆排序算算法Heap-sort(A)1. Build-Heap(A)2. for i ←length[A] downto 23. do exchange A[1]↔A[i]3do4. heap-size[A] ←heap-size[A]−15. Heapify(A,1)p y(,)复杂性:O(n log n)Build-Heap 时间为O(n),从行2-5 调用Heapify n-1次,每次O(log n),时间为O(n log n)43实例16141410810 87934793241211610983894712 47131014162141644实例8773 421943 1289101416101416412323…1789 1014164789 10141645排序问题的决策树考虑以比较运算作为基本运算的排序算法类,任取算法A, 输入L={x如下定义决策树, x2, …, x n}, 如下定义决策树:11.A第一次比较的元素为x i , x j,那么树根标记为i, j2.假设结点k 已经标记为i, j,假设结点经标记为(1) x i < x j若算法结束,k 的左儿子标记为输入;, x q,那么k 的左儿子标记为p,q 若下一步比较元素xp(2) x i > x j若算法结束,k的右儿子标记为输入;若下一步比较元素x, x q,那么k的右儿子标记为p,qp46一棵冒泡排序的决策树设输入为x1, x2, x3,冒泡排序的决策树如下121,22,31,31,32,12,31,2,33,2,12,3,12,1,33,1,21,3,2任意输入:对应了决策树树中从树根到树叶的一条路经,算法最坏情况下的比较次数:树深删除非二叉的内结点(灰色结点),得到二叉树叫做B-树B-B-47 B树深度不超过决策树深度,B树有n!片树叶引理引理1设t 为B-树中的树叶数,d 为树深,则t ≤2d . 证明归纳法.d =0, 树只有1片树叶,深度为0,命题为真.假设对一切小于d 是一棵深度为d 假设对切小于d 的深度为真,设T 是棵深度为d 的树,树叶数为t . 取走T 的d 层的x 片树叶,得到树T’. 则T’的深度为d −1,树叶数t ’。

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

例 0/1背包问题
•M,n;wi, pi •(x0,x1,x2,x3) •显示约束:xi∈{0,1} •隐式约束: ∑ xiwi≤M •目标函数: ∑ xipi •当n=3时对应的状态空间
第1 层 第2 层 第3 层 0 1 0


0
1
1 0 1 0 1 1 0 1
•树中总结点数2n+1-1 •树中叶子结点数2n
约束函数:对所有 i 和 j , 0i,j<k , ij ,若 a[i][j]=1 , 则xixj。
8.4.3 图着色算法
【程序8-6】 图的m着色算法 template <class T> void MGraph<T>::NextValue(int k,int m,int *x) { //确定分量x[k]的取值。[1,m]。x[k]初始值=0 do { x[k]=(x[k]+1) % (m+1); //尝试下一种颜色 if (!x[k]) return; //没有可用颜色 for (int j=0; j<k; j++) //可行判定 if (a[k][j] && x[k] == x[j]) break; if (j==k) return; //成功 } while (1); }
如排序问题相同,皇后问题的状态空间树是一棵 排列树。排列树有n!个叶结点,遍历排列树的时间 为(n!)。
4皇后问题对应的排列图
8.2.3 n-皇后算法
【程序8-4】 n-皇后问题的回溯算法 bool Place(int k, int i,int* x) //xk=i是否可行 {//判定两个皇后是否在同一列或在同一斜线上 for (int j=0;j<k;j++) if ((x[j]==i) || (abs(x[j]-i)==abs(j-k))) return false; return true; } void NQueens(int n,int *x) { NQueens(0,n,x); }
目标函数,也称代价函数(cost function),用来 衡量每个可行解的优劣。使目标函数取最大(或最 小)值的可行解为问题的最优解。 状态空间树(state space)是描述问题解空间的树 形结构。树中每个结点称为一个问题状态 (problem state)。如果从根到树中某个状态的路 径代表了一个作为候选解的元组,则称该状态为解 状态( solution state)。若这个候选解可行,则称 该解状态为答案状态(answer state)。
s wi xi , r wi
i 0 i k
k 1
n 1
s—部分和 r—剩余和
xk=1
xk=0
s+r≥M && s+wk≤M s+r-wk≥M
8.3.3 子集和数算法
•【程序8-5】子集和数的回溯算法
void SumOfSub (float s, int k, float r, int* x, float m, float* w) //s—部分和 r—剩余和 { x[k]=1; if (s+w[k]==m) { //得到一个可行解 for (int j=0;j<=k;j++) cout<<x[j]<< ' '; cout<<endl; }
例 8- 3 设有n=6 个正数的集合 W=(5,10,12,13,15,18)和整数 M=30,求W的所有元素之和为M的子集。
8.4 图的着色
8.4.1 问题描述
已知无向图 G=(V,E) 和 m 种不同的颜色,如果只允 许使用这m种颜色对图G的结点着色,每个结点着一 种颜色。问是否存在一种着色方案,使得图中任意 相邻的两个结点都有不同的颜色。这就是 m- 着色判 定问题(m-colorability decision problem)
部分向量(x[0],,x[k-1]) 代表从根到一个中间状态Y的路径 T(x[0],,x[k-1]) 代表xk所有可能取值 约束函数 Bk(x[0],,x[k])
【程序8-2】 迭代回溯法 Void IBacktrack(int n) { int k=0; while (k>=0){ if (还剩下尚未检测的x[k],使得x[k] T(x[0],,x[k-1]) && Bk(x[0],,x[k]){ if ( (x[0],x[1],,x[k])是一个可行解) 输出(x[0],x[1],,x[k]); k++; } else k--; } }
void NQueens(int k,int n,int *x) { for (int i=0; i<n;i++) { if (Place(k,i,x)) { x[k]=i; if (k==n-1) { for(i=0;i<n;i++) cout<<x[i]<<" "; cout<<endl; } else NQueens(k+1,n,x); } } }
第4 层
0
例 排序问题
•元素a0,a1,…,an-1排序问题 •解向量(x0,x1,…,xn-1), xi表示 元素ai在排列中的位置 •显示约束:xi∈{0,1,…,n-1} 且xi≠xj (i≠j) •隐式约束: ai≤aj (xi≤xj) •无目标函数 •(13,24,09) •树中总结点数:1+n+n(n1)+n(n-1)(n-2)+…+n! •树中叶子结点数n!
4皇后问题的两个可行解
其中一个可行解的回溯过程
X XX X
X X
实际生成的树结点
8.2.4 时间分析
可通过蒙特卡罗法计算 5 次试验中实际需要生成 的结点数的平均值为1625。8-皇后问题状态空间树 的结点总数是:
1 ( 8 i ) 109601
j 0 i 0 7 j
因此,需要实际生成的结点数目大约占总结点数 的1.55%。
0 1 2 … n-1
ai
8.1.2剪枝函数和回溯法
为了提高搜索效率,在搜索过程中使用约束函数 (constraint function),可以避免搜索那些已知不 含答案状态的子树。 如果是最优化问题,还可使用限界函数( bound function )剪去那些不可能包含最优答案结点的子 树。约束函数和限界函数的目的都是为了剪去不必 要搜索的子树,减少问题求解过程中实际生成的状 态 结 点 数 , 它 们 统 称 为 剪 枝 函 数 ( pruning function)。
函数size返回集合S的大小;函数Choose从集合S中随机选择一个
8.2 n-皇后
8.2.1 问题描述
n-皇后问题要求在一个nn的棋盘上放置n个皇后, 使得它们彼此不受“攻击”。 n- 皇后问题要求寻找 在棋盘上放置这n个皇后的方案,使得它们中任何两
个都不在同一行、同一列或同一斜线上。
8.2.2 回溯法求解
第2部分 算法设计策略 第8章 回溯法
8.1 8.2 8.3 8.4 8.5 8.6 8.7
一般方法 n-皇后 子集和数 图的着色 哈密顿环 0/1背包 批处理作业调度
8.1 一般方法
1. 问题的所有可能的解可以用树形
结构来表示, 2. 通过在树中遍历搜索找到可行解 或最优解
8.1.1 基本概念
8.3 子集和数
8.3.1 问题描述
•已知 n 个不同正数 wi , 0in-1 ,的集合,求该集合
的所有满足条件的子集,使得每个子集中的正数之 和等于另一个给定的正数M。 例 8- 2 设有n=4个正数的集合 W={w0,w1,w2,w3}=(11,13,24,7) 和整数 M=31 ,求 W 的 所有满足条件的子集,使得子集中的正数之和等于M。
使用剪枝函数的深度优先生成状态空间树中结点 的求解方法称为回溯法(backtracking); 广度优先生成结点,并使用剪枝函数的方法称为 分枝限界法(branch-and-bound)。
【程序8-1】递归回溯法 Void RBacktrack(int k) { //应以Rbacktrack(0)调用本函数 for (每个x[k],使得 x[k]T(x[0],,x[k-1]) &&(Bk(x[0],,x[k])){ if ( (x[0],x[1],,x[k])是一个可行解) 输出 (x[0],x[1],,x[k]); RBacktrack(k+1); } }
【程序8-3】 蒙特卡罗算法 int Estimate(SType* x) { int k=0, m=1, r=1; do { SetType S={ x[k]| x[k]T(x[1],,x[k1]) && Bk(x[1],,x[k]==true)}; if (!Size(S)) return m; r=r*Size(S); m=m+r; x[k]=Choose(S);k++; }while(1); }
•如:地图着色问题 、四色猜想
8.4.2 回溯法求解
设无向图 G=(V,E) 采用如下定义的邻接矩阵 a 表示:
1 a [ i ][ j ] 0 如果( i, j ) E 其它
解的形式:n-元组(x0,x1,,xn-1), xi{1,…,m}, 0i<n,表示结点i的颜色,这就是 显式约束。 xi=0 表示没有可用的颜色。因此解空间 的大小为mn。 隐式约束可描述为:如果边(i,j)E,则 xixj。
else if (s+w[k]<m) //搜索左子树 SumOfSub(sf ( (s+r-w[k]>=m) ) { //搜索右子树 x[k]=0; SumOfSub(s, k+1, r-w[k], x, m, w); } } void SumOfSub (int* x, int n, float m, float* w) { float r=0; for(int i=0;i<n;i++) r=r+w[i]; //初时化r, 应有r≥m if(r>=m && w[0]<=m) SumOfSub(0, 0, r, x, m, w); }
相关文档
最新文档