算法设计与分析 王红梅 第二版 第1章 算法设计基础电子教案
算法设计与分析课程教学大纲

算法设计与分析课程教学大纲【适用专业】计算机科学与技术【课时】理论课时:32【学分】 2【课程性质、目标和要求】《算法设计与分析》是计算机科学与技术专业的专业课。
无论是计算科学还是计算实践,算法都在其中扮演着重要角色。
本课程的教学目的是讲授在计算机应用中常常遇到的实际问题的解法,讲授设计和分析各种算法的基本原理、方法和技术,培养学生对算法复杂性进行正确分析的能力。
课程基本要求是⑴掌握算法分析的基本概念和理论。
⑵掌握算法设计技术和分析算法以及算法复杂性。
【教学时间安排】本课程计 2 学分,理论课时32, 学时分配如下:【教学内容要点】第一章算法引论一、学习目的要求1.了解算法的计算复杂性分析方法2.理解算法分析的基本理论3.掌握算法分析的基本概念二、主要教学内容1. 算法的基本概念2. 表达算法的抽象机制3. 采用Java语言与自然语言相结合的方式描述算法的方法4. 算法的计算复杂性分析方法第二章递归与分治策略一、学习目的要求1.理解典型范例中递归与分治策略应用技巧2.掌握递归与分治策略3.掌握数学归纳法证明算法正确性方法二、主要教学内容1. 递归的概念2. 分治法的基本思想3. 二分搜索技术4. 大整数的乘法5. Strassen阵乘法6. 棋盘覆盖7. 合并排序8. 快速排序9. 线性时间选择10. 最接近点对问题11. 循环赛日程表第三章动态规划一、学习目的要求1.理解典型范例中动态规划算法的设计思想2.掌握动态规划算法的基本要求以及算法的设计要点二、主要教学内容1. 矩阵连乘问题2. 动态规划算法的基本要素3. 最长公共子序列4. 最大子段和5. 凸多边形最优三角剖分6. 多边形游戏7. 图像压缩8. 电路布线9. 流水作业调度10. 0—l背包问题11. 最优二叉搜索树12. 动态规划加速原理三、课堂讨论选题1. 最长公共子序列2. 0—l背包问题第四章贪心算法一、学习目的要求1.了解贪心算法的理论基础及基本要素2. 理解典型范例中贪心算法的设计思想3. 掌握贪心算法的设计要点二、主要教学内容1. 活动安排问题2. 贪心算法的基本要素3. 最优装载4. 哈夫曼编码5. 单源最短路径6. 最小生成树7. 多机调度问题8. 贪心算法的理论基础三、课堂讨论选题1. 最优装载2. 单源最短路径第五章回溯法一、学习目的要求1.理解回溯法的效率分析方法2.掌握回溯法的算法框架和应用技巧二、主要教学内容1. 回溯法的算法框架2. 装载问题3. 批处理作业调度4. 符号三角形问题5. n后问题6. 0—l背包问题7. 最大团问题8. 图的m着色问题9. 旅行售货员问题10. 圆排列问题11. 电路板排列问题12. 连续邮资问题13. 回溯法的效率分三、课堂讨论选题1. 0—l背包问题2. 图的m着色问题第六章分支限界法一、学习目的要求1.理解分支限界法的基本思想2.掌握典型范例中分支限界法的应用技巧二、主要教学内容1. 分支限界法的基本思想2. 单源最短路径问题3. 装载问题4. 布线问题5. 0-1背包问题6. 最大团问题7. 旅行售货员问题8. 电路板排列问题9. 批处理作业调度三、课堂讨论选题1. 0-1背包问题2. 批处理作业调度第七章概率算法一、学习目的要求1.理解概率算法的基本思想2.掌握典型范例中概率算法的应用技巧二、主要教学内容1. 随机数2. 数值概率算法3. 舍伍德算法4. 拉斯维加斯算法5. 蒙特卡罗算法第八章 NP完全性理论一、学习目的要求1.了解P类与NP类问题2.了解典型的NP完全问题二、主要教学内容1. 计算模型2. P类与NP类问题3. NP完全问题4. 一些典型的NP完全问题第九章近似算法一、学习目的要求1.掌握近似算法的基本思想2.掌握常用近似算法的应用二、主要教学内容1. 近似算法的性能2. 顶点覆盖问题的近似算法3. 旅行售货员问题近似算法4. 集合覆盖问题的近似算法5. 子集和问题的近似算法第十章算法优化策略一、学习目的要求1.掌握算法优化策略2.掌握算法优化的基本方法二、主要教学内容1. 算法优化策略的比较与选择2. 动态规划加速原理3. 问题的算法特征4. 优化数据结构5. 优化搜索策略【教学(实验)内容要点】算法设计与分析实验是算法设计与分析课的一个实践性教学环节。
算法设计与分析 王红梅 第二版 第1章 算法设计基础复习进程

2020/6/3
Algorithm Introduction
12
算法的描述方法
#include <iostream.h>
int CommonFactor (int m, int n)
欧{ 几 int r=m % n;
里 德
while (r!=0) {
m=n;
算
n=r;
法 r=m % n; } return m; }
例1.2 求两个自然数的最大公约数 [想法1]用短除法找出两个数的公因子,再相乘就
是最大公约数。 [算法1]找两个数的公因子目前只能用蛮力法逐个
尝试,用2-min(m,n)进行枚举尝试。
2020/6/3
Algorithm Introduction
20
算法在问题求解中的地位
算法1.1:CommFactorl(伪代码) 输入:两个自然数m和n 输出:m和n的最大公约数 1. factor=1; 2. 循环变量i从2~min(m,n),执行下述操作;
这是算法吗?
为什么?
2020/6/3
Algorithm Introduction
5
算法及其重要特性
程序?
是算法用某种程序设计语言的具体实现。程序可以不满 足算法的性质(3),即有穷性。
“好算法”的重要特性: (1)正确性:合法的输入,都会得出正确的结果 (2)健壮性:非法的输入,应能识别并处理 (3)可理解性:可读性,易理解 (4)抽象分级:通过抽象分级减少求解步骤 (5)高效性:时间和空间效率
2020/6/3
Algorithm Introduction
27
1. 查找问题 2. 排序问题 3. 图问题 4. 组合问题 5. 几何问题
算法设计与分析-王-第1章-算法设计基础

2)有没有已经解决了的类似问题可供借鉴?
1.4 算法设计的一般过程
在模型建立好了以后,应该依据所选定的模型对问 题重新陈述,并考虑下列问题: (1)模型是否清楚地表达了与问题有关的所有重要
的信息?
(2)模型中是否存在与要求的结果相关的数学量? (3)模型是否正确反映了输入、输出的关系? (4)对这个模型处理起来困难吗?
程序设计研究的四个层次:
算法→方法学→语言→工具
理由2:提高分析问题的能力
算法的形式化→思维的逻辑性、条理性
1.2 算法及其重要特性
一、算法以及算法与程序的区别
例:欧几里德算法——辗转相除法求两个自然数 m 和 n 的最大公约数
m n
欧几里德算法
r
1.2 算法及其重要特性
欧几里德算法
① 输入m 和nห้องสมุดไป่ตู้如果m<n,则m、n互换;
对不合法的输入能作出相适应的反映并进行处理。 (2) 健壮性(robustness): 算法对非法输入的抵抗能力, 即对于错误的输入,算法应能识别并做出处理,而不是 产生错误动作或陷入瘫痪。 (3)可读性:算法容易理解和实现,它有助于人们对算 法的理解、调试和修改。 (4) 时间效率高:运行时间短。 (5) 空间效率高:占用的存储空间尽量少。
算法设计与分析
Design and Analysis of Computer Algorithms
高曙
教材:
算法设计与分析(第二版),清华大学出版社,王红梅, 胡明 编著
参考书目:
Introduction to Algorithms, Third Edition, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest,机械工 业出版社,2012
算法分析实验指导书(王红梅)

《算法设计与分析》实验指导书计算机科学与技术学院石少俭实验一分治法1、实验目的(1)掌握设计有效算法的分治策略。
(2)通过快速排序学习分治策略设计技巧2、实验要求(1)熟练掌握分治法的基本思想及其应用实现。
(2)理解所给出的算法,并对其加以改进。
3、分治法的介绍任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。
问题的规模越小,越容易直接求解,解题所需的计算时间也越少。
而当n较大时,问题就不那么容易处理了。
要想直接解决一个规模较大的问题,有时是相当困难的。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
分治法的适用条件(1)该问题的规模缩小到一定的程度就可以容易地解决;(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
(3)利用该问题分解出的子问题的解可以合并为该问题的解;(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心法或动态规划法。
第四条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。
算法设计与分析(第2版)-王红梅-胡明-习题答案(1)

算法设计与分析(第2版)-王红梅-胡明-习题答案习题11. 图论诞生于七桥问题。
出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。
七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图 1.7是这条河以及河上的两个岛和七座桥的草图。
请将该问题的数据模型抽象出来,并判断此问题是否有解。
七桥问题属于一笔画问题。
输入:一个起点输出:相同的点1, 一次步行2, 经过七座桥,且每次只经历过一次3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。
另一类是只有二个奇点的图形。
2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。
请用伪代码描述这个版本的欧几里德算法1.r=m-n2.循环直到r=02.1 m=n图1.7 七桥问题2.2 n=r2.3 r=m-n3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C++描述。
//采用分治法//对数组先进行快速排序//在依次比较相邻的差#include <iostream>using namespace std;int partions(int b[],int low,int high){int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
算法设计与分析王红梅第二版动态规划详解演示文稿

2022/3/2
Chapter 6 Dynamic Programming
26
第26页,共110页。
多段图的最短路径问题
多段图的决策过程:
多段图的边(u, v),用cuv 表边的权值,从源点s到终点t的最短路 径记为d(s, t),则从源点0到终点9的最短路径d(0, 9)由下式确定 :
d(0, 9)=min{c01+d(1, 9), c02+d(2, 9), c03+d(3, 9)}
2022/3/2
Chapter 6 Dynamic Programming
10
第10页,共110页。
动态规划法的设计思想
动态规划法的求解过程 原问题
子问题1
子问题2 ……
子问题n
2022/3/2
填表 原问题的解
Chapter 6 Dynamic Programming
11
第11页,共110页。
动态规划法的设计思想
Page 15
第6章 动态规划法
2022/3/2
第15页,共110页。
数塔问题——想法
[想法]从顶层出 发下一层选择 取决于两个4层 数塔的最大数 值和。
8 12 15 3 96 8 10 5 12 16 4 18 10 9
Page 16
第6章 动态规划法
2022/3/2
第16页,共110页。
数塔问题——想法
求解初始子问题:底层的每个数字可看作1层数塔,则最大数值和就是其自身; 再求解下一阶段的子问题:第4层的决策是在底层决策的基础上进行求解,可以看作4 个2层数塔,对每个数塔进行求解; 再求解下一阶段的子问题:第3层的决策是在第4层决策的基础上进行求解,可以看作3个 2层的数塔,对每个数塔进行求解;
算法设计与分析王红梅第二分治法PPT学习教案

于轴值; (2)求解子问题:分别对 [ r1 … … ri-1 ] ri [ ri+1 … … rn ]
划分后的每一个子序列递
归处理;
(3)合并:由于对子序列 r1 … ri-1和ri+1 … rn的排序是 就地进行的,所以合并不
均≤ri 轴值 均≥ri 位于最终位置
需要执行任何操作。
第23页/共85页
T (n)
=
1
2T
(n
2)
+n
n =2 n >2
根据2.1.5节的通用分治递推定理,二路归并排序的 时间代价是O(nlog2n)。
第22页/共85页
2021/8/26
22
4.2.2 快速排序
快速排序的分治策略
(1)划分:选定一个记录作为轴值,以轴值为基准将整个序
列划分为两个子序列r1 … ri-1和ri+1 … rn,前一个子序列中记录 的值均小于或等于轴值,后一个子序列中记录的值均大于或等
算法4.4——合并有序子序列 void Merge(int r[ ], int r1[ ], int s, int m, int t)
{ // i,j分 别 指 向 两个 待合并 的有序 子序列 ,k指 向 最终 有序序 列的当 前记录
i=s; j=m+1; k=s;
i
j
r[s],…,r[m] r[m+1],…,r[t]
3. 初始化行、列下标i=begin,j=begin;
4. 重复下述操作size-1次,填写区域A
1. Data[i][j]=number; number++; i++;
第12页/共85页
2021/8/26
算法设计与分析(第2版)-王红 梅-胡明-习题答案

}
7. 圣经上说:神6天创造天地万有,第7日安歇。为什么是6天呢? 任何一个自然数的因数中都有1和它本身,所有小于它本身的因数称为 这个数的真因数,如果一个自然数的真因数之和等于它本身,这个自 然数称为完美数。例如,6=1+2+3,因此6是完美数。神6天创造世界, 暗示着该创造是完美的。设计算法,判断给定的自然数是否是完美数
(1) Ω(n) 紧密? (2) Ω(n*n) (3) Ω(logn+n)(先进行快排,然后进行比较查找) (4) Ω(2^n)
7.画出在三个数a, b, c中求中值问题的判定树。
a<b a<b<c
是
是 是 否 否 否 a<c b<c
b<a<c b<c
C<b<a b<c<a a<c C<a<b
a<c<b
return 0; }
double arctan(double x) { int i=0; double r=0,e,f,sqr;//定义四个变量初 sqr = x*x; e = x; while (e/i>1e-15)//定义精度范围 {
f = e/i;//f是每次r需要叠加的方程 r = (i%4==1)?r+f:r-f; e = e*sqr;//e每次乘于x的平方 i+=2;//i每次加2
cout<<"n至少为:"<<n<<endl; break; } }//for return 0; }
6. 计算π值的问题能精确求解吗?编写程序,求解满足给定精度要求 的π值
#include <iostream> using namespace std;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
为什么?
2020/4/15
Algorithm Introduction
5
算法及其重要特性
程序?
是算法用某种程序设计语言的具体实现。程序可以不满 足算法的性质(3),即有穷性。
“好算法”的重要特性: (1)正确性:合法的输入,都会得出正确的结果 (2)健壮性:非法的输入,应能识别并处理 (3)可理解性:可读性,易理解 (4)抽象分级:通过抽象分级减少求解步骤 (5)高效性:时间和空间效率
2020/4/15
Algorithm Introduction
15
1.1 算法的基本概念
为什么要学习算法 算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
2020/4/15
Algorithm Introduction
16
算法设计的一般过程
1.理解问题(输入、目标、输出以及用适当的 数据结构来描述,在精确解和近似解间做选择) 2. 选择算法设计技术(蛮力法、分治法等) 3.设计并描述算法 4.手工运行跟踪算法 (发现逻辑错误) 5.分析算法的效率(时间和空间效率) 6.实现算法 (根据算法编写代码)
2020/4/15
Algorithm Introduction
17
1.2 为什么要学习和研究算法
算法在问题求解中的地位 算法训练能够提高计算思维能力 算法研究是推动计算机技术发展的关键
2020/4/15
Algorithm Introduction
18
算法在问题求解中的地位
程序是蓝色的诗,算法是程序的灵魂
2020/4/15
Algorithm Introduction
12
算法的描述方法
#include <iostream.h>
int CommonFactor (int m, int n)
欧{ 几 int r=m % n;
里 德
while (r!=0) {
m=n;
算
n=r;
法 r=m % n; } return m; }
3
算法及其重要特性
算法(Algorithm)?
定义1.1 算法是解某一特定问题的一组有穷规则的集合。 即,对特定问题求解步骤的一种描述,是指令的有限序
列,有以下五大特性:
输 入:一个算法有零个或多个外部量作为算法的输入。 输 出:一个算法会产生至少一个量作为输出。 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步
都在有穷时间内完成。 确定性:算法中的每一条指令必须有确切的含义,对于相同的
输入只能得到相同的输出。 可行性:算法描述的操作可以通过已经实现的基本操作执行有
限次来实现。
2020/4/15
Algorithm Introduction
4
算法及其重要特性
例1.1 求两个自然数的最大公约数(直观的方法) 第1步:找出m的所有质因子; 第2步:找出n的所有质因子; 第3步:从第上述两步所得到的质因子中找出所有公因子; 第4步:将所有公因子相乘,即为m和n的最大公约数
本章主要知识点:
1.1 算法的基本概念 1.2 为什么要学习和研究算法 1.3 重要的问题类型
2020/4/15
Algorithm Introduction
2
1.1 算法的基本概念
算法及其重要特性 算法的描述方法 算法设计的一般过程
2020/4/15
Algorithm Introduction
2020/4/15
Algorithm Introduction
6
1.1 算法的基本概念
算法及其重要特性 算法的描述方法 算法设计的一般过程 重要的问题类型
2020/4/15
Algorithm Introduction
7
算法的描述方法
为了清楚准确地将算法求解的步骤记录下来,必须 要描述算法,常用的方法:自然语言、流程图、程 序设计语言和伪代码等
void main( )
{
cout<<CommonFactor(63, 54)<<endl; }
2020/4/15
Algorithm Introduction
13
算法的描述方法
⑷ 伪代码——算法语言
伪代码(Pseudocode):介于自然语言和 程序设计语言之间的方法,它采用某一程序 设计语言的基本语法、操作指令,再结合自 然语言来设计。
否则执行第④步; ④ 将n的值放在m中,将r的值放在n中; ⑤ 重新执行第②步。
2020/4/15
Algorithm Introduction
9
算法的描述方法
⑵ 流程图
优点:流程直观 缺点:严密性不及程序设计语言、灵活性不
如自然语言 使用方法:描述简单算法 注意事项:注意抽象层次
2020/4/15
优点:表达能力强,抽象性强,容易理解
使用方法:算法语言
2020/4/15
Algorithm Introduction
14
算法的描述方法
欧几里德算法(C++语法的伪代码表达)
1. r = m % n; 2. 循环直到 r 等于0
2.1 m = n; 2.2 n = r; 2.3 r = m % n; 3. 输出 n ;
Algorithm Introduction
10
欧 几 里 德 算 法 流 程 图
2020/4/15
算法的描述方法
开始 输入m和n
r=m % n Y
r=0 N
m=n;n=r
输出m 结束
Algorithm Introduction
11
算法的描述方法
⑶ 程序设计语言
优点:能由计算机执行 缺点:抽象性差,对语言要求高 使用方法:算法需要验证 注意事项:将算法写成子函数
算法设计与分析—本科生课程
Design and Analysis of Algorithm
海南大学信息科学技术学院 College of Information Science and Technology, Hainan University
第1章 算法绪论
算法理论的两大论题: 1. 算法设计(解决问题) 2. 算法分析(评价,改进)
⑴ 自然语言
优点:容易理解
缺点:冗长、二义性、过于抽象难于转换为程序 使用方法:粗线条描述算法思想
注意事项:避免写成自然段
2020/4/15
Algorithm Introduction
Hale Waihona Puke 8算法的描述方法欧几里德算法(自然语言描述)
① 输入m 和n; ② 求m除以n的余数r; ③ 若r等于0,则n为最大公约数,算法结束;