计算机算法设计与分析--第一章

合集下载

算法设计与分析:第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章-算法设计基础

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、算法与程序
程序:是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(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章 算法引论

算法设计与分析基础

算法设计与分析基础

2023/12/21
20
LingJie/GDUT
1.2.6 详细表述该算法的方法
• 可以用到的工具有自然语言(nature
language)、伪代码(pseudocode)以及程序 流程图(flow chart)等。
• 当对一个问题有了概要的理解后,下面的工作
就是把这个问题的想法进行细化。所谓的细化 就是把它们表示成算法的步骤。
令执行顺序以及同步等问题。并行算法的设计 有相应的理论,这里仅考虑串行算法。
2023/12/21
17
LingJie/GDUT
1.2.3 选择精确或者近似的算法
• 解决问题下一步要考虑的是使用精确的还是近
似的算法。并不是每一个可解的问题都有精确 的算法,例如求一个数的平方根,求非线性方 程的解等。有时候一个问题有精确的解法但是 算法的执行效率很差,例如旅行家问题。因此 如果待处理的问题涉及到上述那些方面,则要 考虑是选择精确的还是近似的算法。
2023/12/21
10
LingJie/GDUT
-- 2* 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
-- 2 3*
5
7
9
11
13
15
17
19
21
23
25
-- 2 3
5*
7
11
13
17
19
23
25
-- 2 3
5
7
11
13
第一步:找出m的所有质因数。 第二步:找出n的所有质因数。 第三步:从第一步求得的m的质因数分解式和第二步求得的n
的质因数分解式中,找出所有公因数。 第四步:将第三步找到的公因数相乘,结果为所求的

计算机算法设计与分析(第4版) 王晓东习题解答

计算机算法设计与分析(第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)。

北航计算机研究生课程_算法设计与分析__Assignment_1

北航计算机研究生课程_算法设计与分析__Assignment_1

一、解:设第k月的需求量为Nk(k=1,2,3,4)状态变量Xk:第k月初的库存量,X1=X5=0,0≤Xk≤Nk+…+N4决策变量Uk:第k月的生产量,max{0,Nk-Xk}≤Uk≤min{6,Nk+…+N4 - Xk}状态转移方程:X k+1 = Uk + Xk – Nk第k月的成本Vk = 0.5*(Xk - Nk) Uk=03 + Uk + 0.5*(Uk + Xk - Nk) Uk≠0设F k(Xk)是由第k月初的库存量Xk开始到第4月份结束这段时间的最优成本则F k(Xk) = min{Vk + F k+1(X k+1)} 1≤k≤4= min{ 3 + Uk + 0.5*(Uk + Xk - Nk) + F k+1(Uk + Xk - Nk) } Uk≠0min{ 0.5*(Xk - Nk) + F k+1(Xk - Nk) } Uk=0 F5(X5)=0四个月内的最优成本为F1(X1)=F1(0)详细计算步骤如下:(1)k=4时4(2)k=3时(3)k=2时(4)k=1时由以上计算可得,4个月的总最优成本为F1(0) = 20.5(千元)二、解:1、变量设定阶段k:已遍历过k个结点,k=1,2…6,7。

K=1表示刚从V1出发,k=7表示已回到起点V1状态变量Xk=(i,Sk):已遍历k个结点,当前位于i结点,还未遍历的结点集合为Sk。

则X1=(1,{2,3,4,5,6}),X6=(i,Φ),X7=(1,Φ)决策变量Uk=(i,j):已遍历k个结点,当前位于i结点,下一个结点选择j。

状态转移方程:X k+1 = T(Xk,Uk) = (j,Sk-{j})第k阶段的指标函数Vk = D[i,j]。

最优指标函数Fk(Xk) = Fk(i,Sk):已遍历k个结点,当前从i结点出发,访问Sk中的结点一次且仅一次,最后返回起点V1的最短距离。

则Fk(i,Sk) = min{ D[i,j] + F k+1(j,Sk-{j}) } 1≤k≤6F7(X7) = F7(1,Φ) = 02、分析:(1)k=6时,F6(i,Φ) = min{D[i,1] + F7(X7)} = D[i,1] i=2,3,4,5,63、伪代码和时间复杂度为方便计算,结点编号改为0到5.(1)用一张二维表格F[][]表示F(i,Sk),行数是n,列数是2n-1。

中科院计算机算法分析与设计_习题1-2_答案

中科院计算机算法分析与设计_习题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)

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

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

算法设计与分析 第1章

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

计算机算法设计与分析--第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
人们的生产活动和日常生活离不开算法, 都在自觉不自觉地使用算法,例如人们到 商店购买物品,会首先确定购买哪些物品, 准备好所需的钱,然后确定到哪些商场选 购、怎样去商场、行走的路线,若物品的 质量好如何处理,对物品不满意又怎样处 理,购买物品后做什么等。以上购物的算 法是用自然语言描述的,也可以用其他描 述方法描述该算法。

算法设计与分析报告习题

算法设计与分析报告习题

《算法设计与分析》习题第一章算法引论1、算法的定义?答:算法是指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程。

通俗讲,算法:就是解决问题的方法或过程。

2、算法的特征?答:1)算法有零个或多个输入;2)算法有一个或多个输出; 3)确定性;4)有穷性3、算法的描述方法有几种?答:自然语言、图形、伪代码、计算机程序设计语言4、衡量算法的优劣从哪几个方面?答:(1) 算法实现所耗费的时间(时间复杂度);(2) 算法实现所所耗费的存储空间(空间复杂度);(3) 算法应易于理解,易于编码,易于调试等等。

5、时间复杂度、空间复杂度定义?答:指的是算法在运行过程中所需要的资源(时间、空间)多少。

6、时间复杂度计算:{i=1;while(i<=n)i=i*2; }答:语句①执行次数1次,语句②③执行次数f(n), 2^f(n)<=n,则f(n) <=log2n;算法执行时间: T(n)= 2log2n +1时间复杂度:记为O(log2n) ;7.递归算法的特点?答:①每个递归函数都必须有非递归定义的初值;否则,递归函数无法计算;(递归终止条件)②递归中用较小自变量函数值来表达较大自变量函数值;(递归方程式)8、算法设计中常用的算法设计策略?答:①蛮力法;②倒推法;③循环与递归;④分治法;⑤动态规划法;⑥贪心法;⑦回溯法;⑧分治限界法9、设计算法:递归法:汉诺塔问题?兔子序列(上楼梯问题)?整数划分问题?蛮力法:百鸡百钱问题?倒推法:穿越沙漠问题?答:算法如下: (1) 递归法● 汉诺塔问题void hanoi(int n, int a, int b, int c) {if (n > 0) {hanoi(n-1, a, c, b); move(a,b);hanoi(n-1, c, b, a); } }● 兔子序列(fibonaci 数列 )递归实现:Int F(int n) {if(n<=2) return 1; elsereturn F(n-1)+ F(n-2); }● 上楼梯问题 Int F(int n) {if(n=1) return 1 if(n=2) return 2; elsereturn F(n-1)+ F(n-2); }● 整数划分问题问题描述:将正整数n 表示成一系列正整数之和,n=n1+n1+n3+…将最大加数不大于m 的划分个数,记作q(n,m)。

计算机算法设计与分析第1章王晓东(第三版)第4章

计算机算法设计与分析第1章王晓东(第三版)第4章

计算机算法设计与分析第1章王晓东(第三版)第4章第4章贪心算法学习要点理解贪心算法的概念。

掌握贪心算法的基本要素(1)最优子结构性质(2)贪心选择性质理解贪心算法与动态规划算法的差异理解贪心算法的一般理论通过应用范例学习贪心设计策略。

(1)活动安排问题;(2)最优装载问题;(3)哈夫曼编码;(4)单源最短路径;(5)最小生成树;(6)多机调度问题。

顾名思义,贪心算法总是作出在当前看来最好的选择。

也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

当然,希望贪心算法得到的最终结果也是整体最优的。

虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。

如单源最短路经问题,最小生成树问题等。

在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

4.1活动安排问题活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。

该问题要求高效地安排一系列争用某一公共资源的活动。

贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。

4.1活动安排问题设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。

每个活动i都有一个要求使用该资源的起始时间i和一个结束时间fi,且i<fi如果选择了活动i,则它在半开时间区间[i,fi)内占用资源。

若区间[i,fi)与区间[j,fj)不相交,则称活动i与活动j是相容的。

也就是说,当i≥fj或j≥fi时,活动i与活动j相容。

4.1活动安排问题下面给出解活动安排问题的贪心算法GreedySelector:template<claType>voidGreedySelector(intn,Type[],Typef[],boolA[]){A[1]=true;intj=1;for(inti=2;i<=n;i++){if([i]>=f[j]){A[i]=true;j=i;}eleA[i]=fale;}}各活动的起始时间和结束时间存储于数组和f中且按结束时间的非减序排列4.1活动安排问题由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。

计算机算法设计与分析第版王晓东电子优选文档

计算机算法设计与分析第版王晓东电子优选文档

问题求解(Problem Solving)
理解问题 精确解或近似解
选择数据结构 算法设计策略
设计算法 证明正确性
分析算法 设计程序
算法复杂性分析
• 算法复杂性=算法所需要的计算机资源 • 算法的时间复杂性T(n); • 算法的空间复杂性S(n)。 • 其中n是问题的规模(输入大小)。
算法的时间复杂性
default: statement sequence;
}
(2)迭代语句:
• (2.1) for循环: • for (init;condition;inc) statement; • (2.2) while循环: • while (condition) statement; • (2.3) do-while循环: • do{ • statement; • } while (condition);
(6.3)运算符delete:
• 当动态分配的存储空间已不再需要时应及时释放所占 用的空间。
• 用运算符delete来释放由new分配的空间。 • 例: • delete y; • delete [ ]x; • 分别释放分配给 y的空间和分配给一维数组x的空间。
(3)跳转语句:
• (3.1) return语句: • return expression; • (3.2) goto语句: • goto label; • • label:
(4)函数:
return-type function name(para-list) {
body of the function }
• >0使得对所有n n0有:0 f(n)<cg(n) } 等价于f(n) /g(n) 0,asn 。

• (4非紧下界记号) • (g(n)) = {f(n) |对于任何正常数c>0,存在正数和n0
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【课程基础】
• C/C++程序设计,高等数学、线性代数、离散数学、 概率论与数理统计、数据结构等。
2
【主要教学内容 】
设计算法及分析算法的理论、方法和技术 ; 可计算问题的算法设计与分析。 分为下述部分介绍 : • 算法概述 • 递归与分治策略 • 动态规划 • 贪心算法 • 回溯法 • 分支限界法
17
�渐近意义下的记号
)表示一个程序的时间 在下面的讨论中,用 f(n f(n) 或空间复杂性,它是问题规模 n(一般是输入规 模)的函数。由于一个程序的时间或空间需求是 一个非负的实数,我们 假定函数f(n )对于n的所有 f(n) 取值均为非负实数,而且还可假定 n≥0。
• 渐近记号O的定义:
• 计算机软件
– 系统软件 – 工具软件 – 应用软件
8
第二节 算法与程序
�算法(Algorithm )的概念
• 通俗地讲
算法是指解决问题的一种方法或一个过程。
• 严格地讲
算法是由若干条指令组成的有穷序列,且满足下述性质: (1)输入: 有零个或多个由外部提供的量作为算法的 输入。 (2)输出: 算法产生至少一个量作为输出。 (3)确定性: 组成算法的每条指令是清晰的,无歧义的。 (4)有限性: 算法中每条指令的执行次数是有限的, 执行每条指令的时间也是有限 9 的。
//如果找到,则返回所在位置,否则返回 –1 Θ
22
第四节 递归方程解的渐近阶的求法
• 三种求递归方程解的渐近阶的方法:
(1)代入法(Substitution Method) (2)迭代法 (Iteration Method) (3)套用公式法(Master method)
23
(3)套用公式法(Master method)
21
例3:非递归的折半搜索算法
template<class T> int BinarySearch(T a[ ], const 算法时间复杂性估计 : T& x, int n) {//在a[0]<=a[1]<=···<=a[n-1]中搜索x
的每次循环(最后一次除外)都将 while int left=0; int right=n-1; while(left <=right) while(left<=right) 以减半的比例缩小搜索范围,所以,该循 { int middle=(left+right)/2; 环在最坏的情况下需要 执行 Θ (log(n ))次。 log(n)) == a[middle ]) return middle; if(x if(x== ==a[middle a[middle]) 由于每次循环需耗时 Θ (1) ,因此在最坏 >a[middle ]) left=middle+1; if(x if(x> a[middle]) ))。 情况下,总的时间复杂性为 log(n)) Θ(log(n else right=middle – 1; } return –1; //未找到 x }
• 可计算理论
– 计算模型 – 可计算问题/不可计算问题 – 计算模型的等价性--图灵/Church命题
• 计算复杂性理论
– 在给定的计算模型下研究问题的复杂性 • 固有复杂性 • 复杂性下界 • 平均复杂性 • 复杂性问题的分类: P=NP? • 公理复杂性理论
7
• 算法设计和分析
– 设计算法的理论、方法和技术 – 分析算法的理论、方法和技术
14
例2:寻找最大元素
template<class T> int Max(T a[], int n ) //寻找数组a最大元素 {int pos=0; for ( int i=1; i<n; i++) (int if ( a[pos ]< a[i ]) (a[pos a[pos]< ]<a[i a[i]) pos=i; return pos; }
算法设计与分析
The Design and Analysis of Computer Algorithms
主讲教师:金英
1
【参考教材】
• 王晓东,计算机算法设计与分析 (第3版) ,电子工业出 版社,2007。 , and Ronald • Thomas H.Cormen, Charles E. Leiserson Leiserson, L. Rivest . Introduction to Algorithms Rivest. (Second Edition), The MIT Press, 2002. [算法导论 (第二版)]
13
例1:二分查找算法
int bsearch(K,L,H ) bsearch(K,L,H) 算法时间复杂性估计: { if (H<L) return(-1); 2 else )=2 ∵ T(n 当n=0 T(n)=2 3 { mid=(L+H) /2; A[mid ]; element= element=A[mid A[mid]; 2 )=11+T(n/2) ∵ T(n T(n)=11+T(n/2) 当n≥1 1 if (element == K) 1 return(mid ); return(mid) 2 else ]>K) (log A[mid A[mid]>K ) =if ∴ T(n T(n) O( n) , mid-1)) ; return(bsearch(K,L return(bsearch(K,L, 3+T(n/2) , mid+1,H)); else return(bsearch(K return(bsearch(K, } 3+T(n/2)
算法复杂性估计: )= O(n ) T(n T(n)= O(n)
15
�渐近复杂性分析
确定程序的操作计数和执行步数的目的是为了比较 两个完成同一功能的程序的时间复杂性,预测程序的 运行时间随着问题规模变化的变化量。 )= 3n2 +4nlogn + 7 例子: T(n T(n)= ~
~ T(n) 设T(n )是算法A的时间复杂性函数。 T(n)
12
• 本课程考虑如下三种情况下的时间复杂度 : 最坏情况 ;最好情况 ;平均情况。 • 时间复杂性的计算方法 加、减、乘、除、比较、赋值等操作,一般被看 作是基本操作,并约定所用的时间都是一个 单位 时间;通过计算这些操作分别执行了多少次来确 定程序总的执行步数。 一般地,一些关键操作执行的次数决定了算法 的时间复杂度。
)= O(g(n ))当且仅当存在正的常数 C和n0, f(n f(n)= )=O(g(n O(g(n)) )≤ Cg(n )。此时, 使得对于所有的 n≥n0,有f(n f(n) Cg(n) 称g(n )是f(n )的一个上界。 g(n) f(n)
18
例:
100 = O(1): 3n+2 = O(n): 100n+6 = O(n): 10n2+4n+3 = O(n2): 6×2n+n2 = O(2n): f(n )等于非零常数的情形。 f(n) 可取 C=4, n0=2 可取 C=101,n0=6 可取 C=?, n0=? 可取C =7, n0=4
综上分析,我们已经给出了简化算法复杂性分析 的方法和步骤,即只考虑当问题的规模充分大 时,算法复杂性在渐近意义下的阶。 为此引入渐 近符号。在那之前,首先给出常用的渐近函数。
常用的渐近函数
函数
1 logn n nlogn
名称 常数 对数 线性
n倍logn
函数
n2 n3 2n n!
名称 平方 立方 指数 阶乘
Ω • 渐近记号
的定义:
)= Ω(g(n )) 当且仅当存在正的常数 C和n0,使得 f(n f(n)= )=Ω g(n)) 对于所有的 n≥ n0 ,有f(n)≥C(g(n ))。此时,称 C(g(n)) )是 f(n )的下界。 g(n g(n) f(n)
• 渐近记号 Θ 的定义:
)=Θ(g(n ))当且仅当存在正常数和 C1,C2和n0, f(n f(n)= g(n)) 使得对于所有的 n≥n0, 有C1(g(n))≤f(n)≤ C2(g(n))。 此时,称f(n )与g(n )同阶。 f(n) g(n) 例: 3n+2= Θ(n) 10n2+4n+2= Θ(n2) 5×2n +n2= Θ(2n)
这个方法为估计形如 )= aT(n/b)+f(n ) T(n T(n)= )=aT(n/b)+f(n aT(n/b)+f(n) 的递归方程解的渐近阶提供三个可套用的公式。 注:上式是一个递归方程,其中 : a≥1和b>1是常数, )是一个确定的正函数。 f(n f(n)
24
这里涉及的三类情况,都是用 f(n )与nlogba作比 f(n) 较。定理直观地告诉我们,递归方程解的渐近 阶由这两个函数中的较大者决定。 •在第一类情况下, nlogba的阶较大, )=Θ(nlogba)。 则T(n T(n)= )和nlogba同阶 , •在第二类情况下, f(n f(n) 则T(n )=Θ(nlogbalogn )。 T(n)= logn) )的阶较大, •在第三类情况下, f(n f(n) )= Θ(f(n ))。 则T(n T(n)= )=Θ f(n))
3×log n + 2×n + n2 = O(n2) n×log n +n2 = O(n2) 3n+2 = O(n2)
19
三点注意事项:
)应该尽量接近所考虑的函 (1)用来作比较的函数g(n g(n) )。 数f(n f(n) 如:3n+2=O(n2) 松散的界限; O(n ) 较好的界限。 3n+2= 3n+2=O(n O(n) (2)不要产生错误界限。 如: n2+100n+6 当n<3时,n2+100n+6<106n, )是错误的! 由此就认为n2+100n+6=O(n O(n) 事实上,对任何正常数 C,只要n>C-100就有 C×n。 n2+100n+6> +100n+6>C 同理,3n2+4×2n=O(n2)是错误的界限。 )= O(g(n ))不能写成g(n )= O(f(n ))。 (3)f(n f(n)= )=O(g(n O(g(n)) g(n)= )=O(f(n O(f(n)) 因为两者并不等价。 20
相关文档
最新文档