计算机算法设计与分析第4版王晓东电子
算法设计与分析王晓东

习题2-1 求下列函数的渐进表达式:3n^2+10n; n^2/10+2n; 21+1/n; logn^3; 10 log3^n 。
解答:3n^2+10n=O(n^2),n^2/10+2^n=O(2^n),21+1/n=O(1),logn^3=O(logn),10log3^n=O(n).习题2-3 照渐进阶从低到高的顺序排列以下表达式:n!,4n^2,logn,3^n,20n,2,n^2/3。
解答:照渐进阶从高到低的顺序为:n!、3^n、4n^2 、20n、n^2/3、logn、2习题2-4(1)假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。
在某台计算机上实现并完成该算法的时间为t秒。
现有另外一台计算机,其运行速度为第一台计算机的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?(2)若上述算法的计算时间改进为T(n)=n^2,其余条件不变,则在新机器上用t秒时间能解输入规模多大的问题?(3)若上述算法的计算时间进一步改进为,其余条件不变,那么在新机器上用t秒时间能解输入规模多大的问题?解答:(1)设能解输入规模为n1的问题,则t=3*2^n=3*2^n/64,解得n1=n+6(2)n1^2=64n^2得到n1=8n(3)由于T(n)=常数,因此算法可解任意规模的问题。
习题2-5 XYZ公司宣称他们最新研制的微处理器运行速度为其竞争对手ABC公司同类产品的100倍。
对于计算复杂性分别为n,n^2,n^3和n!的各算法,若用ABC公司的计算机能在1小时内能解输入规模为n的问题,那么用XYZ公司的计算机在1小时内分别能解输入规模为多大的问题?解答:n'=100nn'^2=100n^2得到n'=10nn'^3=100n^3得到n'=4.64nn'!=100n!得到n'<n+log100=n+6.64习题2-6对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。
计算机算法设计与分析(王晓东第4版)第8章

Department of Electronic Information
30
Fun Time
z
=
9
+
21x2
−
3 4
x4
−
2x5,
s.t.
x3
−
1 2
x2
+
41x4
=
3
x1 x6
+ −
5 2
x2
5 2
x2
+ −
41x4 43x4
+ +
2x5 = 10 +8x5 = 1
• 选出使目标函数增加的非基本变量作为入基变量 • z 行中的正系数非基本变量都满足要求
Department of Electronic Information
24
单纯形表
max z = −x2 + 3x3 − 2x5,
s.t.
x1
+
3x2
−
x3
+
2x5
=
7
x4 − 2x2 + 4x3 = 12
x2 x3 x5
z 0 -1 3 -2 x1 7 3 -1 2 x4 12 -2 4 0 x6 10 -4 3 8
Department of Electronic Information
23
单纯形算法的第 1 步–选取入基变量
• 查看单纯形表的第 1 行(也称之为 z 行)中标有非 基本变量的各列中的值
2x2 − 7x4 ≤ 0 x1 + x2 + x3 + x4 = 9
x2 − x3 + 2x4 ≥ 1 xi ≥ 0, i = 1, 2, 3, 4
计算机算法设计与分析(第4版)[王晓东][电子教案]第2章
![计算机算法设计与分析(第4版)[王晓东][电子教案]第2章](https://img.taocdn.com/s3/m/6ef58047f7ec4afe04a1df38.png)
2.1 递归的概念
例5 整数划分问题 前面的几个例子中,问题本身都具有比较明显的递归关系,因 而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关 系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个 数记作q(n,m)。可以建立q(n,m)的如下递归关系。
A(1,0) 2 A(0, m) 1 m0 A(n,0) n 2 n2 A(n, m) A( A(n 1, m), m 1) n, m 1
2.1 递归的概念
例3 Ackerman函数 前2例中的函都可以找到相应的非递归方式定义:
n! 1 2 3 (n 1) n
T(n)
n/2
=
n/2
n
n/2 n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
算法总体思想
将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
1 q ( n, n ) q ( n, m ) 1 q (n, n 1) q ( n, m 1) q (n m, m)
正整数n的划分数p(n)=q(n,n)。
n 1, m 1 nm nm n m 1
2.1 递归的概念
例6 Hanoi塔问题 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这 些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号 为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍 按同样顺序叠臵。在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中 任一塔座上。
算法设计与分析-1-15

电子工业出版社
教材资料、课程情况
计算机算法设计与分析(第4版),王晓东编著,北京:电 子工业出版社,2012
—— 优缺点
Introdocution to Algotithms(2nd Ed), Cormen,T.H,
Leiserson, C.E.,Rivest, R., Stein,C.北京:高等教育出版社, 2002 必修课,11/12/13/14年, 增强解决问题能力; ACM程序设计竞赛,bupt;研究生复试;大公司应聘笔试
• 程序=数据结构 + 算法
(1)处理对象,输入、输出、中间结果、….
(2)处理过程
程序(Program)
• 程序可以不满足算法的性质(4)——有限性。 • 例如,操作系统,是一个在无限循环中执行的程序,某 些语句、模块反复执行,因而不是一个算法。
• 操作系统的各种任务可看成是单独的问题,每一个问题
(1)输入:有外部提供的量作为算法的输入。
(2)输出:算法产生至少一个量作为输出。
(3)确定性:组成算法的每条指令、语句是清晰,无歧义的。
(4)有限性:算法中每条指令的执行次数是有限的,执行每条 指令的时间也是有限的。
程序(Program)
• 程序:算法用某种程序设计语言的具体实现。 • 进程(process,“操作系统”课程):程序的一次执行 e.g. Windows任务管理器
• CSP例题
注意事项
成绩
期中,期末,作业 ;
掌握:1. 各章主要算法策略——5种策略
2. 算法设计策略应用于具体问题典型问题算法
3. 各章典型问题/算法设计 + 分析 作业:各章典型问题/算法的编程实现(每章3个) 答疑、作业:助教 课堂纪律
计算机算法设计与研究(王晓东第4版)第4章

School of Computer and Communication Engineer
2
找零问题
问题描述: 假设有顾客在超市购买物品价值 2.5 元, 支 付一张 20 元人民币, 请给出找零方案, 要求找给顾客的 零钱的数目最少?
• 10 元一张, 5 元一张, 1 元二张, 5 角一张.
• 共计5张.
n 元 0-1 向量 (x1, x2, . . . , xn), xi ∈ {0, 1}, 1 ≤ i ≤ n,
使得
n i=1
wixi
≤
c,
而且,Байду номын сангаас
n i=1
vixi
达到最大.
School of Computer and Communication Engineer
11
背包问题贪心算法基本步骤
• 首先计算每种物品单位重量的价值 vi/wi, 然后依贪心 选择策略, 将尽可能多的单位重量价值最高的物品装 入背包
School of Computer and Communication Engineer
19
Fun Time
考虑如下活动集合 S:
i 1 2 3 4 5 6 7 8 9 10 11 si 1 3 0 5 3 5 6 8 8 2 12 fi 4 5 6 7 9 9 10 11 12 14 16
• 子集 {a3, a9, a11} 为一相容活动集合 • 计算最大相容活动集合?
5
贪心算法产生最优解的条件
• 贪心选择性 • 最优子结构
School of Computer and Communication Engineer
6
贪心选择性质
定义 1. 若一个优化问题的全局最优解可以通过局部最 优选择得到, 则该问题称为具有贪心选择性.
计算机算法设计与分析(王晓东) 第5章 回溯法

n=3时的0-1背包问题用完全二叉树表示的解空间
5
生成问题状态的基本方法
扩展结点:一个正在产生儿子的结点称为扩展结点 活结点:一个自身已生成但其儿子还没有全部生成的节点称 做活结点 死结点:一个所有儿子已经产生的结点称做死结点 深度优先的问题状态生成法:如果对一个扩展结点R,一旦 产生了它的一个儿子C,就把C当做新的扩展结点。在完成 对子树C(以C为根的子树)的穷尽搜索之后,将R重新变 成扩展结点,继续生成R的下一个儿子(如果存在) 宽度优先的问题状态生成法:在一个扩展结点变成死结点 之前,它一直是扩展结点 回溯法:为了避免生成那些不可能产生最佳解的问题状态, 要不断地利用限界函数(bounding function)来处死那些实际 上不可能产生所需解的活结点,以减少问题的计算量。具 有限界函数的深度优先生成法称为回溯法
}
18
n后问题
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象 棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线 上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任 何2个皇后不放在同一行或同一列或同一斜线上。
1 2 3 4 5 6 7 8 Q Q Q Q Q Q Q
void backtrack (int i) {// 搜索第i层结点 if (i > n) // 到达叶结点 更新最优解bestx,bestw; return; r -= w[i]; if (cw + w[i] <= c) {// 搜索左子树 x[i] = 1; cw += w[i]; backtrack(i + 1); cw -= w[i]; } if (cw + r > bestw) { x[i] = 0; // 搜索右子树 backtrack(i + 1); } r += w[i];
计算机算法设计与分析(第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)。
计算机算法设计与分析【王晓东-电子工业出版社-2版】-第3章

void MatrixChain(int* p,int n,int m[][6],int s[][6])
#include "stdafx.h" #include <iostream.h>
{ for (int i = 1; i <= n; i++) {m[i][i] = 0; s[i][i] = 0;}
计算机算法设计与分析 【王晓东-电子工业出版
社-2版】-第3章
2021年8月5日星期四
学习要点:
理解动态规划算法的概念。 掌握动态规划算法的基本要素 (1)最优子结构性质 (2)重叠子问题性质 掌握设计动态规划算法的步骤。 (1)找出最优解的性质,并刻划其结构特征。 (2)递归地定义最优值。 (3)以自底向上的方式计算出最优值。 (4)根据计算最优值时得到的信息,构造最优解。
矩阵连乘问题
穷举法 动态规划
将矩阵连乘积 Ai Ai1...Aj 简记为A[i:j] ,这里i≤j
考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵 Ak和Ak+1之间将矩阵链断开,i≤k<j,则其相应完全
加括号方式为 ( Ai Ai1...Ak )( Ak1Ak2...Aj )
计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上 A[i:k]和A[k+1:j]相乘的计算量
上海金融学院信息管理系
矩阵连乘问题
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1, 2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次 序计算矩阵连乘积需要的数乘次数最少。
穷举法:列举出所有可能的计算次序,并计算出每一种计 算次序相应需要的数乘次数,从中找出一种数乘次数最少的 计算次序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
渐近分析记号的若干性质
• (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));
问题求解(Problem Solving)
理解问题 精确解或近似解
选择数据结构 算法设计策略
设计算法 证明正确性
分析算法 设计程序
算法复杂性分析
• 算法复杂性 = 算法所需要的计算机资源 • 算法的时间复杂性T(n); • 算法的空间复杂性S(n)。 • 其中n是问题的规模(输入大小)。
算法的时间复杂性
行每条指令的时间也是有限的。
程序(Program)
• 程序是算法用某种程序设计语言的具体实现。 • 程序可以不满足算法的性质(4)。 • 例如操作系统,是一个在无限循环中执行的程序,因
而不是一个算法。 • 操作系统的各种任务可看成是单独的问题,每一个问
题由操作系统中的一个子程序通过特定的算法来实现。 该子程序得到输出结果后便终止。
Байду номын сангаас第1章 算法概述
学习要点: • 理解算法的概念。 • 理解什么是程序,程序与算法的区别和内在联系。 • 掌握算法的计算复杂性概念。 • 掌握算法渐近复杂性的数学表述。 • 掌握用C++语言描述算法的方法。
算法(Algorithm)
• 算法是指解决问题的一种方法或一个过程。 • 算法是若干指令的有穷序列,满足性质: • (1)输入:有外部提供的量作为算法的输入。 • (2)输出:算法产生至少一个量作为输出。 • (3)确定性:组成算法的每条指令是清晰,无歧义的。 • (4)有限性:算法中每条指令的执行次数是有限的,执
• (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
• f(n)= o(g(n)) g(n)= (f(n)) ;
• (5)算术运算: • O(f(n))+O(g(n)) = O(max{f(n),g(n)}) ; • O(f(n))+O(g(n)) = O(f(n)+g(n)) ; • O(f(n))*O(g(n)) = O(f(n)*g(n)) ; • O(cf(n)) = O(f(n)) ; • g(n)= O(f(n)) O(f(n))+O(g(n)) = O(f(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)) ;
• 等式和不等式中渐近记号O,o, 和的意义是类似的。
渐近分析中函数比较
• f(n)= O(g(n)) a b; • f(n)= (g(n)) a b; • f(n)= (g(n)) a = b; • f(n)= o(g(n)) a < b;
• f(n)= (g(n)) a > b.
• 定理1: (g(n)) = O (g(n)) (g(n))
渐近分析记号在等式和不等式中的意义
• f(n)= (g(n))的确切意义是:f(n) (g(n))。 • 一般情况下,等式和不等式中的渐近记号(g(n))表示
(g(n))中的某个函数。 • 例如:2n2 + 3n + 1 = 2n2 + (n) 表示 • 2n2 +3n +1=2n2 + f(n),其中f(n) 是(n)中某个函数。
0 cg(n) f(n) }
• (3)非紧上界记号o
• o(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0
>0使得对所有n n0有:0 f(n)<cg(n) } • 等价于 f(n) / g(n) 0 ,as n。
• (4)非紧下界记号 • (g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0
• 规则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和自然数n2, 使得对所有n n2,有g1(n) c2g(n) 。
>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
有:c1g(n) f(n) c2g(n) }
• 其中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)略去低阶
项留下的主项。它比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有: