算法设计第一章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
引
入
篇
第一章 算法概述
1.1 用计算机求解 问题与算法
问题求解(problem solving)是个大课题, 它涉及归约、推断、决策、规划、常识推理、 定理证明和相关过程的核心概念。
1.1.1 用计算机求解问题的步骤
人在解决问题时有很大的灵活性,对于同一 个问题,不同的人有不同的经验,会采用不同 的方法,怎么样用计算机解决一个现实中的问 题呢?虽然也是有很多不同的方法,但基本步 骤是相同的。
main1( ) {int *a,i,j,n; input(n); a=calloc(n+1,sizeof(int)); for (i=1; i<=n;i++) a[i]=1; for (i=1; i<=n;i++) for (j=i; j<=n;j=j+i) a[i]=1-a[i]; for (i=1; i<=n;i++) if (a[i]=0) print(i,”is }
算法设计2: 1)算法应该是求出每个牢房编号的不重复的因子个数,当它 为奇数时,这里边的囚犯得到大赦。 2 )一个数的因子是没有规律的,只能从 1——n 枚举尝试。算 法2如下: main2( ) {int s,i,j,n; input(n); for (i=1; i<=n;i++) { s=1; for (j=2; j<=i;j=j++) if (i mod j=0) s=s+1; if (s mod 2 =1) print(i,”is free.”); } }
用计算机解决一个现实中的问题步骤
1. 2. 3. 4.
5.
6. 7. 8.
问题分析 数学模型建立 算法设计与选择 算法表示 算法分析 算法实现 程序调试 结果整理文档编制
1. 问题分析
准确、完整地理解和描述问题是解决问 题的第一步。要做到这一点,必须注意以下 一些问题:在未经加工的原始表达中,所用 的术语是否都明白其准确定义?题目提供了 哪些信息?这些信息有什么用?题目要求得 到什么结果?题目中作了哪些假定?是否有 潜在的信息?判定求解结果所需要的中间结 果有哪些?等等。必须认真审查表达问题的 有关描述,深入分析,以加深对问题的了解。
free.”);
算法分析:以一次开关锁计算,算法的时间复杂度为 n*(1+1/2+1/3+……+1/n)=O(nlogn)。
可不可以换个角度思考呢? 如果不考虑详细过程, 从每扇门的锁角度考虑呢? 问题分析:转动门锁的规则可以有另一种理解,第一次转动的是编 号为1的倍数的牢房;第二次转动的是编号为2的倍数的牢房;第 三次转动的是编号为3的倍数的牢房;……则狱吏问题是一个关于 因子个数的问题。令d(n)为自然数n的因子个数,这里不计重复 的因子,如4的因子为1,2,4共三个因子,而非1,2,2,4。则 d(n)有的为奇数,有的为偶数,见下表:
将第三步中的运算结果10与5相加,得到15。
6
算法2
可以运用公式
n(n 1) 直接计算; 1 2 3 n 2
第一步 第二步 第三步 取n=5; 计算
n(n 1) 2
输出运算结果。
7
例2:三个牧师和三个野人过河,只有一条能装下两 人的船,在河的任一边或者船上,若野人人数大于牧 师人数,那么牧师就会有被吃掉的危险。你能不能找 出一种安全的渡河算法呢?
目
录
前言 引入篇 第一章 第二章 基础篇 第三章 核心篇 第四章 第五章 应用篇 第六章
算法概述 算法分析基础 算法基本工具与优化技巧
基本的算法策略 图的搜索算法 算法设计实践
关于本课程
算法是计算机学科中最具有方法论性质的核心概 念,被誉为计算机学科的灵魂。 课程目的:计算机算法设计与分析导引 以算法设计为主,介绍算法设计的主要方法和 基本思想;并简要介绍算法分析概念 不是程序设计课,也不是数学课
数据结构 算法操作的对象是数据,数据间的逻辑 关系、数据的存储方式及处理方式就是数据 的数据结构。它与算法设计是紧密相关的。
转动门锁的规则是这样的,第一次通过牢房,要转动每 一把门锁,即把全部锁打开;第二次通过牢房时,从第二间 开始转动,每隔一间转动一次;第k次通过牢房,从第k间开 始转动,每隔k-1 间转动一次;问通过n次后,那些牢房的 锁仍然是打开的?
算法设计1: 1)用n个元素的一维数组a[n],每个元素记录一个锁的状 态,1为被锁上,0为被打开。 2)用数学运算方便模拟开关锁的技巧,对i号锁的一次开 关锁可以转化为算术运算:a[i]=1-a[i]。 3)第一次转动的是1,2,3,……,n号牢房; 第二次转动的是2,4,6,……号牢房; 第三次转动的是3,6,9,……号牢房; ……第i次转动的是 i,2i ,3i,4i,……号牢房,是起点 为i,公差为i的等差数列。 4)不做其它的优化,用蛮力法通过循环模拟狱吏的开关 锁过程,最后当第i号牢房对应的数组元素a[i]为0时, 该牢房的囚犯得到大赦。 算法1如下:
与其他课程的关系
数据结构
算法设计与分析
高级程序设计语言(C, C++)
与数据结构的区别:
考虑问题的角度:数据结构关心不同的数据结构在解题中 的作用和效率;算法关心解题方法思路及不同设计技术的适 用性和效率。
考虑问题的高度:数据结构关心的是解具体问题,算法不 仅如此,它提供一种解决问题的通用方法。
4
8、结果整理文档编制 编制文档的目的是让人了解你编写的算 法。首先要把代码编写清楚。代码本身就是 文档。同时还要采用注释的方式,另外还包 括算法的流程图,自顶向下各研制阶段的有 关记录,算法的正确性证明(或论述),算 法测试结果,对输入/输出的要求及格式的详 细描述等。
在这些步骤中,算法设计是解决问题 的核心。
2、数学模型建立
用计算机解决实际问题必须有合适的数学 模型,因为在现实问题面前,计算机是无能 为力。对一个实际问题建立数学模型,可以 考虑这样两个基本问题:最适合于此问题的 数学模型是什么?是否有已经解决了的类似 问题可借鉴? 如果上述第二个问题的答复是肯定的,那 么通过类似的问题的分析、比较和联想,可 加速问题的解决。
3、算法设计与选择 算法设计是指设计求解某一特定类型问题 的一系列步骤,并且这些步骤是可以通过计 算机的基本操作来实现的。算法设计要同时 结合数据结构的设计,简单说数据结构的设 计就是选取存储方式。算法的设计与模型的 选择更是密切相关的,但同一模型仍然可以 有不同的算法,而且它们的有效性可能有相 当大的差距。
表4-3
n 1 2 2 3 2 4 3 d(n) 1
编号与因数个数的关系
5 2 6 4 7 2 8 4 9 3 10 4 11 2 12 6 13 2 14 4 15 4 16 5 … …
数学模型1:上表中的d(n)有的为奇数,有的为偶数,由于牢房的 门开始是关着的,这样编号为i的牢房,所含1——i之间的不重复 因子个数为奇数时,牢房最后是打开的,反之,牢房最后是关闭 的。
就本课程而言,算法就是计算机解题的过 程。在这个过程中,无论是形成解题思路还 是编写算法,都是在实施某种算法。前者是 推理实现的算法,后者是操作实现的算法。
2.算法的要素 算法由操作、控制结构、数据结构三要 素组成。 操作 算术运算:加、减、乘、除 关系比较:大于、小于、等于、不等于 逻辑运算:与、或、非 数据传送:输入、输出, 赋值
6、算法实现
根据选用的算法设计语言,要解决下列 一些问题:有哪些变量,它们是什么类型? 需要多少数组,规模有多大?用什么结构来 组织数据?需要哪些子算法?等等。 算法的实现方式,对运算速度和所需内 存容量都有很大影响。
7、程序调试
算法测试的实质是对算法应完成任务的实验证实,同 时确定算法的使用范围。测试方法一般有两种:白盒测试对 算法的各个分支进行测试;黑盒测试检验对给定的输入是否 有指定输出。 如何选择算法测试中的输入,还没有一般答案。通常采 用的方法是,对输入数据做有代表性的采样,使之对被测试 算法的各个语句、分支和路径尽可能都被检查到。对输入集 中的边界点也要进行测试。经测试验证是否正确的算法,在 较大程度上是可以相信它的正确性。
1.1.2 算法及其要素和特性
1、算法的定义
算法是指在解决问题时,按照某种机械 算法步骤一定可以得到问题结果的处理过程。 当面临某个问题时,需要找到用计算机解决 这个问题的方法和步骤,算法就是对解决这 个问题的方法和步骤的描述。
机械算法步骤是指,算法中有待执行的运 算和操作,必须是相当基本的。换言之,它 们都是能够精确地运行的算法,执行者甚至 不需要掌握算法的含义,即可根据该算法的 每一步骤要求,进行操作并最终得出正确的 结果。
算法模型还可以改进吗?
什么情况下一个数的因子会 是奇数个呢?
m只需要找出小于n的平方数即可。算法3如下:
main3( ) {int s,i,j,n;
input(n);
for (i=1;i<=n;i++) if(i*i<=n) print(i,”is free.”);
else
}
break;
由此算法我们应当注意:在对运行效率要求较高的大规模的数 据处理问题时,必须多动脑筋找出效率较高的数学模型及其对 应的算法。
第一步 第二步 第三步 第四步 第五步 第六步
两个野人先过河,一个野人回来; 再两个野人过河,一个野人回来; 两个牧师过河,一个野人和一个牧师回来; 两个牧师过河,一个野人回来; 两个野人过河,一个野人回来; 两个野人过河。
8
【例3】狱吏问题
某国王对囚犯进行大赦,让一狱吏n次通过一排锁着的n 间牢房,每通过一次,按所定规则转动n间牢房中的某些门 锁, 每转动一次, 原来锁着的被打开, 原来打开的被锁上; 通过n次后,门锁开着的,牢房中的犯人放出,否则犯人不 得获释。
算法分析: 狱吏开关锁的主要操作是a[i]=1- a[i];共执行了 n*(1+1/2+1/3+……+1/n)次,时间近似为复杂度为O(n log n)。使用了n个空间的一维数组。 算法2没有使用辅助空间,但由于求一个编号的因子个数 也很复杂,其主要操作是判断i mod j是否为0,共执行 了n*(1+2+3+……+n)次,时间复杂度为O(n2)。 算法2复杂度还能降低吗?
控制结构 —— 各操作之间的执行次序。 顺序结构:各操作依次执行 选择结构:由条件是否成立来选择 执行 循环结构:有些操作要重复执行,直到 功能满足某个条件时结束。又称重复或迭代 结构。
注明: 模块间的调用也是一种控制结构,特别 地模块自身的直接或间接调用—递归结构, 是一种功能很强的控制结构。
2
授课形式: 上课(5%)+作业(10%)+实验(15%)+期末考试70% 教材 算法设计与分析 吕国英主编 清华大学出版社 参考书 算法设计与分析 王晓东编 电子工业出版社 算法设计与分析基础 (美)莱维丁(Levitin,A.) 著, 潘彦 译,清华大学出版社 T. H. Cormen, C. E. Leiserson, R. L. Rivest and C. Stein (2001), Introduction to Algorithms (the second edition). The MIT Press,中文名《算法导论(第二版)》(影 印版),高等教育出版社 学时:39(理教)+6(实验)学时
4、算法分析
算法分析的目的,首先为了对算法的某 些特定输入,估算该算法所需的内存空间和 运行时间;其次是为了建立衡量算法优劣的 标准,用以比较同一类问题的不同算法。通 常将时间和空间的增长率作为衡量的标准。 另参见1.1.4算法及其设计的评价
5、算法表示 对于复杂的问题,确定算法后可以通过 图形准确表示算法。算法的表示方式很多如: 算法流程图、盒图、PAD图和伪码(类似于算 法设计语言)等。
算法是什么?
广播操图解是广播操的算法; 菜谱是做菜的算法; 歌谱是一首歌曲的算法; 空调说明书是空调使用的算法等.
5
源自文库
例1:给出求1+2+3+4+5的一个算法。
算法1 按照逐一相加的程序进行。
第一步
第二步 第三步 第四步
计算1+2,得到3;
将第一步中的运算结果3与3相加,得到6; 将第二步中的运算结果6与4相加,得到10;