计算机算法设计与分析第1章算法概述
合集下载
《算法设计与分析》第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章 算法分析基础
算法测试
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 算法概述
算法设计与分析(第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. }
大学_计算机算法设计与分析第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版)》;并免费提供电子课件和教学服务。
计算机算法设计与分析(第5版)第1章
• 其中I是问题的规模为n的实例,p(I)是实 例I出现的概率。
算法渐近复杂性
• 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
算法渐近复杂性
• 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章
例1 f(n) = 2n + 3 = O(n) 当n≥3时,2n+3≤3n,所以,可选c = 3,n0 = 3。对于n≥n0,f(n) = 2n + 3≤3n,所以,f(n) = O(n),即2n + 3O(n)。这意味着,当n≥3 时,例1的程序步不会超过3n,2n + 3 = O(n)。
例2 f(n) = 10n2 + 4n + 2 = O(n2) 对于n≥2时,有10n2 + 4n + 2≤10n2 + 5n,并 且当n≥5时,5n≤n2,因此,可选c = 11, n0 = 5;对于n≥n0,f(n) = 10n2 + 4n + 2≤11n2,所 以f(n) = O(n2)。
算法设计与分析
湖南人文科技学院计算机系 授课:肖敏雷
邮箱:minlei_xiao@
关于本课程
课程目的:计算机算法设计与分析导引
不是一门试验或程序设计课程 也不是一门数学课程
教材:计算机算法设计与分析-王晓东 前导课:数据结构+程序设计 参考资料:
算法设计与分析—C++语言描述 陈慧南编 电子工业出版社 计算机算法基础(第三版) 余祥宣 华中科技大学
渐近时间复杂度 使用大O记号及下面定义的几种渐近表示法 表示的算法时间复杂度,称为算法的渐近时间复 杂度(asymptotic complexity)。 只要适当选择关键操作,算法的渐近时间复 杂度可以由关键操作的执行次数之和来计算。一 般地,关键操作的执行次数与问题的规模有关, 是n的函数。 关键操作通常是位于算法最内层循环的语句。
当 n≥n0 时 , 有 f(n)≥cg(n) , 则 记 做 f(n)=Ω
计算机算法设计与分析--第1章 算法概述
12
③确认算法。算法确认的目的是使人们确信这一算 法能够正确无误地工作,即该算法具有可计算性。 正确的算法用计算机算法语言描述,构成计算机程 序,计算机程序在计算机上运行,得到算法运算的 结果; ④ 分析算法。算法分析是对一个算法需要多少计算 时间和存储空间作定量的分析。分析算法可以预测 这一算法适合在什么样的环境中有效地运行,对解 决同一问题的不同算法的有效性作出比较; ⑤ 验证算法。用计算机语言描述的算法是否可计算、 有效合理,须对程序进行测试,测试程序的工作由 调试和作时空分布图组成。
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
人们的生产活动和日常生活离不开算法, 都在自觉不自觉地使用算法,例如人们到 商店购买物品,会首先确定购买哪些物品, 准备好所需的钱,然后确定到哪些商场选 购、怎样去商场、行走的路线,若物品的 质量好如何处理,对物品不满意又怎样处 理,购买物品后做什么等。以上购物的算 法是用自然语言描述的,也可以用其他描 述方法描述该算法。
③确认算法。算法确认的目的是使人们确信这一算 法能够正确无误地工作,即该算法具有可计算性。 正确的算法用计算机算法语言描述,构成计算机程 序,计算机程序在计算机上运行,得到算法运算的 结果; ④ 分析算法。算法分析是对一个算法需要多少计算 时间和存储空间作定量的分析。分析算法可以预测 这一算法适合在什么样的环境中有效地运行,对解 决同一问题的不同算法的有效性作出比较; ⑤ 验证算法。用计算机语言描述的算法是否可计算、 有效合理,须对程序进行测试,测试程序的工作由 调试和作时空分布图组成。
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
参考书:算法导论(原书第3版) ,Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, lifford Stein, 殷建平 等译, 机械工业出版社, 第1版,2013年7月
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章 算法的基本概念
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章 算法的基本概念
计算机算法设计与分析(第3版)王晓东 第1章
??i?????111211nnni??i???1121nnni221?21?21?121?1?1?27432765432126547654321maxnoccccncccccccncccncnncnncnncncncncnt????????????????????????????????????????????????对于输入数据ainii01
• 程序可以不满足算法的性质(4)。
• 例如操作系统,是一个在无限循环中执行的程序,因
而不是一个算法。 • 操作系统的各种任务可看成是单独的问题,每一个问 题由操作系统中的一个子程序通过特定的算法来实现。 该子程序得到输出结果后便终止。
问题求解(Problem Solving)
理解问题 精确解或近似解 选择数据结构 算法设计策略 设计算法 证明正确性 分析算法 设计程序
>0使得对所有n n0有:0 cg(n) < f(n) }
• 等价于 f(n) / g(n) ,as n。 • f(n) (g(n)) g(n) o (f(n))
• (5)紧渐近界记号
• (g(n)) = { f(n) | 存在正常数c1,c2和n0使得对所有n n0
• (3.1) return语句: • return expression;
x lim 1 e x n n
n
• (5)对数函数 • log n = log2n;
•
• • • •
lg n = log10n;
ln n = logen; logkn = (log n)kl; log log n = log(log n); for a>0,b>0,c>0
• (3)平均情况下的时间复杂性 • Tavg(n) =
• 程序可以不满足算法的性质(4)。
• 例如操作系统,是一个在无限循环中执行的程序,因
而不是一个算法。 • 操作系统的各种任务可看成是单独的问题,每一个问 题由操作系统中的一个子程序通过特定的算法来实现。 该子程序得到输出结果后便终止。
问题求解(Problem Solving)
理解问题 精确解或近似解 选择数据结构 算法设计策略 设计算法 证明正确性 分析算法 设计程序
>0使得对所有n n0有:0 cg(n) < f(n) }
• 等价于 f(n) / g(n) ,as n。 • f(n) (g(n)) g(n) o (f(n))
• (5)紧渐近界记号
• (g(n)) = { f(n) | 存在正常数c1,c2和n0使得对所有n n0
• (3.1) return语句: • return expression;
x lim 1 e x n n
n
• (5)对数函数 • log n = log2n;
•
• • • •
lg n = log10n;
ln n = logen; logkn = (log n)kl; log log n = log(log n); for a>0,b>0,c>0
• (3)平均情况下的时间复杂性 • Tavg(n) =
(算法分析设计)第一章:算法概述
对于给定的N、I和A,如何导出时间复杂度T=T(N ,I)和空间复杂度S=S(N,I)?
T(N,I)表示算法在一台抽象的计算机上运行需 要的时间。设此抽象计算机的元运算有k种,分别 记为O1,O2,…,OK。每执行一次这些运算所需要的 时间分别为t1,t2,..,tk.设算法用到元运算Oi的次数为 ei(是N和I的函数),则 k
算法实现
设计出复杂性尽 可能低的算法
算法复杂性分析
算法复杂性分析的依赖因素
要解问题的规模——用N表示 算法的输入——用I表示 算法自身——用A表示
C=F(N,I,A)
——C:算法复杂性
时间复杂性函数的具体化?
一个算法的时间复杂度(time complexity)是指算 法运行所需的时间。
培养独立科研能力
初步了解科研工作中解决问题的一般规程。 培养分析问题解决问题的能力。
培养团队合作能力
通过团队完成作业来培养大家的团队合作能力。
为什么要学习算法?
算法不仅是计算机科学的一个分支,它更是计 算机科学的核心,而且,可以毫不夸张地说, 它和绝大多数的科学、商业和技术都是相关 的。——David Harel《算法:计算的灵魂》
n 以上三种情况的复杂性从不同角度来反映算法的效率,各有 其局限性和用处,但操作性最好且最具有实用价值的是最坏 情况下的时间复杂性。
n 如果无特别说明,T(N)=Tmax(N)
算法的效率分析:实例1
问题:已知不重复且已经按从小到大排好的m个整数的数组
A[m],对于给定的整数c,要求寻找一个下标i,使得A[i]=c,
随机算法 数值概率算法 舍伍德算法 拉斯维加斯算法 蒙特卡罗算法
两个基本概念
算法 算法复杂性
算法与程序
T(N,I)表示算法在一台抽象的计算机上运行需 要的时间。设此抽象计算机的元运算有k种,分别 记为O1,O2,…,OK。每执行一次这些运算所需要的 时间分别为t1,t2,..,tk.设算法用到元运算Oi的次数为 ei(是N和I的函数),则 k
算法实现
设计出复杂性尽 可能低的算法
算法复杂性分析
算法复杂性分析的依赖因素
要解问题的规模——用N表示 算法的输入——用I表示 算法自身——用A表示
C=F(N,I,A)
——C:算法复杂性
时间复杂性函数的具体化?
一个算法的时间复杂度(time complexity)是指算 法运行所需的时间。
培养独立科研能力
初步了解科研工作中解决问题的一般规程。 培养分析问题解决问题的能力。
培养团队合作能力
通过团队完成作业来培养大家的团队合作能力。
为什么要学习算法?
算法不仅是计算机科学的一个分支,它更是计 算机科学的核心,而且,可以毫不夸张地说, 它和绝大多数的科学、商业和技术都是相关 的。——David Harel《算法:计算的灵魂》
n 以上三种情况的复杂性从不同角度来反映算法的效率,各有 其局限性和用处,但操作性最好且最具有实用价值的是最坏 情况下的时间复杂性。
n 如果无特别说明,T(N)=Tmax(N)
算法的效率分析:实例1
问题:已知不重复且已经按从小到大排好的m个整数的数组
A[m],对于给定的整数c,要求寻找一个下标i,使得A[i]=c,
随机算法 数值概率算法 舍伍德算法 拉斯维加斯算法 蒙特卡罗算法
两个基本概念
算法 算法复杂性
算法与程序
算法设计与分析第一章算法概述
1)结构化方法——“自顶向下, 逐步求精” 结构化方法总的指导思想是自顶向下、逐步求精。它的基本原则是功能的分解与模块化
所谓“自顶向下” 是将现实世界的问题经抽象转化为逻辑空间或求解空间的问题。是将复杂且大的 问题划分为较小问题,找出问题的关键和重点,然后抽象、概括地描述问题。
所谓“逐步求精” 是将复杂问题经抽象化处理变为相对比较简单的问题。经若干步精化处理,最后 细化到用“三种基本结构”及基本操作去描述算法。
算法设计与分析第一章算法 概述
引入篇
第一章 算法概述
1.1 用计算机求解问题
问题求解(problem solving)是个大课题,它涉及归约、推断、决策、规划、常识推理、定 理证明和相关过程的核心概念
我们学习算法设计的重点就是把人类找到的求解问题的方法、步骤,以过程化、形式化、机 械化的形式表示出来,以便让计算机执行。(当然人工智能软件系统也离不开“算法设计”这个 最基本的软件设计环节。)就把我们学习的目标定为“用计算机求解问题”。
1.1.1 用计算机求解问题的步骤
现实中,在解决一个问题时,根据不同的经验,不同的环境会采用不同的方法,用计算机解 决现实中的问题,同样也有很多不同的方法,但解决问题的基本步骤是相同的。 下面给出用计算机求解问题的一般步骤。
1. 问题分析
准确、完整地理解和描述问题是解决问题的第一步。要做到这一点,必须注意以下一些问题: 在未经加工的原始表达中,所用的术语是否都明白其准确定义?题目提供了哪些信息?这些信息 有什么用?题目要求得到什么结果?题目中作了哪些假定?是否有潜在的信息?判定求解结果所 需要的中间结果有哪些?等等。针对每个具体的问题,必须认真审查问题描述,理解问题的真实 要求。
可行性 算法中描述的操作都可以通过已经实现的基本操作运算有限次实现。
所谓“自顶向下” 是将现实世界的问题经抽象转化为逻辑空间或求解空间的问题。是将复杂且大的 问题划分为较小问题,找出问题的关键和重点,然后抽象、概括地描述问题。
所谓“逐步求精” 是将复杂问题经抽象化处理变为相对比较简单的问题。经若干步精化处理,最后 细化到用“三种基本结构”及基本操作去描述算法。
算法设计与分析第一章算法 概述
引入篇
第一章 算法概述
1.1 用计算机求解问题
问题求解(problem solving)是个大课题,它涉及归约、推断、决策、规划、常识推理、定 理证明和相关过程的核心概念
我们学习算法设计的重点就是把人类找到的求解问题的方法、步骤,以过程化、形式化、机 械化的形式表示出来,以便让计算机执行。(当然人工智能软件系统也离不开“算法设计”这个 最基本的软件设计环节。)就把我们学习的目标定为“用计算机求解问题”。
1.1.1 用计算机求解问题的步骤
现实中,在解决一个问题时,根据不同的经验,不同的环境会采用不同的方法,用计算机解 决现实中的问题,同样也有很多不同的方法,但解决问题的基本步骤是相同的。 下面给出用计算机求解问题的一般步骤。
1. 问题分析
准确、完整地理解和描述问题是解决问题的第一步。要做到这一点,必须注意以下一些问题: 在未经加工的原始表达中,所用的术语是否都明白其准确定义?题目提供了哪些信息?这些信息 有什么用?题目要求得到什么结果?题目中作了哪些假定?是否有潜在的信息?判定求解结果所 需要的中间结果有哪些?等等。针对每个具体的问题,必须认真审查问题描述,理解问题的真实 要求。
可行性 算法中描述的操作都可以通过已经实现的基本操作运算有限次实现。
黑龙江大学计算机算法设计与分析--第一章
• 70年代后
– 算法作为计算机科学核心推动了计算机科学技 术飞速发展
5
计算机科学技术的体系
• 解决一个计算问题的过程
可计算否
能行可计算否 设计与分析算法 用计算机语言实现算法
可计算理论
计算复杂性理论 算法设计与分析 数据结构与程序设计 编译、OS、… 6
软件系统
• 可计算理论
–计算模型 –可计算问题/不可计算问题 –计算模型的等价性--图灵/Church命题
算法(Algorithm)的概念
• 通俗地讲
算法是指解决问题的一种方法或一个过程。
• 严格地讲
算法是由若干条指令组成的有穷序列,且满足下述性质: (1)输入: 有零个或多个由外部提供的量作为算法的 输入。 (2)输出: 算法产生至少一个量作为输出。 (3)确定性: 组成算法的每条指令是清晰的,无歧义的。 (4)有限性: 算法中每条指令的执行次数是有限的, 执行每条指令的时间也是有限的。
【课程基础】
• 本课程要求学生在学习之前已经熟练掌握C/C++程序 设计,学习过高等数学、线性代数、离散数学、概率 论与数理统计、数据结构等课程。
2
【主要教学内容】
设计算法及分析算法的理论、方法和技术; 可计算问题的算法设计与分析。 分为下述部分介绍: • 算法概述 • 递归与分治策略 • 动态规划 • 贪心算法 • 回溯法 • 分支限界法
常用的渐近函数
函数
1
名称
常数
函数
n2
名称
平方
logn
n
对数
线性
n倍logn
n3
2n
立方
指数
nlogn
n!
阶乘
算法设计与分析第1章 算法概述
T avg ( n )
p ( I )T ( I )
size ( I ) n
p p p p 1 2 3 n n 1 p n n n n
2013-5-24
p n
i1
n
i n 1 p
算法设计与分析
p( n 1) 2
2013-5-24
算法设计与分析
16
与机器无关的时间效率
(1)Tmax(n) = max{ T(I) | size(I)=n }=O(n) (2)Tmin(n) = min{ T(I) | size(I)=n }=O(1) (3)在平均情况下,假设: (a) 搜索成功的概率为p ( 0 p 1 ); (b) 在数组的每个位置i ( 0 i < n )搜索成功的概率相同,均为 p/n。
2013-5-24 算法设计与分析 18
2. 复杂性的渐近分析
• 比较两种不同的复杂性
– 3×n + 2和3×n 论当n→∞时,算法的时间复杂性,即复杂性 的渐近性态
2013-5-24
算法设计与分析
19
1) 渐近性态
• 设T(n)为算法A的时间复杂性函数,则它是n的单 ~ 调递增函数,如果存在一个函数 T( n ) 使得当 n→∞,有:
• 描述算法可以有多种方式:自然语言、数 学语言、流程图、表格方式、 图示形式、 程序设计语言等。 在此将采用C++与自然 语言相结合的方式来描述算法。
• 算法设计方法主要有:分治策略、动态规 划、贪心法、回溯法、分支限界、概率算 法等。
2013-5-24 算法设计与分析 13
1.2 算法的复杂性分析
计算机算法设计与分析-算法概述
2023/10/8
计算机算法设计与分析
7
复杂性分析的简化
令T(N)为表示算法A的复杂性函数,若存在Ť (N), 使得
Lim N (T(N) – Ť(N)) / T(N) = 0 那么,就可以用Ť(N)来代替T(N) ,从而简化复杂 性的分析。 例如:T(N) = 3N2+4NlogN+7,Ť(N) = 3N2,则
例如,计算一个N维矩阵A的平方的时间 复杂性可估算为2N*N2 = 2N3,即此计算 的时间复杂性为3阶。
2023/10/8
计算机算法设计与分析
9
几个记号
设f(N)、g(N)都是定义在正整数集上的函数。 上界记号O:如果存在正的常数C和自然数N0,
使 界得 函当 数Ng(≧N)N,0 记时为有ff((NN))≦= OC(gg((NN)),)。则f(N)有上 下 使 界界 得 函记 当 数Ng号(≧NΩ)N:,0如记时果为有存ff((NN在))正≧= Ω的Cg(常g(N(N数),))C。则和f自(N然)有数下N0, 同阶记号Θ:f(N)= Θ(g(N))表示f(N)和g(N)同
ei(N, I)为经过统计后得到的执行抽象计算机的 第i种指令的次数。
2023/10/8
计算机算法设计与分析
6
最坏、最好或平均的情况
令:D为规模为N的合法输入的集合; I*表示在最坏情况下的输入; I#表示在最好情况下的输入; P(I)输入I出现的概率。
W(N) = max IDT(N, I) = T(N, I*) B(N) = min IDT(N, I) = T(N, I#) A(N) = IDP(I)T(N, I) 三者中最常用的是W(N) 。
3、图
一个图G是一个有序三元组,G=(V,E,Ψ),其中: (1)V是非空顶点集合;
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程安排
理论课:1~10周,40学时 周二(5-6)、周五(1-2)
上机: 18学时
期末考试: 闭卷笔试,第 11周
上课点名三次不到者取消考试资格; 迟到或作业缺交,一次扣10分(平时成绩)。
1
教学目的和要求
本课程是计算机类专业的专业基础课程; 通过课程学习和上机实践,对计算机常用算 法有一个较全面的了解,掌握通用算法的一 般设计方法; 学会对算法的时间、空间复杂度分析,掌握 提高算法效率的方法和途径。
24
三、算法复杂性分析
本课程主要对算法的时间复杂性进行分析。
关于算法的复杂性,有两个问题要弄清楚:
(1)用怎样的一个量(指标)来表达一个算法的
复杂性;
(2)对于一个算法,怎样具体计算它的复杂性。
25
1、算法的三种时间复杂性
算法的最坏、最好和平均时间复杂性 (1)最坏情况下的时间复杂性 Tmax(n) = max{ T(I) | size(I)=n } (2)最好情况下的时间复杂性
8
图1.1 算法的概念图
(一)算法的性质
1、算法具有某些特性,如下几条:
(1)输入:有零个或多个外部提供的量作为算
法的输入。
(2)输出:算法产生至少一个量作为输出。这 些输出是和输入有某种特定关系的量。
9
(一)算法的性质
(3)确定性:组成算法的每条指令是清晰,无
歧义的。
(4)有限性(有穷性):算法中每条指令的执
29
2、算法的时间复杂性计算
int search(int A[ ], int m, int c) { int i=1; while( A[i]<c && i<m ) i=i+1; if (A[i]==c) return i; else return 0; }
a
2mt
(m-1)(s+a) t
a
30
在数学上, t(n)是T(n)的渐近表达式,是T(n)略
去低阶项留下的主项。它比T(n) 简单。
例如: T(n)=3n2+4nlogn+7; t(n) =3n2 T(n)=4nlogn+7n; t(n) =4nlogn 因此,只要考察当问题规模充分大时,算法复 杂性在渐进意义下的阶,就可以判定出哪一个 算法的效率高。
gcd(60,24)=gcd(24,12)=gcd(12,0)=12 注:gcd (m , 0) =m,m mod n 表示m除以n之后的余 数,称为模运算
19
2、算法的一个结构化的描述 计算gcd(m,n)的欧几里得算法: 第一步:如果n=0,返回m的值作为结果,同 时过程结束;否则,进入第二步。 第二步:用n去除m,将余数赋给r。 第三步:将n的值赋给m,将r的值赋给n,返 回第一步。
40
(1)渐近上界记号O——例
例1:【线性函数】考察f(n)=3n+2。 当n>=2时,3n+2<=3n+n=4n,所以f(n)=O(n), f(n)是一个线性变化的函数。类似地, 100n+6=O(n)。 特别地,当f(n)是一个常数c时,如f(n)=9,可 以记为f(n)=O(1)。
22
其他方法
程序流程图等,不再一一列举。
23
三、算法复杂性分析
算法复杂性是算法效率的度量,是评价算法优劣的 重要依据。
算法复杂性的高低体现在运行算法所需要的计算机 资源,即时间和空间(存储器)资源的多少上。
算法的时间复杂性T(n),空间复杂性S(n)。 其中n是问题的规模(输入大小)。
2
学习算法的重要性
(一) 从理论和实践的角度理解 —计算机科学的基石;掌握标准算法 (二)从算法对于程序的重要性来讲 —皮之不存,毛将附焉? (三) 从对同学们的能力培养看 —开发分析问题的能力
3
算法分析与设计课程 与 数据结构课程
(一)数据结构关心的对象 各种数据结构的作用和效率、具体的问题 (二)算法设计与分析关心的对象 算法设计技术的适用性和效率、一般性方 法
16
(四)如何确认算法(证明其正确性)
证明算法对所有可能的输入都能算出正确的 答案,这一工作称为算法确认。这一领域是 当前许多计算机工作者集中研究的对象,还 处于相当初期的阶段。 在学习本课程中,我们仅对算法的正确性进 行一般的非形式化讨论,以及对算法的程序 实现进行测试验证。
17
(五)如何分析(评价)算法
31
3、算法的改进
上面例子中顺序查找算法的改进有: 进行二分(折半)查找,即反复把供查找的 数组分成两半,然后在其中一半继续查找。
A[mid]>c
A[mid]<c
A[1]
A[mid]
A[m]
32
3、算法的改进
int search_Bin(int A[ ], int c, int m) { int low=1,high=m, mid=0, found=0; while( found==0 && high>=low) { mid=(low+high)/2; if( A[mid]==c) found=1; else if( A[mid]<c) low=mid+1 else high=mid-1 } if ( found==1) return mid; else return 0; }
4
授课内容
第1章 算法概述 第2章 递归与分治策略 第3章 动态规划 第4章 贪心算法 第5章 回溯法 第6章 分支限界法 *7-9章属研究生学习内容,可自学了解。
5
第1章 算法概述
学习要点:
一、理解算法的概念,以及问题求解的 过程。
二、掌握算法的几种描述方式。 三、理解算法的计算复杂性概念。
21
4、算法的一个c++程序语言实现
int Euclid(int m,int n) // 计算gcd(m,n) // 输入:非负整数m,n,其中m,n不同时为零 // 输出:m,n的最大公约数 { int r=0; if(m*n==0) return 0; // m,n不符合输入规范时返回0 while (n > 0) { r = m mod n; m = n; n = r; } return m; }
38
为此,我们引入以下渐进意义下的记号: O o
θ
39
(1)渐近上界记号O
在下面的讨论中,对所有n,时间复杂性函数
f(n) 0,g(n) 0, g(n)也称为 f(n)的阶函数 。
渐近上界记号O——给出函数f的一个上限
O(g(n)) = { f(n) | 存在正常数c和n0使得对所有 n n0有:0 f(n) cg(n) }
分析算法包括 定量的分析算法需要多少计算 时间和存储空间,分析算法不仅可以预计 算 法能否有效得完成任务,而且可以知道算法 在最坏、最好和平均情况下的运算时间,对 解决同一问题的不同算法的优劣作出比较。
18
二、算法的几种描述方式
1、计算两个整数的最大公约数问题的一个现 代数学术语表述 欧几里得算法基于的方法是重复应用下列 等式: gcd (m , n) = gcd (n , m mod n) , 直到m mod n等于0。
35
四、算法的渐近复杂性
随着要求用计算机解决的问题越来越复杂, 规模越来越大,对这类问题的求解算法做复 杂性分析具有特别重要的意义。 因此,对于规模充分大,结构又十分复杂的 算法,人们提出了如何简化其复杂性分析, 及求解其复杂性函数f(n)的上界和下界的问 题。
36
3、算法的改进
在最坏情况下,查找成功时最多只需检测A [1...m]中的∟logm」+1个分量,而改进前 最坏情况下需要比较m个分量。 如:c=5, A[1...11]={ 1,2,3,.....,11} 对于查找算法,减少比较次数可以最有效地 降低算法时间复杂度。 算法改进的目的就是为了提高效率! 注:本书中出现的logn相当于log2n。
20
3、算法的一个伪代码描述
ALGORITHM Euclid(m,n) // 计算gcd(m,n) // 输入:非负整数m,n,其中m,n不同时为零 // 输出:m,n的最大公约数 while n ≠ 0 do r ← m mod n m ← n n ← r return m
四、掌握算法渐近复杂性的数学表述。
6
什么是算法?
我们来编写一个烧开水的算法:
输入自来水 循环(反复)加热直到水开 输出开水
7
一、算法(Algorithm)
算法概念:通俗地讲,算法是指解决问题
的一种方法或一个过程。严格地讲,算法是 由若干条指令组成的有穷序列。
问题
算法 输入 “计算设备” 输出
行次数是有限的,执行每条指令的时间也是 有限的。
10
(一)算法的性质
(5)可实现性:此性质是指算法中有待实现的 运算都是相当基本的,每种运算至少在原理 上能由人用纸和笔在有限的时间内完成。 (补充)
11
(一)算法性质
2、关于算法有几个要点:
(1) 算法所处理的输入的值域必须严格定义。 (2) 同样一种算法可以用几种不同的形式来描 述。
12
(一)算法性质
(3) 同一个问题可以存在多种解决的算法。
理论课:1~10周,40学时 周二(5-6)、周五(1-2)
上机: 18学时
期末考试: 闭卷笔试,第 11周
上课点名三次不到者取消考试资格; 迟到或作业缺交,一次扣10分(平时成绩)。
1
教学目的和要求
本课程是计算机类专业的专业基础课程; 通过课程学习和上机实践,对计算机常用算 法有一个较全面的了解,掌握通用算法的一 般设计方法; 学会对算法的时间、空间复杂度分析,掌握 提高算法效率的方法和途径。
24
三、算法复杂性分析
本课程主要对算法的时间复杂性进行分析。
关于算法的复杂性,有两个问题要弄清楚:
(1)用怎样的一个量(指标)来表达一个算法的
复杂性;
(2)对于一个算法,怎样具体计算它的复杂性。
25
1、算法的三种时间复杂性
算法的最坏、最好和平均时间复杂性 (1)最坏情况下的时间复杂性 Tmax(n) = max{ T(I) | size(I)=n } (2)最好情况下的时间复杂性
8
图1.1 算法的概念图
(一)算法的性质
1、算法具有某些特性,如下几条:
(1)输入:有零个或多个外部提供的量作为算
法的输入。
(2)输出:算法产生至少一个量作为输出。这 些输出是和输入有某种特定关系的量。
9
(一)算法的性质
(3)确定性:组成算法的每条指令是清晰,无
歧义的。
(4)有限性(有穷性):算法中每条指令的执
29
2、算法的时间复杂性计算
int search(int A[ ], int m, int c) { int i=1; while( A[i]<c && i<m ) i=i+1; if (A[i]==c) return i; else return 0; }
a
2mt
(m-1)(s+a) t
a
30
在数学上, t(n)是T(n)的渐近表达式,是T(n)略
去低阶项留下的主项。它比T(n) 简单。
例如: T(n)=3n2+4nlogn+7; t(n) =3n2 T(n)=4nlogn+7n; t(n) =4nlogn 因此,只要考察当问题规模充分大时,算法复 杂性在渐进意义下的阶,就可以判定出哪一个 算法的效率高。
gcd(60,24)=gcd(24,12)=gcd(12,0)=12 注:gcd (m , 0) =m,m mod n 表示m除以n之后的余 数,称为模运算
19
2、算法的一个结构化的描述 计算gcd(m,n)的欧几里得算法: 第一步:如果n=0,返回m的值作为结果,同 时过程结束;否则,进入第二步。 第二步:用n去除m,将余数赋给r。 第三步:将n的值赋给m,将r的值赋给n,返 回第一步。
40
(1)渐近上界记号O——例
例1:【线性函数】考察f(n)=3n+2。 当n>=2时,3n+2<=3n+n=4n,所以f(n)=O(n), f(n)是一个线性变化的函数。类似地, 100n+6=O(n)。 特别地,当f(n)是一个常数c时,如f(n)=9,可 以记为f(n)=O(1)。
22
其他方法
程序流程图等,不再一一列举。
23
三、算法复杂性分析
算法复杂性是算法效率的度量,是评价算法优劣的 重要依据。
算法复杂性的高低体现在运行算法所需要的计算机 资源,即时间和空间(存储器)资源的多少上。
算法的时间复杂性T(n),空间复杂性S(n)。 其中n是问题的规模(输入大小)。
2
学习算法的重要性
(一) 从理论和实践的角度理解 —计算机科学的基石;掌握标准算法 (二)从算法对于程序的重要性来讲 —皮之不存,毛将附焉? (三) 从对同学们的能力培养看 —开发分析问题的能力
3
算法分析与设计课程 与 数据结构课程
(一)数据结构关心的对象 各种数据结构的作用和效率、具体的问题 (二)算法设计与分析关心的对象 算法设计技术的适用性和效率、一般性方 法
16
(四)如何确认算法(证明其正确性)
证明算法对所有可能的输入都能算出正确的 答案,这一工作称为算法确认。这一领域是 当前许多计算机工作者集中研究的对象,还 处于相当初期的阶段。 在学习本课程中,我们仅对算法的正确性进 行一般的非形式化讨论,以及对算法的程序 实现进行测试验证。
17
(五)如何分析(评价)算法
31
3、算法的改进
上面例子中顺序查找算法的改进有: 进行二分(折半)查找,即反复把供查找的 数组分成两半,然后在其中一半继续查找。
A[mid]>c
A[mid]<c
A[1]
A[mid]
A[m]
32
3、算法的改进
int search_Bin(int A[ ], int c, int m) { int low=1,high=m, mid=0, found=0; while( found==0 && high>=low) { mid=(low+high)/2; if( A[mid]==c) found=1; else if( A[mid]<c) low=mid+1 else high=mid-1 } if ( found==1) return mid; else return 0; }
4
授课内容
第1章 算法概述 第2章 递归与分治策略 第3章 动态规划 第4章 贪心算法 第5章 回溯法 第6章 分支限界法 *7-9章属研究生学习内容,可自学了解。
5
第1章 算法概述
学习要点:
一、理解算法的概念,以及问题求解的 过程。
二、掌握算法的几种描述方式。 三、理解算法的计算复杂性概念。
21
4、算法的一个c++程序语言实现
int Euclid(int m,int n) // 计算gcd(m,n) // 输入:非负整数m,n,其中m,n不同时为零 // 输出:m,n的最大公约数 { int r=0; if(m*n==0) return 0; // m,n不符合输入规范时返回0 while (n > 0) { r = m mod n; m = n; n = r; } return m; }
38
为此,我们引入以下渐进意义下的记号: O o
θ
39
(1)渐近上界记号O
在下面的讨论中,对所有n,时间复杂性函数
f(n) 0,g(n) 0, g(n)也称为 f(n)的阶函数 。
渐近上界记号O——给出函数f的一个上限
O(g(n)) = { f(n) | 存在正常数c和n0使得对所有 n n0有:0 f(n) cg(n) }
分析算法包括 定量的分析算法需要多少计算 时间和存储空间,分析算法不仅可以预计 算 法能否有效得完成任务,而且可以知道算法 在最坏、最好和平均情况下的运算时间,对 解决同一问题的不同算法的优劣作出比较。
18
二、算法的几种描述方式
1、计算两个整数的最大公约数问题的一个现 代数学术语表述 欧几里得算法基于的方法是重复应用下列 等式: gcd (m , n) = gcd (n , m mod n) , 直到m mod n等于0。
35
四、算法的渐近复杂性
随着要求用计算机解决的问题越来越复杂, 规模越来越大,对这类问题的求解算法做复 杂性分析具有特别重要的意义。 因此,对于规模充分大,结构又十分复杂的 算法,人们提出了如何简化其复杂性分析, 及求解其复杂性函数f(n)的上界和下界的问 题。
36
3、算法的改进
在最坏情况下,查找成功时最多只需检测A [1...m]中的∟logm」+1个分量,而改进前 最坏情况下需要比较m个分量。 如:c=5, A[1...11]={ 1,2,3,.....,11} 对于查找算法,减少比较次数可以最有效地 降低算法时间复杂度。 算法改进的目的就是为了提高效率! 注:本书中出现的logn相当于log2n。
20
3、算法的一个伪代码描述
ALGORITHM Euclid(m,n) // 计算gcd(m,n) // 输入:非负整数m,n,其中m,n不同时为零 // 输出:m,n的最大公约数 while n ≠ 0 do r ← m mod n m ← n n ← r return m
四、掌握算法渐近复杂性的数学表述。
6
什么是算法?
我们来编写一个烧开水的算法:
输入自来水 循环(反复)加热直到水开 输出开水
7
一、算法(Algorithm)
算法概念:通俗地讲,算法是指解决问题
的一种方法或一个过程。严格地讲,算法是 由若干条指令组成的有穷序列。
问题
算法 输入 “计算设备” 输出
行次数是有限的,执行每条指令的时间也是 有限的。
10
(一)算法的性质
(5)可实现性:此性质是指算法中有待实现的 运算都是相当基本的,每种运算至少在原理 上能由人用纸和笔在有限的时间内完成。 (补充)
11
(一)算法性质
2、关于算法有几个要点:
(1) 算法所处理的输入的值域必须严格定义。 (2) 同样一种算法可以用几种不同的形式来描 述。
12
(一)算法性质
(3) 同一个问题可以存在多种解决的算法。