计算机算法分析与设计第1章练习
第一章绪论练习题
第一章绪论练习题一、填空题1.数据结构是一门研究非数值计算的程序设计问题中计算机的______以及它们之间的______和运算等的学科。
2.数据结构被形式地定义为(D,R),其中D是______的有限集合,R是D上的______有限集合。
3.数据结构包括数据的______、数据的______和数据的______这三个方面的内容。
4.数据结构按逻辑结构可分为两大类,它们分别是______和______。
5.线性结构中元素之间存在______关系,树形结构中元素之间存在______关系,图形结构中元素之间存在______关系。
6.在线性结构中,第一个结点______前驱结点,其余每个结点有且只有1个前驱结点;最后一个结点______后继结点,其余每个结点有且只有1个后继结点。
7.在树形结构中,树根结点没有______结点,其余每个结点有且只有______个前驱结点;叶子结点没有______结点,其余每个结点的后继结点数可以______。
8.在图形结构中,每个结点的前驱结点数和后继结点数可以______。
9.数据的存储结构可用四种基本的存储方法表示,它们分别是______。
10.数据的运算最常用的有5种,它们分别是______。
11.一个算法的效率可分为______效率和______效率。
12.计算机专业人员必须完成的两项基本任务是:______和______。
13.数据在计算机存储器中的存在形式称为______。
14.概括地说,数据结构课程的主要内容包括:数据的______、定义在______、数据的______的实现。
此外,该课程还要考虑各种结构和实现方法的______。
15.由一种______结构和一组______构成的整体是实际问题的一种数学模型,这种数学模型的建立、选择和实现是数据结构的核心问题。
16.存储结构是逻辑结构的______实现。
17.数据表示任务是逐步完成的,即数据表示形式的变化过程是______->______->______。
【课后习题及答案】《计算机算法设计与分析(第三版)课后习题答案详解
精品课程 课后习题答案第 1 章 算 法 概 述习蹬 1- 1函数的渐近表达式求下列函数的渐近表达式:3, f + 10 n ; 1l 匀10·+·2'' ; 分析与解答: 3矿+10n 二. ( ) ( 4 ) ;,l / 10+ 2 擒 = 0 ( 2” ) ; 2.1-t- l 过 一( ){ 1 ) ;lo 耟. ; t = ( ) ( l (1g1.1) ; I O l og 守 =('i ?!), 21 + 1;, 1; l o g n ' ; 10lv g3飞习题 1- 21() . l )和() ( 2 )的区别试论 ( )( l ) 和 () ( 2 )的区别. 分析与觞答:根据符号()的定义易知0 (1 ) = 0( 2)。
用()(1) 或 0 ( 2 ) 表示同一个函数时 ,差别仅在于 其中的祜数因子。
习题 1- 4 按渐近阶排列表达式按照渐近阶从低到高的顺序排列以下表达式,4n \排在哪一位?分析与解答:l ()g n , 3入 20:ri, 2 . n 2/又 义叫 应该3飞 n!。
, 函 数 排列 顺 序 如 下 : 2 .l og t , n23 、20n, 4,i-, 按 浙 近 阶从 低到尚 习题 1- 5箕法效宇( l ) 假设某符法在椋人栽模为”时的计算时间为 T (,t) = 3 X 2又 在某 台计算机上实现井 完成该算 法的时间为1 秒.现有另一台计算机,其运行速度为第一台的 64 倍,那么在这台新 机器 十用 同 一 符 法在 t 秒 内 能 招 轮人规模为多大的间题?( 2) 若上述芬法的计算时间改进为 T ( n )=r/'能解轴入规枑为多大的问烦?( 3) 若 上述算法的计算时间进一步改进为 T (11) = 8 ,f 秒和可能解输人规筷 为多 大的问 题?分析与解答 :其余 条 件不 变 ,则 在新 机 器上用i 秒时间其 余 条 件 不 变 ,那么在新机器上用"赁法 在 t · 秒1引能 解输人规模 为 n l 的问题。
(整理)《计算机算法-设计与分析导论》课后习题答案.
4.1:在我们所了解的早期排序算法之中有一种叫做Maxsort 的算法。
它的工作流程如下:首先在未排序序列(初始时为整个序列)中选择其中最大的元素max ,然后将该元素同未排序序列中的最后一个元素交换。
这时,max 元素就包含在由每次的最大元素组成的已排序序列之中了,也就说这时的max 已经不在未排序序列之中了。
重复上述过程直到完成整个序列的排序。
(a) 写出Maxsort 算法。
其中待排序序列为E ,含有n 个元素,脚标为范围为0,,1n -。
void Maxsort(Element[] E) { int maxID = 0;for (int i=E.length; i>1; i--) { for (int j=0; j<i; j++) {if (E[j] > E[maxID]) maxID = k; }E[i] <--> E[maxID]; } }最坏情况同平均情况是相同的都是11(1)()2n i n n C n i -=-==∑。
几遍浏览序列实现。
排序策略是顺序比较相邻元素,如果这两个元素未排序则交换这两个元素的位置。
也就说,首先比较第一个元素和第二个元素,如果第一个元素大于第二个元素,这交换这两个元素的位置;然后比较第二个元素与第三个元素,按照需要交换两个元素的位起泡排序的最坏情况为逆序输入,比较次数为11(1)()2n i n n C n i -=-==∑。
(b) 最好情况为已排序,需要(n-1)次比较。
4.3: (a)归纳法:当n=1时显然成立,当n=2时经过一次起泡后,也显然最大元素位于末尾;现假设当n=k-1是,命题也成立,则当n=k 时,对前k-1个元素经过一次起泡后,根据假设显然第k-1个元素是前k-1个元素中最大的,现在根据起泡定义它要同第k 个元素进行比较,当k元素大于k-1元素时,它为k个元素中最大的,命题成立;当k元素小于k-1元素时,它要同k-1交换,这时处于队列末尾的显然时队列中最大的元素。
第一章 计算机解决问题(练习题)
山西省普通高中信息技术学业水平考试题集1第一章如何用计算机解决问题一、考点分析:1、人类解决问题:首先观察、分析问题、收集必要的信息,然后根据已有的知识、经验进行判断、推理,尝试按一定的方法和步骤去解决问题。
2、计算机解决问题:分析问题——设计算法——编写程序——运行程序。
3、计算机程序定义:就是指示计算机如何去解决问题或完成任务的一组可执行的指令。
4、算法就是解决问题的方法和步骤。
5、算法是程序设计的“灵魂“;6、算法+数据结构=程序7、算法的特征:有穷性(执行有限步以后结束,且每一步的执行时间也是有限的;)确定性(每一步都有确切的含义)输入性(有零个或多个输入)输出性(至少产生一个输出)可行性8、算法的描述:自然语言、流程图、伪代码;9、流程图也称为程序框图,起止框(圆角矩形)、输入输出(平行四边形)、判断(菱形)、处理(矩形);10、程序设计语言的发展经历了机器语言、汇编语言、高级语言。
11、计算机可以直接识别的语言是机器语言,机器语言是一串由“0”和“1”构成的二进制代码。
12、比较流行的高级语言有BASIC、C、C++、FORTRAN、PASCAL、COBOL、JA V A等。
二、题型:填空1、流程图中输入输出的图形是。
2、流程图中可以有等图形。
3、计算机能够直接识别的语言是。
4、对信息进行编程加工时,是编程的核心,是解决问题的方法和步骤;单项5、下列关于算法的特征描述不正确的是()。
A、有穷性:算法必须在有限步之内结束B、确定性:算法的每一步必须有确切的含义C、输入:算法必须至少有一个输入D、输出:算法必须至少有一个输出6、程序是()A解决某个问题的文档资料B计算机的基本操作C解决某个问题的计算机语言的有限命令的有序集合D计算机语言7、刘丽想帮她妈妈设计一个文件加密程序,制定了如下的工作过程,你认为最恰当的是()A、分析问题、编写程序代码、运行程序、得到答案B、分析问题、设计算法、编写程序代码、调试运行C、设计算法、编写程序代码、调试程序、得到答案D、分析问题、设计程序、编写程序代码、运行程序8、下列属于计算机程序设计语言的是( )A、ACDSeeB、VisualBasicC、Wave EditD、WinZip9、下列不是用于程序设计的是( ) A、BASIC B、C语言C、WORD D、Pascal10、人们根据特定的需要,预先为计算机编制的指令序列称为()。
算法设计与分析-王-第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
算法设计与分析(第2版) 郑宗汉 第1章-1
8
Байду номын сангаас
学习要求
深刻理解每一类算法的思想及其实现
能熟练运用所学知识解决实际问题
培养提高计算思维能力
9
考核方式
Homework and Reading: 20%
Final Exam (Written Test): 80%
10
第1章 算法的基本概念
1.1 引言
1.1.1 算法的定义和特性
c %3 0
(1.1.3)
16
1.1.2 算法的设计和复杂性分析
百鸡问题的穷举法
输入:所购买的3种鸡的总数目n 输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]
1. void chicken_question(int n, int &k, int g[], int m[], int s[]) 2. { 3. int a,b,c; 分析发现:只能买到n/5 4. k = 0; 只公鸡,n/3只母鸡,将 5. for (a = 0; a <= n; a++) { 算法进行改进。 6. for ( b = 0; b <= n; b++) { 7. for (c = 0; c <= n; c++) { 8. if ((a + b + c == n) && (5 * a + 3 * b + c / 3 == n) && (c%3 == 0)) { 9. g[k] = a; 10. m[k] = b; 11. s[k] = c; 12. k++; 13. } 14. } 15. } 16. } 17. }
《算法设计与分析》(全)
1.1、算法与程序
程序:是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)。 例如操作系统,是一个在无限循环中执行的程序, 因而不是一个算法。 操作系统的各种任务可看成是单独的问题,每一个 问题由操作系统中的一个子程序通过特定的算法来实 现。该子程序得到输出结果后便终止。
渐近分析记号的若干性质
(1)传递性: ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= O(g(n)), g(n)= O (h(n)) f(n)= O (h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= o(g(n)), g(n)= o(h(n)) f(n)= o(h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); (2)反身性: ➢ f(n)= (f(n));f(n)= O(f(n));f(n)= (f(n)). (3)对称性: ➢ f(n)= (g(n)) g(n)= (f(n)) . (4)互对称性: ➢ f(n)= O(g(n)) g(n)= (f(n)) ; ➢ f(n)= o(g(n)) g(n)= (f(n)) ;
巢湖学院计算机科学与技术系
渐近分析记号的若干性质
规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明: ➢ 对于任意f1(n) O(f(n)) ,存在正常数c1和自然数n1,使得对
所有n n1,有f1(n) c1f(n) 。 ➢ 类似地,对于任意g1(n) O(g(n)) ,存在正常数c2和自然数
巢湖学院计算机科学与技术系
第1章 算法引论
计算机算法设计与分析(第4版) 王晓东习题解答
第一章作业1.证明下列Ο、Ω和Θ的性质1)f=Ο(g)当且仅当g=Ω(f)证明:充分性。
若f=Ο(g),则必然存在常数c1>0和n0,使得∀n≥n0,有f≤c1*g(n)。
由于c1≠0,故g(n) ≥ 1/ c1 *f(n),故g=Ω(f)。
必要性。
同理,若g=Ω(f),则必然存在c2>0和n0,使得∀n≥n0,有g(n) ≥ c2 *f(n).由于c2≠0,故f(n) ≤ 1/ c2*f(n),故f=Ο(g)。
2)若f=Θ(g)则g=Θ(f)证明:若f=Θ(g),则必然存在常数c1>0,c2>0和n0,使得∀n≥n0,有c1*g(n) ≤f(n) ≤ c2*g(n)。
由于c1≠0,c2≠0,f(n) ≥c1*g(n)可得g(n) ≤ 1/c1*f(n),同时,f(n) ≤c2*g(n),有g(n) ≥ 1/c2*f(n),即1/c2*f(n) ≤g(n) ≤ 1/c1*f(n),故g=Θ(f)。
3)Ο(f+g)= Ο(max(f,g)),对于Ω和Θ同样成立。
证明:设F(n)= Ο(f+g),则存在c1>0,和n1,使得∀n≥n1,有F(n) ≤ c1 (f(n)+g(n))= c1 f(n) + c1g(n)≤ c1*max{f,g}+ c1*max{f,g}=2 c1*max{f,g}所以,F(n)=Ο(max(f,g)),即Ο(f+g)= Ο(max(f,g))对于Ω和Θ同理证明可以成立。
4)log(n!)= Θ(nlogn)证明:∙由于log(n!)=∑=n i i 1log ≤∑=ni n 1log =nlogn ,所以可得log(n!)= Ο(nlogn)。
∙由于对所有的偶数n 有,log(n!)= ∑=n i i 1log ≥∑=n n i i 2/log ≥∑=nn i n 2/2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。
当n ≥4,(nlogn)/2-n/2≥(nlogn)/4,故可得∀n ≥4,log(n!) ≥(nlogn)/4,即log(n!)= Ω(nlogn)。
大学_计算机算法设计与分析第4版(王晓东著)课后答案下载
计算机算法设计与分析第4版(王晓东著)课后答
案下载
计算机算法设计与分析第4版内容简介
第1章算法概述
1.1 算法与程序
1.2 算法复杂性分析
1.3 NP完全性理论
算法分析题1
算法实现题1
第2章递归与分治策略
2.1 递归的概念
2.2 分治法的基本思想
2.3 二分搜索技术
2.4 大整数的乘法
2.5 Strassen矩阵乘法
2.6 棋盘覆盖
2.7 合并排序
2.8 快速排序
2.9 线性时间选择
2.10 最接近点对问题
第3章动态规划
第4章贪心算法
第5章回溯法
第6章分支限界法
第7章随机化算法
第8章线性规划与网络流
附录A C++概要
参考文献
计算机算法设计与分析第4版目录
本书是普通高等教育“十一五”__规划教材和国家精品课程教材。
全书以算法设计策略为知识单元,系统介绍计算机算法的设计方法与分析技巧。
主要内容包括:算法概述、递归与分治策略、动态规划、贪心算法、回溯法、分支限界法、__化算法、线性规划与网络流等。
书中既涉及经典与实用算法及实例分析,又包括算法热点领域追踪。
为突出教材的`可读性和可用性,章首增加了学习要点提示,章末配有难易适度的算法分析题和算法实现题;配套出版了《计算机算法设计与分析习题解答(第2版)》;并免费提供电子课件和教学服务。
(陈慧南 第3版)算法设计与分析——第1章课后习题答案
第一章课后习题
姓名:赵文浩 学号:16111204082 班级:2016 级计算机科学与技术
1-4 证明等式 gcd(m,n)=gcd(n mod m, m) 对每对正整数 m 和 n,m>0 都成立。
1-13 写一个递归算法和一个迭代算法计算二项式系数:
#include<stdio.h> int Coef_recursive(int n,int m);//递归算法 int Coef_iteration(int n,int m);//迭代算法 int Factorial(int n);//计算 n 的阶乘 int main() { int n,m;
1-12 试用归纳法证明程序 1-7 的排列产生器算法的正确性。
证明:主函数中,程序调用 perm(a,0,n),实现排列产生器。 ① 当 n=1 时,即数组 a 中仅包含一个元素。函数内 k=0,与(n-1)=0 相等,因此函 数内仅执行 if(k==n-1)下的 for 语句块,且只执行一次。即将 a 数组中的一个元 素输出,实现了对一个元素的全排列。因此当 n=1 时,程序是显然正确的; ② 我们假设程序对于 n=k-1 仍能够满足条件, 将 k-1 个元素的全排列产生并输出; ③ 当 n=k 时,程序执行 else 下语句块的内容。首先执行 swap(a[0],a[0]),然后执 行 Perm(a,1,n),根据假设②可知,该语句能够产生以 a[0]为第一个元素,余下 (k-1)个元素的全排列; 然后再次执行 swap(a[0],a[0]), 并进行下一次循环。 此时 i=1, 即在本次循环中, 先执行 swap(a[0],a[1]), 将第二个元素与第一个元素互换, 下面执行 Perm(a,1,n), 根据假设②可知, 该语句产生以 a[1]为第一个元素, 余下(k-1)个元素的全排列; 以此类推,该循环每一次将各个元素调到首位,通过执行语句 Perm(a,1,n)以及 基于假设②,能够实现产生 k 个元素的全排列。 因此 n=k 时,程序仍满足条件。 ④ 综上所述,该排列器产生算法是正确的,证毕。
中科院计算机算法分析与设计_习题1-2_答案
2)证明:除结点v外,只有当结点w满足s[w]=0时才被压入栈中,因此每 个结点至多有一次被压入栈中,搜索不会出现重叠和死循环现象,对于每
template<class T> bool MinMax(T a[], int n, int& Min, int& Max) { if(n<1) return false; Min=Max=0; //初始化 for(int i=1; i<n; i++){ if(a[Min]>a[i]) Min=i; if(a[Max]<a[i]) Max=i; } return true; } 最好,最坏,平均比较次数都是 2*(n-1)
2-连通
割点
4 5
D E
4 5
(1,2,3,4,0,0,0) (1,1,1,4,1,0,0)
{(C,D)};
C
6
F
6
(1,1,1,4,1,6,0)
7
G
7
(1,1,1,4,1,5,5)
(E,A), {(G,E),(F,G), (E,F)} (B,C), (A,B) {(E,A),(B,C),(A,B)}
3.设G是具有n个顶点和m条边的无向图,如果G是连通的,而且满足m = n-1,
证明G是树。 4.假设用一个n×n的数组来描述一个有向图的n×n邻接矩阵,完成下面工作
:
1)编写一个函数以确定顶点的出度,函数的复杂性应为 2)编写一个函数以确定图中边的数目,函数的复杂性应为 3)编写一个函数删除边(i,j),并确定代码的复杂性。 5.实现图的D-搜索算法。要求用ALGEN语言写出算法的伪代码, 或者用一种计算机高级语言写出程序。 ; (n)
算法设计与分析王红梅第1章绪论
2021/6/12
}
15
清华大学出版社
算法设计与分析
⑷ 伪代码——算法语言
伪代码(Pseudocode):介于自然语言和 程序设计语言之间的方法,它采用某一程序 设计语言的基本语法,操作指令可以结合自 然语言来设计。
优点:表达能力强,抽象性强,容易理解
使用方法:7 ± 2
2021/6/12
16
清华大学出版社
欧几里德算法
1. r = m % n; 2. 循环直到 r 等于0
2.1 m = n; 2.2 n = r; 2.3 r = m % n; 3. 输出 n ;
2021/6/12
算法设计与分析
17
清华大学出版社
算法设计与分析
1.1.4 算法设计的一般过程
1.理解问题
2.预测所有可能的输入
3. 在精确解和近似解间做选择
算法设计与分析
1.1 算法的基本概念
1.1.1 为什么要学习算法 1.1.2 算法及其重要特性 1.1.3 算法的描述方法 1.1.4 算法设计的一般过程 1.1.5 重要的问题类型
2021/6/12
5
清华大学出版社
算法设计与分析
1.1.1 为什么要学习算法
理由1:算法——程序的灵魂
➢ 问题的求解过程:
14
清华大学出版社
算法设计与分析
#include <iostream.h>
int CommonFactor(int m, int n)
欧
{ int r=m % n;
几
while (r!=0)
里
{ m=n;
德
n=r;
算
r=m % n; }
计算机算法设计与分析(第5版)第1章
算法渐近复杂性
• T(n) , as n ; • (T(n) - t(n) )/ T(n) 0 ,as n; • t(n)是T(n)的渐近性态,为算法的渐近复杂性。 • 在数学上, t(n)是T(n)的渐近表达式,是T(n)略去低阶
问题求解(Problem Solving)
理解问题 精确解或近似解
选择数据结构 算法设计策略
设计算法 证明正确性
分析算法 设计程序
算法复杂性分析
• 算法复杂性 = 算法所需要的计算机资源 • 算法的时间复杂性T(n); • 算法的空间复杂性S(n)。 • 其中n是问题的规模(输入大小)。
算法的时间复杂性
项留下的主项。它比T(n) 简单。
渐近分析的记号
• 在下面的讨论中,对所有n,f(n) 0,g(n) 0。 • (1)渐近上界记号O • O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n n0有:
0 f(n) cg(n) } • (2)渐近下界记号 • (g(n)) = { f(n) | 存在正常数c和n0使得对所有n n0有:
• (1)最坏情况下的时间复杂性 • Tmax(n) = max{ T(I) | size(I)=n } • (2)最好情况下的时间复杂性 • Tmin(n) = min{ T(I) | size(I)=n } • (3)平均情况下的时间复杂性
• Tavg(n) = p(I )T (I ) size(I )n
•
for x > -1,
x ln(1 x) x 1 x
•
for any a > 0,
Hale Waihona Puke log b nlim
计算机算法设计与分析--第1章 算法概述
③确认算法。算法确认的目的是使人们确信这一算 法能够正确无误地工作,即该算法具有可计算性。 正确的算法用计算机算法语言描述,构成计算机程 序,计算机程序在计算机上运行,得到算法运算的 结果; ④ 分析算法。算法分析是对一个算法需要多少计算 时间和存储空间作定量的分析。分析算法可以预测 这一算法适合在什么样的环境中有效地运行,对解 决同一问题的不同算法的有效性作出比较; ⑤ 验证算法。用计算机语言描述的算法是否可计算、 有效合理,须对程序进行测试,测试程序的工作由 调试和作时空分布图组成。
16
算法描述
1. 从第一个元素开始,该元素可以认为已 经被排序 2. 取出下一个元素,在已经排序的元 素序列中从后向前扫描 3. 如果该元素(已排序)大于新元素, 将该元素移到下一位置 4. 重复步骤3,直到找到已排序的元素 小于或者等于新元素的位置 5. 将新元素插入到该位置中 6. 重复步骤2
15
1.3 算法示例—插入排序算法
算法的思想:扑克牌游戏
a0,...,n-1 a0,...,n-1 a0,...,n-1 a0,...,n-1 a0,...,n-1 a0,...,n-1 a0,...,n-1
= = = = = = =
5,2,4,6,1,3 5,2,4,6,1,3 2,5,4,6,1,3 2,4,5,6,1,3 2,4,5,6,1,3 1,2,4,5,6,3 1,2,3,4,5,6
8
算法≠程序
算法描述:自然语言,流程图,程序设计
语言,伪代码 用各种算法描述方法所描述的同一算法, 该算法的功用是一样的,允许在算法的描述 和实现方法上有所不同。
本书中采用类C++伪代码语言描述算法
9
人们的生产活动和日常生活离不开算法, 都在自觉不自觉地使用算法,例如人们到 商店购买物品,会首先确定购买哪些物品, 准备好所需的钱,然后确定到哪些商场选 购、怎样去商场、行走的路线,若物品的 质量好如何处理,对物品不满意又怎样处 理,购买物品后做什么等。以上购物的算 法是用自然语言描述的,也可以用其他描 述方法描述该算法。
算法设计与分析(第2版)-郑宗汉-第1章-1
2021/3/10
5
第1章 算法的基本概念
References
1973. 5. A. V. Aho, J. D. Ullman等. The Design and Analysis of Computer Algorithms.
Addison-Wesley, 1974. 6. A. V. Aho, J. D. Ullman等. Data Structures and Algorithms. Addison-Wesley,
1983.4. 7. S. Baase. Computer Algorithms: Introduction to Design and Analysis.
Addison-Wesley, second edition, 1988. 8. E. Horowitz and Sartaj Sahni. Fundamentals of Computer Algorithms.
2021/3/10
12
第1章 算法的基本概念 1.1.1 算法的定义和特性
最大公约数问题:求两个正整数m和n的最大公约数
设计:
确可定行性性::
输入: 输出: 第一步: 第二步:
2021/3/10
8
第1章 算法的基本概念
学习要求
深刻理解每一类算法的思想及其实现 能熟练运用所学知识解决实际问题 培养提高计算思维能力
2021/3/10
9
第1章 算法的基本概念
第一章如何用计算机解决问题-1
• 2、流程图:用一组标准的图形符号来描述算法。
开始
结束
开始/结束符,表示算法的开始或结束;
输入/输出框,用于指出数据的输入或输出;
处理框,用于指出要处理的内容;
判断框,用于指出分支情况,通常, 上面的顶点表示入口,其它顶点表示出口
流程线,表示流程控制方向。
流程图的优点:与自然语言相比,用流程图描述算法形象、直观,更容易理解。
初试身手,体验编程
菜 工 单 具 栏 栏
工程管理器
窗体设计器 窗体布局窗口 工 具 箱 属性窗口
代码窗口
• 认识代码窗口
选择对象 选择事件
输入代码
• 输入代码
• 3、保存文件
保存窗体
保存工程
本节小结 : 1)什么是算法? 解决问题的方法和步骤就是算法
本节小结 :
2)算法描述的方法有三种。 用自然语言来描述 用流程图来描述
初试身手,体验编程
前面讲到的这三种方法(自然语言、流程图、伪代码)只是能够描述 算法,但计算机无法直接识别这些描述。 对于用计算机解决问题而言,描述不是目的,最终还是需要编写程序 代码,实现算法设计,将方法转换为计算机能够识别的语言,这就需 要编程 • 用于书写计算机程序的语言称为程序设计语言。如vb、c、c++、 pascal等
例题
• 1、①S=1 ②S的值加1 ③重复步骤②
解答:该算法的步骤②将被重复执行无数次,不符合 2、 ①L=10 ②输出L/自然数
解答:自然数未指明是哪个数,不符合算法的
确定性
有穷性
的特征
的特征
• 3、 ①R=2 ②S=3.14*R*R ③输出面积S 说明:该算法中在执行时已包含计算机所需的初始数据,不必另外提供数据 ,因此没有输入,即有 0个输入 4、 ①输入圆的半径R ②S=3.14*R*R ③输出面积S 说明:该算法中计算面积所需的初始数据半径R待定,需要在算法执行时,从 键盘 多个输入
计算机算法设计与分析(第4版) 王晓东习题解答
第一章作业1.证明下列Ο、Ω和Θ的性质1)f=Ο(g)当且仅当g=Ω(f)证明:充分性。
若f=Ο(g),则必然存在常数c1>0和n0,使得∀n≥n0,有f≤c1*g(n)。
由于c1≠0,故g(n) ≥ 1/ c1 *f(n),故g=Ω(f)。
必要性。
同理,若g=Ω(f),则必然存在c2>0和n0,使得∀n≥n0,有g(n) ≥ c2 *f(n).由于c2≠0,故f(n) ≤ 1/ c2*f(n),故f=Ο(g)。
2)若f=Θ(g)则g=Θ(f)证明:若f=Θ(g),则必然存在常数c1>0,c2>0和n0,使得∀n≥n0,有c1*g(n) ≤f(n) ≤ c2*g(n)。
由于c1≠0,c2≠0,f(n) ≥c1*g(n)可得g(n) ≤ 1/c1*f(n),同时,f(n) ≤c2*g(n),有g(n) ≥ 1/c2*f(n),即1/c2*f(n) ≤g(n) ≤ 1/c1*f(n),故g=Θ(f)。
3)Ο(f+g)= Ο(max(f,g)),对于Ω和Θ同样成立。
证明:设F(n)= Ο(f+g),则存在c1>0,和n1,使得∀n≥n1,有F(n) ≤ c1 (f(n)+g(n))= c1 f(n) + c1g(n)≤ c1*max{f,g}+ c1*max{f,g}=2 c1*max{f,g}所以,F(n)=Ο(max(f,g)),即Ο(f+g)= Ο(max(f,g))对于Ω和Θ同理证明可以成立。
4)log(n!)= Θ(nlogn)证明:∙由于log(n!)=∑=n i i 1log ≤∑=ni n 1log =nlogn ,所以可得log(n!)= Ο(nlogn)。
∙由于对所有的偶数n 有,log(n!)= ∑=n i i 1log ≥∑=n n i i 2/log ≥∑=nn i n 2/2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。
当n ≥4,(nlogn)/2-n/2≥(nlogn)/4,故可得∀n ≥4,log(n!) ≥(nlogn)/4,即log(n!)= Ω(nlogn)。
算法设计与分析做课程设计选题
算法设计与分析做课程设计选题一、课程目标知识目标:1. 理解算法设计的基本概念,掌握常见的算法设计方法;2. 了解算法分析的基本原则,掌握时间复杂度和空间复杂度的分析方法;3. 掌握至少两种算法设计选题,并能够运用所学知识对其进行分析和优化。
技能目标:1. 能够运用所学算法设计方法,独立完成中等难度的算法设计题目;2. 能够分析给定算法的时间复杂度和空间复杂度,并提出优化方案;3. 能够运用所学的算法知识,解决实际生活中的问题,提高问题解决能力。
情感态度价值观目标:1. 培养学生对算法设计和分析的热爱,激发学习兴趣;2. 培养学生的逻辑思维能力,提高分析问题和解决问题的能力;3. 培养学生的团队协作精神,学会在团队中共同探讨和解决问题;4. 培养学生具备良好的编程习惯,遵循学术道德,尊重他人成果。
课程性质:本课程为信息技术学科选修课程,旨在提高学生的算法设计和分析能力。
学生特点:学生具备一定的编程基础,对算法有一定了解,但对算法设计和分析的系统学习尚有不足。
教学要求:结合学生特点,注重理论与实践相结合,通过案例分析、讨论和实践操作,使学生掌握算法设计与分析的方法,提高实际应用能力。
将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 算法设计基本概念:介绍算法的定义、特性及分类,结合教材相关章节,让学生了解算法设计的基本框架。
- 教材章节:第一章 算法概述2. 算法设计方法:讲解常见的算法设计方法,如递归、分治、动态规划、贪心等,并通过实例分析,使学生掌握这些方法在实际问题中的应用。
- 教材章节:第二章 算法设计方法3. 算法分析:阐述时间复杂度和空间复杂度的概念,介绍分析方法,如迭代法、主定理等,结合实际案例,让学生学会评估算法性能。
- 教材章节:第三章 算法分析4. 算法设计选题:选取中等难度的算法设计题目,涵盖排序、查找、图论等领域,指导学生进行实际操作,提高问题解决能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3)i=1; j=0; while(i+j<=n) { if (i>j) j++; else i++; } 分析: 通过分析以上程序段,可将i+j看成一个控制循环次数 的变量,且每执行一次循环,i+j的值加1。该程序段的主 要时间消耗是while循环,而while循环共做了n次,所以该 程序段的执行时间为: T(n)=O(n)
7.void cmatrix(int a[M][N], int d) //M和N 为全局整型常量 { for(int i=0; i<M; i++) for(int j=0; j<N; j++) a[i][j]*=d; }
8.void matrimult(int a[M][N], int b[N][L], int c[M][L]) //M、N和L均为全局整型常量 { int i,j,k; for(i=0;i<M;i++) for(j=0;j<L;j++) c[i][j]=0; for(i=0;i<M;i++) for(j=0;j<L;j++) for(k=0;k<N;k++) c[i][j]+=a[i][k]*b[k][j]; }
(4)x=n; // n>1 while (x>=(y+1)*(y+1)) y++; 分析: 由x=n且x的值在程序中不变,又while的循环 条件(x>=(y+1)*(y+1))可知:当(y+1)*(y+1)刚超过 n的值时退出循环。 由(y+1)*(y+1)<n得:y<n0.5 所以,该程序段的执行时间为: 向下取整(n0.5)
(2)i=0; k=0; do{ k=k+10*i; i++; } while(i<n); 分析: i=0; //1 k=0; //1 do{ //n k=k+10*i; //n i++; //n } while(i<n);//n 由以上列出的各语句的频度,可得该程序段的时间消耗: T(n)=1+1+n+n+n+n=4n+2 可表示为T(n)=O(n)
6.void find(int a[M][N], int m, int n, int& Lin, int& Col) //M和N为全局常量, 应满足M>=n和N>=n的条件, Lin和Col为 //引用形参, 它是对应实参的别名, 其值由实参带回 { Lin=0;Col=0; for(int i=0;i<m;i++) for(int j=0;j<n;j++) if(a[i][j]>a[Lin][Col]) {Lin=i;Col=j;} } 时间复杂度为值。
5.假定一维整型数组a[n]中的每个元素值均在[0,200]区间内, 分别统计出落在[0,20],[20,50],[50,80], [80,130],[130,200]等各区间内的元素个数。 6.从二维整型数组a[m][n]中查找出最大元素所在的行、列下标。
参考答案
5.void UseFile(ifstream& inp, int c[10]) //假定inp所对应的文件中保存有n个整数 { for(int i=0; i<10; i++) c[i]=0; int x; while(inp>>x){ i=x%10; c[i]++; } }
6.void mtable(int n) { for(int i=1; i<=n; i++){ for(int j=i; j<=n; j++) cout<<i<<"*"<<j<<"="<<setw(2)<<i*j<<" "; cout<<endl; } }
(6)设有两个算法在同一机器上运行,其执行时 间分别为100n2和2n,要使前者快于后者,n至少要 多大? 分析: 要使前者快于后者,即前者的时间消耗低于 后者,即: 100n2<2n 求解上式,可得 答: n=15
(7)按增长率由小至大的顺序排列下列各函数:
第二部分
指出下列各算法的功能并求出其时间复杂度
1.int Prime(int n) { int i=2; int x=(int)sqrt(n); while(i<=x){ if(n%i==0) break; i++; } if(i>x) return 1; else return 0; }
2.int sum1(int n) { int p=1, s=0; for(int i=1; i<=n; i++){ p*=i; s+=p; } return s; }
1.char Compare(SimpleType x1, SimpleType x2) { if(x1>x2) return '>'; else if(x1==x2) return '='; else return '<'; } 时间复杂度为O(1)。
2.void Reverse(char* p) { int n=strlen(p); for(int i=0;i<n/2;i++){ char ch; ch=p[i]; p[i]=p[n-i-1]; p[n-i-1]=ch; } } 时间复杂度为O(n)。
//用数组c[5]保存统计结果 5.int Count(int a[], int n, int c[5]) { int d[5]={20,50,80,130,201}; //用来保存各统计区间的上限 int i,j; for(i=0;i<5;i++) c[i]=0; //给数组c[5]中的每个元素赋初值0 for(i=0;i<n;i++) { if(a[i]<0 || a[i]>200) return 0; //返回数值0表示数组中数据有错,统计失 败 for(j=0;j<5;j++) //查找a[i]所在的区间 if(a[i]<d[j]) break; c[j]++; //使统计相应区间的元素增1 } return 1; //返回数值1表示统计成功 } 时间复杂度为O(n)。
(5)x=91; y=100; while(y>0) if(x>100) {x=x-10;y--;} else x++; 分析: x=91; //1 y=100; //1 while(y>0) //1101 if(x>100) //1100 { x=x-10; //100 y--; //100 } else x++; //1000 以上程序段右侧列出了执行次数。该程序段的执行时 间为: T(n)=O(1)
第一章
练 习
第一部分: 求下列程序段的时间复杂度
(1) i=1; k=0; while(i<n) { k=k+10*i;i++; } 分析: i=1; //1 k=0; //1 while(i<n) //n { k=k+10*i; //n-1 i++; //n-1 } 由以上列出的各语句的频度,可得该程序段的时间消耗: T(n)=1+1+n+(n-1)+(n-1)=3n 可表示为T(n)=O(n)
3.int sum2(int n) { int s=0; for(int i=1; i<=n; i++){ int p=1; for(int j=1; j<=i; j++) p*=j; s+=p; } return s; }
4.int fun(int n) { int i=1,s=1; while(s<n) s+=++i; return i; }
第三部分
用C++函数描述算法并求出其时间复杂度
1.比较同一简单类型的两个数据x1和x2的大小,对于x1>x2, x1==x2和x1<x2这3种不同情况应分别返回“>”,“=”和“<”字符。 假定简单类型用SimpleType表示。 2.将一个字符串中的所有字符按相反的次序重新放置。 3.求一维double型数组a[n]中的所有元素之乘积。 4.计算
3.double Product(double a[], int n) { double p=1; for(int i=0; i<n; i++) p*=a[i]; return p; } 时间复杂度为O(n)。
4.double Accumulate(double x,int n) { double p=1,s=1; for(int i=1; i<=n; i++){ p*=x; s+=p/(i+1); } return s; } 时间复杂度为O(n)。