算法设计与分析耿国华第七章
耿国华数据结构习题答案

第一章答案1.3计算以下程序中x=x+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;【解答】x=x+1的语句频度为:T(n)=1+(1+2)+〔1+2+3〕+……+〔1+2+……+n〕=n(n+1)(n+2)/61.4试编写算法,求p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。
注意:此题中的输入为a i(i=0,1,…n)、x和n,输出为P n(x0)。
算法的输入和输出采用以下方法〔1〕通过参数表中的参数显式传递〔2〕通过全局变量隐式传递。
讨论两种方法的优缺点,并在算法中以你认为较好的一种实现输入输出。
【解答】〔1〕通过参数表中的参数显式传递优点:当没有调用函数时,不占用存,调用完毕后形参被释放,实参维持,函数通用性强,移置性强。
缺点:形参须与实参对应,且返回值数量有限。
〔2〕通过全局变量隐式传递优点:减少实参与形参的个数,从而减少存空间以及传递数据时的时间消耗缺点:函数通用性降低,移植性差算法如下:通过全局变量隐式传递参数PolyValue(){ int i,n;float x,a[],p;printf(“\nn=〞);scanf(“%f〞,&n);printf(“\nx=〞);scanf(“%f〞,&x);for(i=0;i<n;i++)scanf(“%f 〞,&a[i]); /*执行次数:n次*/p=a[0];for(i=1;i<=n;i++){ p=p+a[i]*x; /*执行次数:n次*/x=x*x;}printf(“%f〞,p);}算法的时间复杂度:T(n)=O(n)通过参数表中的参数显式传递float PolyValue(float a[ ], float x, int n){float p,s;int i;p=x;s=a[0];for(i=1;i<=n;i++){s=s+a[i]*p; /*执行次数:n次*/p=p*x;}return(p);}算法的时间复杂度:T(n)=O(n)第二章答案2.7试分别以不同的存储构造实现单线表的就地逆置算法,即在原表的存储空间将线性表〔a1,a2,…,a n〕逆置为(a n,a n-1,…,a1)。
(陈慧南 第3版)算法设计与分析——第7章课后习题答案

③ 其余元素
w[0][2] q[2] p[2] w[0][1] 15
k 1: c[0][0] c[1][2] c[0][2] min k 2 : c[0][1] c[2][2] w[0][2] 22 r[0][2] 2
17000
s[0][2]
0
m[1][3]
min
k k
1: m[1][1] m[2][3] 2 : m[1][2] m[3][3]
p1 p2 p4 p1 p3 p4
10000
s[1][3]
2
m[1][3]
min
k k
0 : m[0][0] m[1][3] 1: m[0][1] m[2][3]
第七章课后习题
姓名:赵文浩 学号:16111204082 班级:2016 级计算机科学与技术 7-1 写出对图 7-19 所示的多段图采用向后递推动态规划算法求解时的计算过程。
3
1
3
1
6
5
0
2
6
6
3
4
4 6
5
2
7
8
3
2
8
5
2
7
解析:
V 5 cost(5,8) 0 d (5,8) 8
V4
cos t(4, 6) minc(6,8) cos t(5,8) 7 cos t(4, 7) minc(7,8) cos t(5,8) 3
k 1: c[0][0] c[1][3] c[0][3] min k 2 : c[0][1] c[2][3] w[0][3] 25
数据结构-用C语言描述习题及答案-耿国华

第1章绪论习题一、问答题1.什么是数据结构?2.四类基本数据结构的名称与含义。
3.算法的定义与特性。
4.算法的时间复杂度。
5.数据类型的概念。
6.线性结构与非线性结构的差别。
7.面向对象程序设计语言的特点。
8.在面向对象程序设计中,类的作用是什么?9.参数传递的主要方式及特点。
10.抽象数据类型的概念。
二、判断题1.线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2.算法就是程序。
3.在高级语言(如C、或 PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时: 1 = (1+1)×1/2 = (1+12)/2i=2时: 1+2= (1+2)×2/2 = (2+22)/2i=3时: 1+2+3= (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n= (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入a i(i=0,1,…,n), x和n,输出为P n(x0).通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
《算法设计与分析》课件第7章

使用哪一种表示法,取决于顶点集|V|中顶点之间的关系、 图中的顶点数以及边数|E|。|E|的规模可与|V|相当或与|V|2相 当(所有边可能相连)。如果是前者,则称该图是稀疏的,否 则称该图是稠密的。我们将在后续的章节中看到,|E|与|V|之 间的这个关系将会成为我们选择合适图算法的主要因素。
7.2 广度优先搜索
证明:使用反正法。设 p 是从顶点 v1 到顶点 vk 的最
短路径。将路径
p
分为:v1
p1i
~>
vi
pij
~>
vj
pjk
~>
vk
,则有
w(p)
= w(p1i) + w(pi j) + w(pjk)。现在,假设存在从 vi 到 vj 且满
足
w(p’i j) < w(pij)的路径为 p’i j。
则
p1i v1 ~>
图的另一种表示方法是邻接表表示法。这种方法只需要 与边数成正比的空间,由|V|个链表组成,每个顶点都有一个 链表。顶点u的链表存放由u出发所指向的顶点,也就是说, 存放(u,v)∈E的那些顶点v。因此,如果图为有向图,则每 条边只在一个链表中出现; 如果图为无向图,则每条边在 两个链表中出现。无论是哪种情况,数据结构的总规模为 O(|E|)。在这种情况下,检查某条边(u,v)不再为常量时间, 因为这个过程需要查找u的邻接表。但通过一个顶点的所有 近邻还是可以比较容易地完成这个过程。我们很快就可知, 这个过程证明是图算法中的一个很有用的操作。对于无向图, 这种表示是对称的,当且仅当u在v的邻接表中,v在u的邻接 表中。
Eπ={(π[v], v)∈E:v∈Vπ-{s}}
算法所产生的π值具有如下性质:在算法终止时,Gπ就 是最短路径树。这棵树以源点s为根,包含了由s可达的每个 顶点的一条最短路径。因此,以s为根的最短路径树是有向 子图G′=(V′, E′),其中V′V,E′ E,满足:
数据结构 耿国华 西北大学 7-5最小生成树-动画演示

5
6
小 D 6 6 18 14
生 成 树
E F
1291
11
18 14
33
33
Step1. 初始化。选取种子 顶点,种子顶点构成最优 路段网,其余顶点构成外 围网。初始化Closedge。
A
16 B
21
1
2
3
4
5
6
A A A A A A U 19
F
C
A B C D E FV
0 16 ∞ ∞ 19 21 w
Closedge数组
F
21 Step3. 更新Closedge, 11 确保每组边是最优路段网
到外围网路径中最小的。
14
33
A
16
B
5
6
11
AB U 19
F
C
FV
6
2111 w
E
D
最小生成树——Prim算法
AB C DE
A 16 19
B 16 5 6
最M
C
5
6
Hale Waihona Puke 小 D 6 6 18E
D
Closedge数组
最小生成树——Prim算法
AB C DE
A 16 19
B 16 5 6
最M
C
5
6
小 D 6 6 18
生 成 树
E F
1291
11
18 14
33
1
2
3
4
5
A A AB AB A
ABCDE
0 0 ∞5 ∞6 19
Closedge数组
F
21 Step3. 更新Closedge, 11 确保每组边是最优路段网
《算法设计与分析》第07讲精品PPT课件

不同的活结点表形成不同的分枝限界法,分为: FIFO分枝限界法、LIFO分枝限界法和LC(least cost)分枝限界法。三种不同的活结点表,规定了 从活结点表中选取下一个E-结点的不同次序。
FIFO分枝限界法的活结点表是先进先出队列 LIFO分枝限界法的活结点表是堆栈; LC分枝限界法的活结点表是优先权队列,LC分 枝限界法将选取具有最高优先级的活结点出队列, 成为新的E-结点。
2
3 5 2 4
19 6
18
3
16 4 7 16
10 20 0 13 14 2 1 3 0 16 3 15 12 0 3 12
1 10
0
2
2 2
0
3
4
上海海洋大学信息学院2009-12-2
归约列
10 20 0 13 14 2 1 3 0 16 3 15 12 0 3 12
iJ,i 1..n iJ,im i m1,...,n
ĉ(X) c(X) u(X)
上海海洋大学信息学院2009-12-2
可变大小元组状态空间树
上海海洋大学信息学院2009-12-2
7. 3 货郎担问题的分支限界法
上海海洋大学信息学院2009-12-2
问题描述
旅行商问题(travelling salesperson)是一个看似 简单其实十分难解的著名难题之一,至今仍有许多 人在研究它。此问题描述为:一个旅行商准备到n 个村庄售货。他从A村出发经过其它n-1个村庄,又 回到出发地A村。现要求一条最短路径,使得每个 村庄都经过且仅经过一次。
收益之和,使得总收益最大的作业子集是问题的最
优解。如果希望以最小值为最优解,则可以适当改
算法分析与设计(习题答案)

算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解: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); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。
算法设计与分析第7章作业.pdf

「算法设计与分析」第7章作业2015.10学号: 15S103172 姓名: 谢浩哲1.在下图中考虑哈密顿环问题. 将问题的解空间表示成树, 并分别利用深度优先搜索和广度优先搜索判定该图中是否存在哈密顿环.问题解空间的树状结构:算法概述:从起始点出发, 搜索从这个点出发所有可到达的点(深度优先或广度优先策略均可). 对于每到达一个点, 判断: 是否已经回到起始点, 是否经过重复的点. 若经过了重复了点, 则不再搜索. 若到达了起始点, 并且恰好经过了所有的点, 则找到了最优解.算法实现:深度优先搜索:35}广度优先搜索:!isVisited(startPoint, i,372.考虑8-魔方问题. 分别用深度优先算法, 广度优先算法, 爬山法, 最佳优先方法判定上图所示的初始格局能够通过一系列操作转换成目标格局, 将搜索过程的主要步骤书写清楚.问题的部分解空间树状结构:深度优先搜索:搜索顺序为1 -> 2 -> 4 -> 10 -> …广度优先搜索:搜索顺序为1 -> 2 -> 3-> 4 -> 5 -> 6 -> …爬山法:基于深度优先搜索, 选取当前分支上最优解;搜索顺序为1 -> 2 -> 4 -> 11 -> …最佳优先方法:基于深度优先搜索, 选取所有分支上最优解;搜索顺序为1 -> 2 -> 4 -> 11 -> …3.分别使用深度优先法和分支限界法求解子集和问题的如下实例.输入: 集合S=7, 4, 6, 13, 20, 8和整数K=18.输出: S’使得S’中元素之和等于K.深度优先搜索:问题的部分解空间如下如所示:算法实现:分枝限界法可以在深度优先搜索时进行必要的剪枝, 例如对于分支7-4. 此时的分支上的和为11, 因此该分支上的数最大不可能超过18 - 11 = 7. 因此可见, 在深度优先搜索中搜索的13和8这两个分支其实可以进行剪枝. 其他分支亦然.算法实现:只需将以上代码的17行替换为:if ( !isSelected[i] &&4.将任意一整数n划分为若干整数之和的划分, 并按照降序的序列输出出来, 例如5的划分为: 5, 4+1,3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1.问题解空间的树状图:算法实现(深度优先搜索):import java.util.ArrayList;public List<List<Integer>> getSplit(int n,1725 List<Integer> newSplit =new ArrayList<Integer>(currentSplit);5.在一个一维空间上有n个点1, 2, 3, 4, …, n, 有一个粒子它初始位置为1, 粒子从初始位置1开始做随机运动, 方向只有左右两个, 每次运动结束该粒子就会移动到相邻的位置上. 已知该粒子在i(1<i<n)点位置上向左运动的概率为p i, 该粒子在1点只能向右运动, 在n点只能向左运动, 那么请问该粒子在t次运动后它最有可能出现在哪个点上, 以及输出该粒子向右运行距离的期望值.对于n=5的问题解空间的树状图:算法实现(广度优先搜索):15public Queue<Point> getFinalPositions(25q.offer(new Point(cp.coordinate + 1,31 q.offer(new Point(cp.coordinate - 1,cp.probability * p[cp.coordinate]));。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3)合并:由于对a[p:q-1]和a[q+1:r]的 排序是就地进行的,所以在a[p:q-1]和 a[q+1:r]都已排好序后,不需要执行任何 计算,a[p:r]就已排好序。
Chapter
7
7.3 舍伍德算法
2.线性时间选择算法
对于给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出 这n个元素中第k小元素,即如果将这n个元素按照线性顺序排列 时,排在第k个位置的元素即为要找的元素。它的基本思想也是 对输入数组进行递归划分处理。与快速排序不同的是,该算法 只对划分出的子数组之一进行递归处理。 (1)数组a[p:r]被划分成两个子数组a[p:i]和a[i+1:r],使 a[p:i]中的每个元素都不大于a[i+1:r]中的每个元素。接着计 算子数组a[p:i]中元素个数j。 (2)如果k≤j,则a[p:r]中第k小元素落在子数组a[p:i]中。 (3)如果k>j,则要找的第k小元素落在子数组a[i+1:r]中。由 于此时已知道子数组a[p:i]中元素均小于要找的第k小元素,因 此,要找的a[p:r]中第k小元素是a[i+1:r]中的第k-j小元素。
Chapter
1
7.2 数值随机算法
•
• • • • • • • • • • • • •
算法7.2 用随机投点法计算值
double Darts(int n) { static RandomNumber dart;//随机数对象 int k=0; for (int i=1;i <=n;i++) { double x=dart.fRandom();//产生[0,1)之间的随机实数 double y=dart.fRandom(); //判断条件为(x*x+y*y)<=1,表示当前随机处于圆内 if ((x*x+y*y)<=1) k++; } return 4*k/double(n); }
t A (n)
xXn
t
A
( x)/ | X n |
这不能排除存在x∈ X n 使得 t A ( x) t A (n) 的可能性。我们希望获 得一个随机算法B,使得对问题的输入规模为n的每一个实例 x∈Xn,均有:
t B ( x) t A (n) s(n)
当s(n)与 t A (n) 相比可忽略时,舍伍德算法可 获得很好的平均性能。
•
• • • • • • • • • • • • • • • •
算法7.1 随机数类
//随机数类 const unsigned long maxshort =65536L; const unsigned long multiplier =1194211693L; const unsigned long adder =12345L; class RandomNumber { private: unsigned long randSeed; //当前种子 public: //构造函数,默认值0表示由系统自动 产生种子 RandomNumber(unsigned long s=0); //产生0:n-1 之间的随机的整数 unsigned short Random(unsigned long n); //该函数的参数n<=65536; //产生[0,1)之间的随机实数 double fRandom(void); };
•
随机数是由试验(如摸球或抽签)产生的随 机数,是专门的随机试验的结果。计算器 或计算机上无法产生真正的随机数,计算 器或计算机产生的随机数是通过一个固定 的、可以重复的计算方法产生的,具有周 期性(周期很长),具有类似随机数的统计特 征,但并不是真正的随机数,故叫伪随机 数。这样的发生器称为伪随机数发生器。
(b)
图7-1 计算值的随机投点法
Chapter
7
7.2 数值随机算法
•
问题分析:假定飞镖击中方形靶子任一点的概率相等。设圆的半 径为r,面积s1= r 2 ,方靶面积s2= 4r 2 。由等概率假设可知, 2 落入圆中的飞镖和正方形内的飞镖平均数目之比为: k r 2 。 n 4r 4 4k 。 由此可得:
Chapter
7
7.1 随机算法基础
7.1.1 伪随机数
7.1.2 实例分析
Chapter
7
7.1 随机算法基础
伪随机数
• 7.1.1
• 例7-1
产生1到25之间的随机整数。 分析:将25个大小形状相同的小球分别标1,2,„,24,25 放入一个袋中,充分搅拌,从中摸出一个球,这个球上 的数就是得到的随机数。
• • • • • • • • • • • • • • • • •
//用线性同余式计算新的种子 RandomNumber::RandomNumber(unsig ned long s) { if(s==0) randSeed =time(0); //用系统 时间产生种子 else randSeed =s; //由用户提 供种子 } //生成0:n-1之间的随机数 Unsigned short RandomNumber::Random(unsigned long n) { RandSeed =multiplier*randSeed +adder; retrun(unsigned short)((randSeed>>16)%n); } //生成[0,1)之间的随机数 double RandomNumber::fRandom(void) { return Random(maxshort)/double(maxshort); }
由线性同余法产生的随机序列满足:
Байду номын сангаас
a0 d an (ban1 c) modm
n 1,2,
其中b为乘数,b>=0;c为增量,c>=0;d称为 该随机序列的种子dm;m为模数,m>0,m应 取充分大,因此可取m为机器大数,另外应取 gcd(m,b)=1,因此可取b为一素数。
Chapter
•
Chapter
7
7.3 舍伍德算法
•
对于选择问题来说,采用拟中位数作为划分基准,可以保证 在最坏情况下用线性时间完成选择。最坏情况发生在划分过 程中产生的两个区域分别包含n-1个元素和1个元素的时候; 最好情况是每次划分所取的基准都正好为中值,即每次都产 生两个大小为n/2的区域。如果只简单地用待划分数组的第 一个元素作为划分基准,则算法的平均性能较好,而在最坏 情况下却需要计算时间。
Chapter
7
7.2 数值随机算法
数值随机化算法经常用于数值问题的求解。这类算法得到的往 往是近似解,且近似解的精度随计算时间的增加而不断增高。 例7-3 随机投点法计算Pi值 问题描述:将n根飞镖随机投向一正方形的靶子,如图7-1(a)所 示。计算落入此正方形的内切圆中的飞镖数目k。
• •
(a)
• • • • • • • • •
算法
设计与分析
算法设计与分析
第七章 随机算法
主编 耿国华
Chapter
7
本章内容
7.1 随机算法基础 • 7.1.1 伪随机数 • 7.1.2 实例分析 7.2 数值随机算法 7.3 舍伍德算法 • 7.3.1 基本的舍伍德型随机算法 • 7.3.2 线性表的快速查找 7.4 拉斯维加斯算法 • 7.4.1 拉斯维加斯算法的基本思想 • 7.4.2 分班问题 7.5 蒙特卡罗算法 • 7.5.1 蒙特卡罗算法的基本思想 • 7.5.2 蒙特卡洛算法的基本概念 • 7.5.3 主元素问题 • 7.5.4 素数测试 7.6 本章小结
•
舍伍德型选择算法以随机方式选择一个数组 元素作为划分基准,既能保证算法的线性时 间平均性能,又能有效避免计算拟中位数的 问题。
Chapter
7
7.3 舍伍德算法
例7-4 数组a[6]={5 8 2 15 32 3},k=3,l=1,r=6。计算数组a中的 第k小元素。
问题分析: 1)随机选择一个数: 15。交换a[0] 和15,此时以15作为划分基准。 1 5 8 2 5 3 2 3 2)划分数组:i初始化为0,j初始化为5。i从左向右,直到找到第一个大于划 分基准的元素停止,此时i=4。j从右向左,直到找到第一个比划分基准小的元素, 此时j=5。由于i<j,所以交换这两个位置上的元素。 1 5 8 2 5 3 3 2 3)继续查找,直到i>j。此时i=5,j=4。低区子数组中的元素个数5不等于k, 交换a[j]和划分基准元素。 3 8 2 5 1 5 3 2 4)低区子数组元素的个数大于k,则第k小元素在低区子数组中,改变右边界, 即r=3。此时只需在低区子数组中查找。 3 8 2 5 5)重复步骤1),得到 5 8 2 3 6)初始化i=0, j=3。重复步骤2),此时i=1,j=3。由于i<j,交换后的数组 为: 5 3 2 8 重复步骤3),此时i=3,j=2。低区子数组中的元素个数3等于k,则结果为: 划分基准的值5。
Chapter
7
7.3 舍伍德算法
•
算法7.4 随机洗牌算法 template<class Type> void Shuffle(Type a[], int n) { static RandomNumber rnd; for (int i=0;i<n;i++) { int j=rnd.Random(n-i)+i; Swap(a[i], a[j]); } }
Chapter
7
7.3 舍伍德算法
• 7.3.1 基本的舍伍德型随机化算法 • 1.快速排序算法
对于输入的子数组a[p:r],可按以下三个步骤进行排序。 (1)分解:以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q], a[q+1:r],使a[p:q-1]中任何一个元素小于等于a[q],而 a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过程中确 定。 (2)递归求解:通过递归调用快速排序算法分别对a[p:q-1]和 a[q+1:r]进行排序。