算法设计与分析(第二版) 第1章

合集下载

《算法设计与分析》第01章

《算法设计与分析》第01章

第38页
安师大数学计算机科学学院
2014年6月28日星期六
1.4.3 归纳证明
定理1-1 对于n≥0,程序1-5是正确的。 证明:(归纳法证明) 当n是1位数时,程序显然是正确的。 假定函数PrintDigit对所有位数小于k(k>1)的正 整数都能正确运行,当 n 的位数为 k 位时,此时有 n≥10 ,算法必定先执行语句 cout<<n%10; 然后执 行语句if(n>10) PrintDigit(n/10);。
第31页
安师大数学计算机科学学院
2014年6月28日星期六
可以用所谓的递归树(recursive tree)来描述程 序1-4的函数Fib执行时的调用关系。
图1-2 计算Fib(4)的递归树
第32页
安师大数学计算机科学学院
2014年6月28日星期六
递归数据结构 使用递归方式定义的数据结构称为递归数据结构 (recursive data structure)。
第10页
Begin
Rm%n
Y
r=0? N
Swap(m.n)
End
安师大数学计算机科学学院
2014年6月28日星期六
假设 m=21 和 n=45,求21和45的最大公因子
第一步:r=m%n=21%45=21; 第二步:r 不等于0,转入第三步; 第三步:互换,m=n=45, n=r=21,返回第一步。 第一步:r=m%n=45%21=3; 第二步:r 不等于0,转入第三步; 第三步:互换,m=n=21 , n=r=3,返回第一步。 第一步:r=m%n=21%3=0; 第二步:r 等于0,算法结束,3即为21和45的最大公因子。
2014年6月28日星期六

算法分析与设计 第1章习题答案 1-1,1-2,1-3,1-6

算法分析与设计 第1章习题答案 1-1,1-2,1-3,1-6

第一章习题(1-1,1-2,1-3,1-6)1-1 求下列函数的渐进表达式3n2+10n = O(n2)n2/10+2n = O(2n)21+1/n = O(1)logn3 = O(logn)10log3n = O(n)知识点:如果存在正的常数C和自然数N0,使得:当N>=N0时有f(N)<=Cg(N),则称f(N)当N充分大时上有界,且g(N)是它的一个上界,记为f(N)=O(g(N)).这时,可以说f(N)的阶不高于g(N)的阶。

1-2 论O(1)和O(2)的区别O(1)和O(2)差别仅在于其中的常数因子,根据渐进上界记号O的定义可知,O(1)=O(2)。

1-3 从低到高排列以下表达式(按渐进阶排列以下表达式)结果:2 logn n2/320n 4n23n n! 分析:当n>=1时,有logn< n2/3当n>=7时,有3n < n!补充:当n>=4时,有logn> n1/31-6 对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=Θ(g(n))。

知识点:f(n)的阶不高于g(n)的阶:f(n)=O(g(n));f(n)的阶不低于g(n)的阶:f(n)=Ω(g(n));f(n)与g(n) 同阶:f(n)=Θ(g(n)) (1)f(n)= logn2 ; g(n)= logn+5f(n)与g(n)同阶,故f(n)=Θ(g(n)) (2) f(n)= logn2 ; g(n)= n1/2当n>=8时,f(n)<=g(n),故f(n)=O(g(n))分析:此类题目不易直接看出阶的高低,可用几个数字代入观察结果。

如依次用n=1, 21, 22, 23, 26, 28, 210 (3) f(n)= n ; g(n)= log2nf(n)=Ω(g(n))(4) f(n)= nlogn+n; g(n)= lognf(n)=Ω(g(n))(5) f(n)= 10 ; g(n)= log10f(n)=Θ(g(n))(6) f(n)= log2n ; g(n)= lognf(n)=Ω(g(n))(7) f(n)= 2n ; g(n)= 100 n2f(n)=Ω(g(n))(8) f(n)= 2n ; g(n)= 3nf(n)=O(g(n))。

算法算法设计与分析课件(第2版)

算法算法设计与分析课件(第2版)


例2 sum=0; (一次) for(i=1;i<=n;i++) (n次 ) for(j=1;j<=n;j++) (n^2次 ) sum++; (n^2次 ) 解:T(n)=2n^2+n+1 =O(n^2)

例3 a=0;b=1; ① for (i=1;i<=n;i++) ② { s=a+b; ③ b=a; ④ a=s; ⑤ } 解: 语句1的频度:2, 语句2的频度: n, 语句3的频度: n-1, 语句4的频度:n-1, 语句5的频度:n-1, T(n)=2+n+3(n-1)=4n-1=O(n).

例4 i=1; ① while (i<=n) i=i*2; ②
解: 语句1的频度是1, 设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n 取最大值f(n)= log2n, T(n)=O(log2n )



例5: for(i=0;i<n;i++) { for(j=0;j<i;j++) { for(k=0;k<j;k++) x=x+2; } } 解:当i=m时, j 可以取 0,1,...,m-1 , 所以这里 最内循环共进行了0+1+...+m-1=(m-1)m/2 次所以,i从0取到n, 则循环共进行了: 0+(11)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6所以 时间复杂度为O(n^3).

求解如下几个算法的复杂度 例1 Temp=i;i=j;j=temp; 以上三条单个语句的频度均为1,该程序段 的执行时间是一个与问题规模n无关的常数。 算法的时间复杂度为常数阶,记作 T(n)=O(1)。如果算法的执行时 间不随着 问题规模n的增加而增长,即使算法中有上 千条语句,其执行时间也不过是一个较大 的常数。此类算法的时间复杂度是O(1)。

算法设计与分析:第1章 算法分析基础

算法设计与分析:第1章 算法分析基础

算法测试
B 291Dprogram testingE
– ( ; – 2984&29F<*-/#
5D7 1?Ftest caseEF>, 29 < F 293;F@29: %0.'!
C +$DdebugE
– (A6=; –
) ;F
9)+*[,1'-FD!V6: 9)+*= #(!)
– =O!S UN#Q [ " 66Q 59
B59[MI!)59X6 Q596
!3[489+*
!3[ >G(
!3X
算法的执行时间绝大部分花在循环 和递归上
• B61( ,*=
#!7 @H
• 42 7&1
– -3%9 !#."; ,
– )
< +:!#;42>$7 &1>* +:7 &1
• ')(/
– % 0=')8(/ 6(/
1.3.3 算法复杂度
时间复杂度( time complexity )
• • #
课程介绍
n )*
– #/) –
!.3(- 31:
n )*$,
6&"%9 – 57"%20(+ – 57"9'
n4
— 8
主要内容
1. 算法的基本概念和常见符号 2. 算法设计的常用技术
• 递归法、蛮力法、分治法、减治法 • 贪心法、动态规划、回溯法、分支限界法 • 概率算法、近似算法、计算复杂性理论 3. 算法的评价:复杂度分析
引言
1.1 算法概述

算法设计与分析 王红梅 第二版 第1章 算法设计基础复习进程

算法设计与分析 王红梅 第二版 第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章 算法设计与分析

第1章 算法设计与分析

问题
• 那个排序算法效率最高? • 是否可以找到更好的算法?排序问题的计算难度如何估计?
例3 货郎问题
货郎问题:
• 有穷个城市的集合C = { c1, c2, …, cm}, 距离 d(ci, cj) = d(cj, ci)Z+, 1 i < j m • 求 1, 2 …, m 的排列 k1, k2, …, km使得
A(n) IS t I pI
A( n) i
i 1 n
p p( n 1) (1 p)n (1 p)n n 2
1.3.1 什么是好的算法
好的算法 一个好的算法应具有以下4个重要特性: 1.正确性(correctness):算法的执行结果应 当满足预先规定的功能和性能要求。 2.简明性(simplicity):算法应思路清晰、层 次分明、容易理解、利于编码和调试。 3.效率(efficiency):算法应有效使用存储空 间,并具有高的时间效率。 4.最优性(optimality):算法的执行时间已达 到求解该类问题所需时间的下界。
• 一个程序步(program step)是指在语法上或语 义上有意义的程序段,该程序段的执行时间必须 与问题实例的规模无关。
【程序2-1】 求数组元素累加之和的迭代程序 float Sum(float list[], const int n) { float tempsum=0.0; count ++; //针对赋值语句 for (int i=0; i<n; i++ ){ count ++; //针对for循环语句 tempsum+ =list[i]; count ++; //针对赋值语句 } count ++; //针对for的最后一次执行 count ++; //针对return语句 return tempsum; }

算法设计与分析-王-第1章-算法设计基础

算法设计与分析-王-第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

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

(7) 复合数据可以组织成由属性或域组成的对象。通过 域名后跟方括号括住的对象名访问某个特定域。
(8) 通过传值将参数传给一个过程。被调用的过程接收 参数的一个复制,如果它对某个参数赋值,则调用过程是看 不到这种变化的。当传递一个对象时,只是拷贝指向对象的 数据的指针,不拷贝它的各个域。
(9) “and”和“or”是布尔运算符。当对表达式“x and y” 求值时,首先计算x的值,如果其值为FALSE,则整个表达 式的值为FALSE,无需再计算y的值;如果x的值为TRUE, 则必须计算y的值,这样才能决定整个表达式的值。类似地, 当对表达式“x or y”求值时,仅当x的值为FALSE时,才需 计算表达式y的值。
·终止:当i>length[A],即i = length[A] +1时,外 层for循环结束。在外循环不变式中,用length[A]+1代替i, 可得子数组A[1..length[A]]。由循环不变式得,子数组 有序,而这个子数组就是整个数组。因此,整个数组有序, 这表明冒泡排序算法是正确的。
1.1.3 伪代码使用约定 在本书的伪代码(pseudocode)中使用以下约定: (1) 缩进形式表示块结构。 (2) while、do-while、for循环结构(语句)以及if-then-else
迭代,在A[i]位置产生当前元素比较范围A[i..n]内的一
个最小值。下标i从数组第一个元素开始,从左向右移动,
直至数组中的最后一个元素。深色阴影部分表示数组元素A
[1..i]构成的已排好的序列,浅色阴影部分表Байду номын сангаас外层循环
开始时的下标i。数组元素A[i+1..n]表示当前正在处理的
序列。
图1-1 冒泡排序工作过程
(10) break语句表示将控制转移到含有break的最内层循 环语句后面的第一条语句。循环语句可以是约定(2)中所列 的那些循环语句。
1.2 算 法 分 析
1.2.1 冒泡排序算法分析 BUBBLE-SORT过程的时间开销与输入有关:1000个元
用性质,这个性质可以用于证明算法的正确性。
下面,我们考察这些性质是如何对冒泡排序成立的。首 先证明内层for循环的不变式。
·循环不变式:A[j]是A[j..length[A]]中的最小元 素。
·初始:在内循环第一次开始迭代之前,j = length [A],因此,子数组A[length[A]..length[A]] 中只 包含一个元素,也即子数组中的最小元素,此时,循环不变 式成立。
·维持:假定在内循环的某次迭代之前循环不变式为真, 即A[j]是A[j..length[A]]中的最小元素。在下一次迭 代之前,若元素A[j]<A[j-1],则执行冒泡算法中的第 4行语句,A[j]与A[j-1] 交换,于是A[j-1]是A[j -1..length[A]]中的最小元素;若A[j]≥A[j-1] ,那么不执行第4行语句,A[j-1]仍然是A[j-1..length [A]]中的最小元素。无论哪一种情况,都能使循环不变 式为真。
条件结构(语句)分别采用类似于高级语言中的相应表示。 (3) 符号“∥”的后面是注释部分。 (4) 多重赋值i←j←e是将表达式e的值赋给变量i和变量j,
这种赋值与i←e和j←e等价。 (5) 变量如i、j和key是给定过程的局部变量。不经显式
说明,不使用全局变量。 (6) 通过数组名后跟索引访问数组元素。
1 for i 1 to length[A]
2
do for j length[A] downto i + 1
3
do if A[j] < A[j – 1]
4
then exchange A[j] A[j – 1]
图1-1说明了输入实例为A =〈5,2,4,6,1,3〉时,
算法BUBBLE-SORT的工作过程。对于外层for循环的每一次
·终止:对于冒泡排序,当j<i+1,即j=i时,内层for循 环结束。在内循环不变式中,用i代替j,可得子数组A [i..length[A]],其中A[i]是最小元素。
其次,证明外层for循环的不变式。 ·循环不变式:在1~4行外层for循环的每次迭代开始时, 子数组A[1..i-1]中的元素有序。 ·初始:在外层for循环的第一次迭代之前,i=1,因此, A[1..0]为空,循环不变式成立。 ·维持:假定在外循环的某次迭代之前循环不变式为真, 即子数组A[1..i-1]中的元素有序。在下一次迭代之前, 由内循环的不变式可得A[i-1]≤A[i]成立,因此,子数 组A[1..i]中的元素有序。
1.1.2 循环不变式和冒泡排序算法的正确性 我们可以利用循环不变式证明算法的正确性。循环不变
式具有以下三个性质: ·初始(initialization):在循环的第一次迭代之前,循环
不变式为真。 ·维持(maintenance):如果在循环的某次迭代之前循环
不变式为真,那么在下一次迭代之前,循环不变式仍然为真。 ·终止(termination):当循环终止时,循环不变式给出有
1.1.1 冒泡排序 冒泡排序(bubble sort)属于基于交换思想的排序方法。
它将相邻的两个元素加以比较,若左边元素值大于右边元素 值,则将这两个元素交换;若左边元素值小于等于右边元素 值,则这两个元素位置不变。右边元素继续和下一个元素进 行比较,重复这个过程,直到比较到最后一个元素为止。
冒泡排序的伪代码用过程BUBBLE-SORT表示,其参数 为包含n个待排序数的数组A[1..n]。当过程BUBBLESORT结束时,数组A中包含已排序的序列。
第1章 算法基础
1.1 算法 1.2 算法分析 1.3 算法的运行时间 习题
1.1 算 法
算法(algorithm)可以被定义为一个良定的计算过程,它 具有一个或者若干输入值,并产生一个或者若干输出值。因 此,算法是由将输入转换成输出的计算步骤所组成的序列。
也可将算法看做是解决良定计算问题的工具。人们采用 一般术语陈述问题,确定输入/输出关系,而算法则是描述 这种输入/输出关系的特定计算过程。
相关文档
最新文档