算法设计与分析耿国华第七章
耿国华数据结构习题答案
第一章答案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]));。
《数据结构-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;[提示]:1/2 = = (1+12)/2i=1时:1 = (1+1)×1/22/2 = = (2+22)/2i=2时:1+2= (1+2)×2/23/2 = = (3+32)/2i=3时:1+2+3= (1+3)×3/2…n/2 = = (n+n2)/2i=n时:1+2+3+……+n= (1+n)×n/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,输出为Pn(x)通常算法的输入和输出可采用下列两种方式之一:法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
算法设计与分析课后答案
5..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:●如果d整除u和v, 那么d一定能整除u±v;●如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.21.(农夫过河)P—农夫W—狼G—山羊C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5.描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法DectoBin(n)//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进.算法MinDistance(A[0..n-1])//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.31.考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表‖60,35,81,98,14,47‖排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表‖60,35,81,98,14,47‖排序的过程如下所示:b.该算法不稳定.比如对列表‖2,2*‖排序c.该算法不在位.额外空间for S and Count[]4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i 个元素(1<=i<=n)b.删除有序数组的第i 个元素(依然有序) hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array ’s element(e.g., 0 for an array of positive numbers ) to mark the i th position is empty. (―lazy deletion ‖)第2章 习题2.17.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n )∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。
算法设计与分析耿国华第四章
Chapter
4
4.1.5 贪心算法的例子 ——算法分析
1)贪心选择性质
证明:设背包按其单位价值量pi/wi由高到低排序,(x1,x2,…,xn) 是背包问题的一个最优解。又设 k m in i x 0 易知,如果给定问题有解,则 1 k n 。 当k=1, (x1,x2,…,xn)是以贪心算法开始的最优解。 当k>1, 设有一个集合(y1,y2,…,yn),其中y1=pk/p1*xk, yk=0, yi=xi ,2 i n . 则 w y w x w x w * p / p *x
Chapter
4
4.2 汽车加油问题
本节内容 1.问题分析 2.算法分析 3.设计与实现
Chapter
4
4.2 汽车加油问题
• 问题描述
一辆汽车加满油后可以行驶N千米。旅途中有若干个加 油站,如图4-1所示。指出若要使沿途的加油次数最少,设 计一个有效的算法,指出应在那些加油站停靠加油(前提: 行驶前车里加满油)。
Chapter
4
4.2 汽车加油问题 ——算法分析
2)最优子结构性质
•
当一个大问题的最优解包含着它的子问题的最优解时,称 该问题具有最优子结构性质。 (b[1],b[2],……b[n]) 整体最优解 b[1]=1,(b[2],b[3],……b[n]) 局部最优解 每一次加油后与起点具有相同的条件,每个过程都是相 同且独立。
•
Chapter
4
4.1.5 贪心算法的例子
•
(3)选利润/重量为量度,使每一次装入的物品应使它占用的每一 单位容量获得当前最大的单位效益。 按物品的pi/wi重量从大到小排序:1,2,0; 解为: (x0,x1,x2)=(0, 1, 1/2) 收益: 24+15/2=31.5 此方法解为最优解。可见,可以把pi/wi 作为背包问题 的最优量度标准。
耿国华数据结构习题及答案
第一章习题答案2、××√3、(1)包含改变量定义的最小范围(2)数据抽象、信息隐蔽(3)数据对象、对象间的关系、一组处理数据的操作(4)指针类型(5)集合结构、线性结构、树形结构、图状结构(6)顺序存储、非顺序存储(7)一对一、一对多、多对多(8)一系列的操作(9)有限性、输入、可行性4、(1)A(2)C(3)C5、语句频度为1+(1+2)+(1+2+3)+…+(1+2+3+…+n)第二章习题答案1、(1)一半,插入、删除的位置(2)顺序和链式,显示,隐式(3)一定,不一定(4)头指针,头结点的指针域,其前驱的指针域2、(1)A(2)A:E、AB:H、L、I、E、AC:F、MD:L、J、A、G或J、A、G(3)D(4)D(5)C(6)A、C3、头指针:指向整个链表首地址的指针,标示着整个单链表的开始。
头结点:为了操作方便,可以在单链表的第一个结点之前附设一个结点,该结点的数据域可以存储一些关于线性表长度的附加信息,也可以什么都不存。
首元素结点:线性表中的第一个结点成为首元素结点。
4、算法如下:int Linser(SeqList *L,int X){ int i=0,k;if(L->last>=MAXSIZE-1){ printf(“表已满无法插入”);return(0);}while(i<=L->last&&L->elem[i]<X)i++;for(k=L->last;k>=I;k--)L->elem[k+1]=L->elem[k];L->elem[i]=X;L->last++;return(1);}5、算法如下:#define OK 1#define ERROR 0Int LDel(Seqlist *L,int i,int k){ int j;if(i<1||(i+k)>(L->last+2)){ printf(“输入的i,k值不合法”);return ERROR;}if((i+k)==(L->last+2)){ L->last=i-2;ruturn OK;}else{for(j=i+k-1;j<=L->last;j++)elem[j-k]=elem[j];L->last=L->last-k;return OK;}}6、算法如下:#define OK 1#define ERROR 0Int Delet(LInkList L,int mink,int maxk){ Node *p,*q;p=L;while(p->next!=NULL)p=p->next;if(mink<maxk||(L->next->data>=mink)||(p->data<=maxk)) { printf(“参数不合法”);return ERROR;}else{ p=L;while(p->next-data<=mink)p=p->next;while(q->data<maxk){ p->next=q->next;free(q);q=p->next;}return OK;}}9、算法如下:int Dele(Node *S){ Node *p;P=s->next;If(p= =s){printf(“只有一个结点,不删除”);return 0;}else{if((p->next= =s){s->next=s;free(p);return 1;}Else{ while(p->next->next!=s)P=p->next;P->next=s;Free(p);return 1;}}}第三章习题答案2、(1)3、栈有顺序栈和链栈两种存储结构。
数据结构 耿国华 西北大学 7-9最短路径问题-迪杰斯特拉算法
例:
5
99
0
30
顶点0到各点的最短路径
60
终
4点
第二次
1
10
10
20
1
2
5 2 50 3
3
∞ 10(0-2) 60(0∞-2-3)
带权有向图
4
已求出最短路径的终点的集合
S={ 1 2 3 4 5 }
5
30(0-4) 99(0-5)
例:
5
99
0
30
顶点0到各点的最短路径
60
终
4点
第三次
1
10
10
20
它或者是直接从源点到该点(只含一条弧); 或者 5 是从源点经过已求得最短路径的顶点,再到达该顶点。
例:
5
99
0
30
顶点0到各点的最短路径
60
终
4点
第一次
1
10
10
20
1
2
5 2 50 3
3
∞ 10(0-2)
∞
带权有向图
4
已求出最短路径的终点的集合
S={ 1 2 3 4 5 }
5
30(0-4) 99(0-5)
第7章 图
7.9最短路径问题—迪杰斯特拉算法
求某一顶点到其余各顶点的最短路径
迪杰斯特拉算法的实现 1) 存储结构
(1) 带权邻接矩阵数组g.arcs :
用g.arcs [i][j]表示弧<vi, vj>上的权。
(2) 顶点分为两组: S,V-S
S中存放已求得最短路径的终点的集合。
(3) 辅助一维数组dist:
若vi∈S ,dist[i] 表示源点到vi的最短路径长度
《算法设计与分析》第07章
算法的时间复杂度 若G采用邻接表表示,总计算时间为:
3. 向后处理策略求解
设 BP(i,j)是一条从源点s到Vi中的结点j的最小成本路径, BCOST(i,j)是这条路径的成本。
1) 向后递推式
BCOST(k,t)=0
2) 递推过程
★ 第2段 c(1,j) COST(2,j) = ∞ <1,j>∈E
7.1.1 一般方法
最优性原理指出,一个最优策略具有这样的性 质,不论过去状态和决策如何,对前面的决策所 形成的状态而言,其余决策必定构成最优策略。 这便是最优决策序列的最优子结构特性。
利用动态规划求解问题的前提: 1) 证明问题满足最优性原理 如果对所求解问题证明满足最优性原理,则 说明用动态规划方法有可能解决该问题 2) 获得问题状态的递推关系式 获得各阶段间的递推关系式是解决问题的关 键。
根据D(5,12)的决策值向前递推求取最小成本路径: ● v4 = BD(5,12)=10 ● v3 = BD(4,BD(5,12)) = 7 ● v2 = BD(3,BD(4,BD(5,12))) = BD(3,7) = 2 故由s到t的最小成本路径是:1→2→7→10→12
7.1.4 资源分配问题
【程序7-1】多段图的向前递推算法 template<class T> void Graph<T>::FMultiGraph(int k,int *p) {//采用程序6-8的邻接表存储图G。 float *cost=new float[n]; int q,*d=new int[n]; cost[n-1]=0,d[n-1]=-1;
for (int j=n-2;j>=0;j--){ float min=INFTY; for (ENode<T> *r=a[j];r;r=r->nextArc) { int v=r->adjVex; if (r->w+cost[v]<min) { min=r->w+cost[v];q=v; } } cost[j]=min;d[j]=q; } p[0]=0;p[k-1]=n-1; for(j=1;j<=k-2;j++) p[j]=d[p[j-1]]; delete []cost;delete []d; }
算法设计与分析耿国华第一章
(2i 1) n
i 1
n
2
(2i 1) (2i 1) 2n 1 (n 1)
i 1 i 1
2
2n 1 n 2
故命题成立。
Chapter
1
1.5 算法复杂性分析方法
1.5.1 复杂度函数
1.5.2 最好、最坏和平均情况
1.5.3 渐进分析 1.5.4 阶的证明方法
Chapter
1
1.3 算法分析准则
分析准则
(4)高效率和低存能量 评价算法性能另一个要考虑的因素就是算法的运行效率,也 就是要估计一下按算法编制的程序在计算机上执行所耗费的时 间和所占用空间。 评价算法运行效率的主要技术指标是:算法运行的时间复杂 度和空间复杂度。
Chapter
1
1.4 算法分析基础
Chapter
1
1.1 引言----算法特性
• 算法特性
(1)有限性:
一个算法必须保证执行有限步之后结束
(2)确定性(无二义)
算法的每一步骤必须有确切的定义
(3)可行性
算法原则上能精确地运行。在现有条件情况下,是可以
实现的 。
Chapter
1
1.1 引言----算法特性• 算法特性(4)输入
一个算法有0个或多个输入,以刻画运算对象的初始情况
Chapter
1
1.1 引言----算法描述方式
• 算法的描述方式
(1)自然语言
所谓的“自然语言”指的是日常生活中使用的语言,如汉语、 英 语。用自然语言进行描述通俗易懂,容易掌握,但是不 严谨、容易有二义性。
(2)框图(流程图)
它是用各种几何图形、流程线及文字说明来描述计算过程的 框图。直观地表示算法的整个结构,着重处理流程,便于检查 修改。但是它无法表达数据流程。
Eea_7_算法设计与分析
1、求解方式不同: 动态规划法:自底向上; 贪心法:自顶向下;
2、对子问题的依赖不同: 动态规划法:依赖于各子问题的解,所以应使各子问题最 优,才能保证整体最优; 贪心法:依赖于过去所作过的选择,但决不依赖于将来的 选择,也不依赖于子问题的解。
具有最优子结构性质的问题有些只能用动态规划法,13 有些可用贪心法。
达汇点t的最短路径的长度。cost(i,j)则是这些路径中的最短路
径长度。
16
9
7 源点s 0 3
2
14 2
1 2
7
3 11
6
5
2
5
4
63 5
11
7 6
48
8 4 2
9 5
10
11 t汇点
阶段 v1
v2
v3
v4
v5
使用式(7-1)向前递推式,由后向前计算最优解值—cost(1,0)
cost(5,11)=0,
矛盾。
多段图的最优子结构性质得证!
15
多段图问题的递推式(向前递推)
由多段图问题的最优子结构性质,容易得到多段图问题的递推 式,从而由子问题的最优解来计算原问题的最优解:
多段图问题的向前递推式:(式7-1)
cos t(k,t) 0
cos t(i, j)
min
c( j, p) cos t(i 1, p)
19
(0, d(1,0)=2, d(2,2)=5, d(3,5)=9, d(4,9)=11)
程序7-1:多段图的向前递推动态规划算法
FMultiGraph(int k,int*p) //共k个阶段
{//带权有向图G (多段图)采用邻接表存储(见程序6-8)
精品课件-高级程序设计技术(C语言)(耿国华)-第7章
第7章 算 法
流程图就是用一些约定的几何图形来描述算法的。美国标 准化协会(ANSI)规定了一些常用的流程图符号,已为世界各国 程序工作者普遍采用。一些常用的流程图符号参见表7.1。其 中,
起止框:表示算法的开始和结束。一般内部只写“开始” 或“结束”。
处理框:表示算法的某个处理步骤,一般内部常常填写赋 值操作。
第7章 算 法
第7章 算 法
7.1 算法概述 7.2 迭代法 7.3 穷举搜索法 7.4 递推法 7.5 递归法 7.6 分治法 7.7 回溯法 7.8 贪婪法 习题7 实验7
第7章 算 法
7.1 算 法 概 述 7.1.1 算法定义
对于计算机科学来说,算法(algorithm)的概念是至关重 要的。例如在一个大型软件系统的开发中,设计出更有效的算 法将对开发起决定性的作用。通俗地讲,算法是指解决问题的 一种方法或一个过程。更严格地讲,算法是由若干条指令组成 的有穷序列,其中每个指令表示一个或多个操作,且算法满足 下述几条性质:
第7章 算 法
main()
{
int n;
printf("Please Enter a int(>0):");
scanf("%d",&n);
printf("The procedure is:\n");
printf("%d",n);
while(n>1)
{Leabharlann if(n%2==0) /*偶数*/
n=n/2;
else
据能够得到满足要求的结果。 (4) 对于一切合法的输入数据都能产生满足要求的结果。 对于这四层含义,要达到第(4)层正确是极为困难的。一般
- 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]进行排序。