算法设计与分析 实验报告1

算法设计与分析 实验报告1
算法设计与分析 实验报告1

哈尔滨工业大学

<<算法设计与分析>>实验报告之一

(2015年度秋季学期)

实验一分治算法

一、实验目的

1.掌握分治算法的设计思想与方法;

2.熟练使用高级编程语言实现分治算法;

3.通过对比简单算法以及不同的分治求解思想, 体验分治算法.

二、实验内容

1.实现基于枚举方法的凸包求解算法

考虑Q中的任意四个点A、B、C、D, 如果A处于BCD构成的三角形内部, 那么A一定不属于凸包P 的顶点集合.

2.实现基于Graham-Scan的凸包求解算法

3.实现基于分治思想的凸包求解算法

4.对比三种凸包求解算法

1)实现随机生成正方形(0, 0)-(0, 100)-(100, 100)-(100, 0)内的点集合Q的算法;

2)利用点集合生成算法自动生成大小不同数据集合, 如点数大小分别为(1000, 2000, 3000…)的数

据集合;

3)对每个算法, 针对不同大小的数据集合, 运行算法并记录算法运行时间;

4)对每个算法, 绘制算法性能曲线, 对比算法.

三、实验过程及结果

1.基于枚举方法的凸包求解算法

1)算法思想

首先找到纵坐标最小的点P0, 作为凸包的一个顶点. 然后枚举另外3个点P i, P j和P k, 检查P i, P j, P k中的一个点是否位于其他两点与P0构成的三角形内. 如果是, 则删除该点.

我们知道, 给定平面上的点A, B, 直线AB上的点P满足直线方程g(A, B, P) = 0, 直线两侧的点分别满足条件g(A, B, P) > 0和g(A, B, P) < 0.

要判断P是否位于?P x P y P z内或边界上, 只需依次检查P和三角形的每个顶点是否位于三角形另外两个顶点确定直线的同一侧, 即g(P y, P z, P)g(P y, P z, P x) ≥0, g(P x, P z, P)g(P x, P z, P y) ≥0和g(P x, P y, P)g(P x, P y, P z) ≥0是否同时成立.

2)算法实现

11if ( points[i] == p0 || points[j] == p0 || points[k] == p0 ) {

13

} else if ( !points[i].isSelected

3)运行结果

2.基于Graham-Scan的凸包求解算法

1)算法思想

以纵坐标最小的点P0作为极点建立极坐标系, 并将所有的点按极角由小到大排序. 对于极角相同的点, 只保留距离P0最远的点. 设预处理后的点集为P[0:m].

算法开始前, 将P[0], P[1], P[2]入栈, 依次处理P[3], …, P[m]. 对于每一个点P[i], 判断栈顶元素Top是否位于P[0], P[i]栈顶下方元素NextToT op构成的三角形中, 如果是, 则弹出栈顶元素, 直至满足该条件后, 将当前点P[i]入栈.

由于点集是按极角大小排列的, 很显然, Top和NextToTop位于直线P[0]P[i]的同一侧, 同时P[i]和Top也位于直线P[0]NextToTop的同一侧, 因此若要判断Top是否位于P[0], P[i]和NextToTop构成的三角形中, 只需判断P[0]和Top是否位于直线P[i]和NextToT op的同一侧即可. 判断方法请参见上一节.

2)算法实现

import java.util.List;

while ( isPointInTriangle(pole, 33

3)运行结果

3.基于分治思想的凸包求解算法

1)算法思想

划分

根据横坐标的中位数将点集划分为S L和S R.

递归求解

递归调用求解左右两边的凸包.

合并

在左侧凸包内另取一点作为极点P, 再取左侧凸包中纵坐标最小的点A, 以P为极点, PA作为极轴建立极坐标系. 从A出发逆时针访问左侧凸包上的各个点, 并计算极角大小, 由此将左侧凸包的点排序. 对于右侧凸包, 获取纵坐标最大的点X和纵坐标最小的点Y. 计算右侧凸包中XY一侧的点的各个点的极坐标, 同理对于另一侧的点也如是操作. 在所有点的极坐标计算完成后, 可得到3个有序的极坐标序列. 利用归并排序的方法合并3个有序的序列, 再运行GrahamScan 算法即可得到合并后的凸包.

2)算法实现

import java.util.List;

23

List rightConvexHullPoints =

43 Point rightMaxYPoint =

getMaxYPoint(rightConvexHullPoints);

45if ( getPointOnLine(rightMaxYPoint,

rightMinYPoint, p) >= 0 ) {

threeWayMergeSort(leftConvexHullPoints, 53

getPointsArray(

3)运行结果

4.三种凸包求解算法的对比

1)算法实现正确性

我们使用同一数据集运行3个算法, 可得到相同的结果. 运行结果如下图所示.

2)算法运行时间

为防止测试的误差和偶然性, 因此我们对每个求解凸包的算法在同一个数据规模运行10次, 并计算平均时间. 需要说明的是, 测算Graham Scan算法运行时间时, 并没有包含排序的时间.

4000 56813.6 8.1 119.0

8000 411571.2 7.0 218.0 由以上数据可以绘制如下曲线图:

四、实验心得

这是一个非常有意思的实验, 为了验证算法的正确性, 我使用了一个测试类去比较三个算法的结果. 有时候会发现3个算法运行结果都不一样. 因此花费了相当多的时间在调试程序上. 因此, 在完成实验后非常有满足感. 分治算法真的非常难写, 而且书上给的思路也没有说到一些细节, 因此也花费了一些时间.

算法设计与分析习题答案1-6章

习题1 1. 图论诞生于七桥问题。出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现 在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次, 图是这条河以及河上的两个岛和七座桥的草 图。请将该问题的数据模型抽象出来,并判断此问题是否有解。 七桥问题属于一笔画问题。 输入:一个起点 输出:相同的点 1, 一次步行 2, 经过七座桥,且每次只经历过一次 3, 回到起点 该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。另一类是只有二个奇点的图形。 2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。请用伪代码描述这个版本的欧几里德算法 =m-n 2.循环直到r=0 m=n n=r r=m-n 3 输出m 3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。要求分别给出伪代码和C++描述。 编写程序,求n 至少为多大时,n 个“1”组成的整数能被2013整除。 #include using namespace std; int main() { double value=0; 图 七桥问题

for(int n=1;n<=10000 ;++n) { value=value*10+1; if(value%2013==0) { cout<<"n至少为:"< using namespace std; int main () { double a,b; double arctan(double x);圣经上说:神6天创造天地万有,第7日安歇。为什么是6天呢?任何一个自然数的因数中都有1和它本身,所有小于它本身的因数称为这个数的真因数,如果一个自然数的真因数之和等于它本身,这个自然数称为完美数。例如,6=1+2+3,因此6是完美数。神6天创造世界,暗示着该创造是完美的。设计算法,判断给定的自然数是否是完美数 #include using namespace std; int main() { int value, k=1; cin>>value; for (int i = 2;i!=value;++i) { while (value % i == 0 ) { k+=i;有4个人打算过桥,这个桥每次最多只能有两个人同时通过。他们都在桥的某一端,并且是在晚上,过桥需要一只手电筒,而他们只有一只手电筒。这就意味着两个人过桥后必须有一个人将手电筒带回来。每个人走路的速度是不同的:甲过桥要用1分钟,乙过桥要用2分钟,丙过桥要用5分钟,丁过桥要用10分钟,显然,两个人走路的速度等于其中较慢那个人的速度,问题是他们全部过桥最少要用多长时间? 由于甲过桥时间最短,那么每次传递手电的工作应有甲完成 甲每次分别带着乙丙丁过桥 例如: 第一趟:甲,乙过桥且甲回来

算法设计与分析 吕国英 习题答案第四章

算法设计与分析(第二版)主编:吕国英 习题答案 第四章 1. #include int main(void) { int buf[100]; int n; int i,j,k; scanf("%d",&n); for(i=0;i=10) { buf[j+1]+=buf[j]/10; buf[j]=buf[j]%10; } } for(i=n-1;i>=0;i--) printf("%d",buf[i]); printf("\n"); return 0; } 2. #include int main(void) { int n=2; int i;

for(i=1;i<=9;i++) { n=(n+2)*2; } printf("%d\n",n); return 0; } 3. #include int main(void) { int a=54; int n; int m; printf("计算机先拿3张牌\n"); a=a-3; while(a>=0) { printf("还剩%d张牌\n",a); printf("你拿几张?请输入:"); scanf("%d",&n); if(n>4||n<1||n>a) { printf("错误!重新拿牌\n"); continue; } a=a-n; printf("还剩%d张牌\n",a); if(a==0) break; m=5-n; printf("计算机拿%d\n",m); a=a-m; } return 0; } 4. #include int d; int a1,a2; int fun(int n); int main(void) { int n;

算法设计与分析习题答案1-6章.docx

习题 1 1.图论诞生于七桥问题。出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707— 1783) 提出并解决了该问题。七桥问题是这样描述的:北区 一个人是否能在一次步行中穿越哥尼斯堡(现 东区在叫加里宁格勒,在波罗的海南岸)城中全部岛区 的七座桥后回到起点,且每座桥只经过一次, 图是这条河以及河上的两个岛和七座桥的草南区 图。请将该问题的数据模型抽象出来,并判断图七桥问题 此问题是否有解。 七桥问题属于一笔画问题。 输入:一个起点 输出:相同的点 1,一次步行 2,经过七座桥,且每次只经历过一次 3,回到起点 该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。另一类是只有二个 奇点的图形。 2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。请用伪代码描述这个版本的欧几里德算法 =m-n 2.循环直到 r=0 m=n n=r r=m-n 3输出 m 3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。要求分别给出伪代 码和 C++描述。 编写程序,求 n 至少为多大时, n 个“1”组成的整数能被2013 整除。 #include using namespace std; int main() { double value=0;

for(int n=1;n<=10000 ;++n) { value=value*10+1; if(value%2013==0) { cout<<"n 至少为 :"< using namespace std; int main () { double a,b; double arctan(double x);圣经上说:神 6 天创造天地万有,第7 日安歇。为什么是6天呢?任何一个自然数的因数中都有 1 和它本身,所有小于它本身的因数称为这个数的真 因数,如果一个自然数的真因数之和等于它本身,这个自然数称为完美数。例如, 6=1+2+3,因此6 是完美数。神 6 天创造世界,暗示着该创造是完美的。设计算法,判断给定的自然数是否是完美数 #include using namespace std; int main() { int value, k=1; cin>>value; for (int i = 2;i!=value;++i) { while (value % i == 0 ) { k+=i;有 4 个人打算过桥,这个桥每次最多只能有两个人同时通过。他们都 在桥的某一端,并且是在晚上,过桥需要一只手电筒,而他们只有一只手电筒。这就意味 1着两个人过桥后必须有一个人将手电筒带回来。每个人走路的速度是不同的:甲过桥要用 分钟,乙过桥要用 2 分钟,丙过桥要用 5 分钟,丁过桥要用10 分钟,显然,两个人走路的 速度等于其中较慢那个人的速度,问题是他们全部过桥最少要用多长时间? 由于甲过桥时间最短,那么每次传递手电的工作应有甲完成 甲每次分别带着乙丙丁过桥 例如: 第一趟:甲,乙过桥且甲回来

算法设计与分析习题解答

第一章作业 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 1 log ≤∑=n i n 1 log =nlogn ,所以可得log(n!)= Ο(nlogn)。 ?由于对所有的偶数n 有, log(n!)= ∑=n i i 1 log ≥∑=n n i i 2 /log ≥∑=n n 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)。 综合以上两点可得log(n!)= Θ(nlogn) 2. 设计一个算法,求给定n 个元素的第二大元素,并给出算法在最坏情况下使用的比较次数。(复杂度至多为2n-3) 算法: V oid findsecond(ElemType A[]) { for (i=2; i<=n;i++) if (A[1]

算法设计与分析复习资料1

一 1.循环赛日程表问题的相关叙述。 2.算法运行时所需要占用的存储空间有? 3.动态规划法的求解步骤 4.解空间树是排列树的问题有。 5.分治法的步骤 6.就会场安排问题,贪心法的最佳贪心策略 7.快速排序法基准元素的选取方法 8.满足满m叉树的问题有? 9.分支限界法的解题步骤 10.事前分析法相关的影响因素有 11.用分治法求解的问题一般需要具备一些特征,主要有? 二 1.给定一个有向带权图G=(V,E),其中每条边的权是一个非负实数,另外,给定V中的一个顶点,称为源点。现在要计算从源点到所有其它各个顶点的最短路径长度,这里的路径长度是指路径上经过的所有边上的权值之和,这个问题通常称为单源最短路径问题。 2.采用回溯法可以求解0-1背包问题,其解空间的形式为:(x1,x2,…,xn)或n 元组。 3.当所给的问题是从n个元素的排列中找出满足某种性质的一个排列时,相应的解空间树称为排列树。 4.一个正在生成孩子的结点称为扩展结点。 5.子集树是用回溯法解题时经常遇到的一种典型的解空间树。当所给的问题是从n个元素组成的集合S中找出满足某种性质的一个子集时,相应的解空间树称为子集树。 6.当所给问题的n个元素中每一个元素均有m种选择,要求确定其中的一种选择,使得对这n个元素的选择结果组成的向量满足某种性质,即寻找满足某种特性的n个元素取值的一种组合,这类问题的解空间树称为满m叉树。 7.一个自身已生成但其孩子还没有全部生成的结点称为活结点 8.回溯法中,对于问题的一个实例,解向量满足显约束的所有n元组构成了该实例的一个解空间 9.分支限界法有两种:队列式分支限界法和优先队列式分支限界法。 10.分支限界法采用的是宽度优先搜索。 11.时间复杂性的度量方法通常有两种:事后统计法和事前分析估算法 12.一个所有孩子已经生成的结点称做死结点 13.在最小生成树的生成方法中,Kruskal算法从边的角度出发,每一次将图中的权值最小的边取出来,在不构成环的情况下,将该边加入最小生成树。 三 1.分治法字面上的解释是分而治之,就是把一个复杂的问题分成两个或更多的相同子问题,子问题相互独立,如果子问题还是不容易解决,再把子问题分成更小的子问题…,直到最后各个子问题可以简单地直接求解,对各个子问题递归求解,将子问题的解进行合并即得原问题的解。 2.动态规划法要求将大问题分解成规模较小的子问题,经分解得到的各个子问题往往不是相互独立的。在求解过程中,将已解决的子问题的解进行保存,在需要时可以轻松找出。采

算法设计与分析课程设计(完整版)

HUNAN CITY UNIVERSITY 算法设计与分析课程设计 题目:求最大值与最小值问题 专业: 学号: 姓名: 指导教师: 成绩: 二0年月日

一、问题描述 输入一列整数,求出该列整数中的最大值与最小值。 二、课程设计目的 通过课程设计,提高用计算机解决实际问题的能力,提高独立实践的能力,将课本上的理论知识和实际有机的结合起来,锻炼分析解决实际问题的能力。提高适应实际,实践编程的能力。在实际的编程和调试综合试题的基础上,把高级语言程序设计的思想、编程巧和解题思路进行总结与概括,通过比较系统地练习达到真正比较熟练地掌握计算机编程的基本功,为后续的学习打下基础。了解一般程序设计的基本思路与方法。 三、问题分析 看到这个题目我们最容易想到的算法是直接比较算法:将数组的第 1 个元素分别赋给两个临时变量:fmax:=A[1]; fmin:=A[1]; 然后从数组的第 2 个元素 A[2]开始直到第 n个元素逐个与 fmax 和 fmin 比较,在每次比较中,如果A[i] > fmax,则用 A[i]的值替换 fmax 的值;如果 A[i] < fmin,则用 A[i]的值替换 fmin 的值;否则保持 fmax(fmin)的值不变。这样在程序结束时的fmax、fmin 的值就分别是数组的最大值和最小值。这个算法在最好、最坏情况下,元素的比较次数都是 2(n-1),而平均比较次数也为 2(n-1)。 如果将上面的比较过程修改为:从数组的第 2 个元素 A[2]开始直到第 n 个元素,每个 A[i]都是首先与 fmax 比较,如果 A[i]>fmax,则用 A[i]的值替换 fmax 的值;否则才将 A[i]与 fmin 比较,如果 A[i] < fmin,则用 A[i]的值替换 fmin 的值。 这样的算法在最好、最坏情况下使用的比较次数分别是 n-1 和 2(n-1),而平均比较次数是 3(n-1)/2,因为在比较过程中,将有一半的几率出现 A[i]>fmax 情况。

算法设计与分析考试重点归纳

算法设计考试重点整理 题型: 一选择题(10*2=20 分) 二简答题(4*5=20 分) 三应用题(3*10=30 分) 四算法题(3*10=30 分) 第一、二章 算法的定义:解某一特定问题的一组有穷规则的集合(对特定问题求解步骤的一种描述,是指令的有限序列) 算法的特征:1)有限性 2)确定性 3)输入 4)输出 5)能行性 算法分析的目的: 基本数据结构: 线性结构(元素之间是一对一的关系) 用顺序存储结构存储的线性表称为顺序表 用链式存储结构存储的线性表称为链表。 树形结构(元素之间是一对多的关系) 图(网)状结构(元素之间是多对多的关系) 栈:是一种只允许在表的一端进行插入或删除操作的线性表。允许进行插入、删除操作的一端称为栈顶,另一端称为栈底。当栈中没有数据元素时,称之为空栈。栈的插入操作称为进压栈,删除操作称为出栈。 队列:只允许在一端进行插入操作,在另一端进行删除操作的线性表。允许进行插入操作的一端称为队尾。允许进行删除操作的一端称为队头。当队列中没有数据元素时,称之为空队列。队列的插入操作称为进队或入队。队列的删除操作称为退队或出队。 树:树型结构是一种非线性结构,它用于描述数据元素之间的层次关系图 图:G=(V,E)是一个二元组

其中:V是图G中数据元素(顶点)的非空有限集集合 E是图G中关系的有限集合 由表达式求渐进表达式:例:(n2+n)/4 n2/4(增长速率最快的那一项) 时间复杂度的计算:(P23) 性能的比较:O(1) < O(log2n) < O(n) < O(nlog2n) =O(nlogn)< O(n2) < O(n3) < O(n k) < O(2n) 第三章 算法思想、稳定性、时间复杂度、应用、排序的移动次数: 希尔排序(数据结构P265):先将待排序列分割为若干个子序列分别进行直接插入排序;待整个序列基本有序时,再对全体记录进行一次直接插入排序。也称缩小增量的直接插入排序。 希尔排序的时间复杂度在O(nlog2n)和 O(n2)之间,大致为O 合并排序(P59):设初始序列含有n个记录,则可看成n个表长为1的有序表将这n个有序表两两合并,则可得n/2个表长为2的有序表再将这n/2个有序表两两合并,则可得n/4个长为4的有序表依次重复,直到对2个表长为n/2的有序表两两合并得1个表长为n的有序表为止。 堆排序、堆调整(P62): 初始时把要排序的n个数的序列看作是一棵顺序存储的二叉树(一维数组存储二叉树),调整它们的存储序,使之成为一个堆,将堆顶元素输出,得到n 个元素中最小(或最大)的元素,这时堆的根节点的数最小(或者最大)。然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n 个元素中次小(或次大)的元素。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。 基数排序(P71):不进行记录关键字的比较,借助多关键字排序的思想对单逻辑关键字进行排序。 算法时间复杂度稳定性 希尔排序 O不稳定 快速排序 O(nlogn)不稳定

计算机算法设计与分析习题和答案解析

《计算机算法设计与分析》习题及答案 一.选择题 1、二分搜索算法是利用(A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是(A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4. 回溯法解旅行售货员问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 5.下列算法中通常以自底向上的方式求解最优解的是( B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 6、衡量一个算法好坏的标准是(C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 7、以下不可以使用分治法求解的是(D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 8. 实现循环赛日程表利用的算法是( A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 9.下面不是分支界限法搜索方式的是( D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先 10.下列算法中通常以深度优先方式系统搜索问题解的是( D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 11.备忘录方法是那种算法的变形。(B ) A、分治法 B、动态规划法 C、贪心法 D、回溯法 12.哈夫曼编码的贪心算法所需的计算时间为( B )。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 13.分支限界法解最大团问题时,活结点表的组织形式是( B )。 A、最小堆 B、最大堆 C、栈 D、数组 14.最长公共子序列算法利用的算法是( B )。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 15.实现棋盘覆盖算法利用的算法是( A )。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 16.下面是贪心算法的基本要素的是( C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解 17.回溯法的效率不依赖于下列哪些因素( D ) A.满足显约束的值的个数 B. 计算约束函数的时间 C.计算限界函数的时间 D. 确定解空间的时间 18.下面哪种函数是回溯法中为避免无效搜索采取的策略( B ) A.递归函数 B.剪枝函数C。随机数函数 D.搜索函数 19. ( D )是贪心算法与动态规划算法的共同点。

2009.1算法设计与分析报告课程期末试卷-A卷(自测 )

华南农业大学期末考试试卷(A卷) 2008学年第一学期考试科目:算法分析与设计 考试类型:(闭卷)考试时间:120 分钟 学号姓名年级专业 一、选择题(20分,每题2分) 1.下述表达不正确的是。 A.n2/2 + 2n的渐进表达式上界函数是O(2n) B.n2/2 + 2n的渐进表达式下界函数是Ω(2n) C.logn3的渐进表达式上界函数是O(logn) D.logn3的渐进表达式下界函数是Ω(n3) 2.当输入规模为n时,算法增长率最大的是。 A.5n B.20log2n C.2n2 D.3nlog3n 3.T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是。A.T(n)= T(n – 1)+1,T(1)=1 B.T(n)= 2n2 C.T(n)= T(n/2)+1,T(1)=1 D.T(n)= 3nlog2n 4.在棋盘覆盖问题中,对于2k×2k的特殊棋盘(有一个特殊方块),所需的L型骨牌 的个数是。 A.(4k– 1)/3 B.2k /3 C.4k D.2k 5.在寻找n个元素中第k小元素问题中,若使用快速排序算法思想,运用分治算法 对n个元素进行划分,应如何选择划分基准?下面答案解释最合理。A.随机选择一个元素作为划分基准 B.取子序列的第一个元素作为划分基准 C.用中位数的中位数方法寻找划分基准 D.以上皆可行。但不同方法,算法复杂度上界可能不同

6. 有9个村庄,其坐标位置如下表所示: 现在要盖一所邮局为这9个村庄服务,请问邮局应该盖在 才能使到邮局到这9个村庄的总距离和最短。 A .(4.5,0) B .(4.5,4.5) C .(5,5) D .(5,0) 7. n 个人拎着水桶在一个水龙头前面排队打水,水桶有大有小,水桶必须打满水, 水流恒定。如下 说法不正确? A .让水桶大的人先打水,可以使得每个人排队时间之和最小 B .让水桶小的人先打水,可以使得每个人排队时间之和最小 C .让水桶小的人先打水,在某个确定的时间t 内,可以让尽可能多的人打上水 D .若要在尽可能短的时间内,n 个人都打完水,按照什么顺序其实都一样 8. 分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分 别解决子问题,最后将子问题的解组合起来形成原问题的解。这要求原问题和子问题 。 A .问题规模相同,问题性质相同 B .问题规模相同,问题性质不同 C .问题规模不同,问题性质相同 D .问题规模不同,问题性质不同 9. 对布线问题,以下 是不正确描述。 A .布线问题的解空间是一个图 B .可以对方格阵列四周设置围墙,即增设标记的附加方格的预处理,使得算法简化对边界的判定 C .采用广度优先的标号法找到从起点到终点的布线方案(这个方案如果存在的话)不一定是最短的 D .采用先入先出的队列作为活结点表,以终点b 为扩展结点或活结点队列为空作为算法结束条件 10. 对于含有n 个元素的子集树问题,最坏情况下其解空间的叶结点数目为 。 A .n! B .2n C .2n+1 -1 D .∑=n i i n 1 !/! 答案:DACAD CACCB

算法设计与分析课后习题

第一章 1. 算法分析题 算法分析题1-1 求下列函数的渐进表达式 (1). 3n^2 + 10n < 3n^2 + 10n^2 = 13n^2 = O(n^2) (2). n^2 / 10 + 2^n 当n>5是,n^2 < 2 ^n 所以,当n >= 1时,n^2/10 < 2 ^n 故: n^2/10 + 2^n < 2 ^n + 2^n = 2*2^n = O(2^n) (3). 21 + 1/n < 21 + 1 = 22 = O(1) (4). log(n^3)=3log(n)=O(log(n)) (5). 10log(3^n) = (10log3)n = O(n) 算法分析题1-6 (1)因为:f(n)=log(n^2) = 2log(n); g(n) = log(n) + 5 所以:f(n)=Θ(log(n)+5) =Θ(g(n)) (2)因为:log(n) < √n; f(n) = 2log(n); g(n)= √n 所以:f(n) = O(g(n)) (3)因为:log(n) < n; f(n) = n; g(n) = log(n^2) = 2log(n) 所以;f(n) = Ω(g(n)) (4)因为:f(n) = nlogn +n; g(n) = logn 所以:f(n) =Ω(g(n)) (5)因为: f(n) = 10; g(n) = log(10)

所以:f(n) =Θ(g(n)) (6)因为: f(n)=log^2(n); g(n) = log(n) 所以: f(n) ==Ω(g(n)) (7)因为: f(n) = 2^n < 100*2^n; g(n)=100n^2; 2^n > n ^2 所以: f(n) = Ω(g(n)) (8)因为:f(n) = 2^n; g(n) = 3 ^n; 2 ^n < 3 ^n 所以: f(n) = O(g(n)) 习题1-9 证明:如果一个算法在平均情况下的计算时间复杂性为Θ(f(n)),该算法在最坏情况下所需的计算时间为Ω(f(n)). 分析与解答: 因此,Tmax(N) = Ω(Tavg(N)) = Ω(Θ(f(n)))=Ω(f(n)). 第二章 算法分析题

最新算法设计与分析复习要点(1)

算法设计与分析的复习要点 第一章:算法问题求解基础 算法是对特定问题求解步骤的一种描述,它是指令的有限序列。 一.算法的五个特征: 1.输入:算法有零个或多个输入量; 2.输出:算法至少产生一个输出量; 3.确定性:算法的每一条指令都有确切的定义,没有二义性; 4.可行性:算法的每一条指令必须足够基本,它们可以通过已经实现的基本运算执行有限次来实现; 5.有穷性:算法必须总能在执行有限步之后终止。 二.什么是算法?程序与算法的区别 1.笼统地说,算法是求解一类问题的任意一种特殊的方法;较严格地说,算法是对特定问题求解步骤的一种描述,它是指令的有限序列。 2.程序是算法用某种程序设计语言的具体实现;算法必须可终止,程序却没有这一限制;即:程序可以不满足算法的第5个性质“有穷性”。 三.一个问题求解过程包括:理解问题、设计方案、实现方案、回顾复查。 四.系统生命周期或软件生命周期分为: 开发期:分析、设计、编码、测试;运行期:维护。 五.算法描述方法:自然语言、流程图、伪代码、程序设计语言等。 六.算法分析:是指对算法的执行时间和所需空间的估算。算法的效率通过算法分析来确定。 七.递归定义:是一种直接或间接引用自身的定义方法。一个合法的递归定义包括两部分:基础情况和递归部分; 基础情况:以直接形式明确列举新事物的若干简单对象; 递归部分:有简单或较简单对象定义新对象的条件和方法 八.常见的程序正确性证明方法: 1.归纳法:由基础情况和归纳步骤组成。归纳法是证明递归算法正确性和进行算法分析的强有力工具; 2.反证法。 第二章:算法分析基础 一.会计算程序步的执行次数(如书中例题程序2-1,2-2,2-3的总程序步数的计算)。二.会证明5个渐近记法。(如书中P22-25例2-1至例2-9) 三.会计算递推式的显式。(迭代法、代换法,主方法) 四.会用主定理求T(n)=aT(n/b)+f(n)。(主定理见P29,如例2-15至例2-18)五.一个好的算法应具备的4个重要特征: 1.正确性:算法的执行结果应当满足预先规定的功能和性能要求; 2.简明性:算法应思路清晰、层次分明、容易理解、利于编码和调试; 3.效率:算法应有效使用存储空间,并具有高的时间效率; 4.最优性:算法的执行时间已达到求解该类问题所需时间的下界。 六.影响程序运行时间的主要因素: 1.程序所依赖的算法; 2.问题规模和输入数据规模; 3.计算机系统性能。 七.1.算法的时间复杂度:是指算法运行所需的时间;

算法设计与分析

Ex.1(p20)若将y ← uniform(0, 1) 改为 y ← x, 则上述的算法估计的值是什么? 解:若将y ←uniform(0, 1) 改为 y ←x,此时有 ,则k++,即 ,此时k++,由于此时x ← uniform(0, 1),所以k/n=,则此时4k/n=2。所以上述算法估计的值为2。 Ex.2(p23) 在机器上用 估计π值,给出不同的n值及精度。 解:由ppt上p21可知,的大小 ,其中k为落入圆内的数目,n为总数,且π=,即需要计算4k/n。我们先令x ← uniform(0, 1),y ← uniform(0, 1)。 计算的值,如果小于等于1,那么此时k++。最后计算4k/n的值即可估计此时的π值。代码的主要部分为: 执行结果为:

结果分析:随着N的取值不断地增加,得到的π值也就越来越精确。 Ex.3(p23) 设a, b, c和d是实数,且a ≤ b, c ≤ d, f:[a, b] → [c, d]是一个连续函数,写一概率算法计算积分: 注意,函数的参数是a, b, c, d, n和f, 其中f用函数指针实现,请选一连续函数做实验,并给出实验结果。 解:的值为y=,y=0,x=a,x=b围成的面积。根据之前的例子我们可以知道= k(b-a)d/n。其中k是落在函数y=,x=a,x=b以及y=0所包围区间内的个数。 代码的主要部分为: 运行结果为:

结果分析: 随着N的取值不断地增加,得到的积分值越来越精确。 Ex4(p24). 设ε,δ是(0,1)之间的常数,证明:若I是的正确值,h是由HitorMiss算法返回的值,则当n ≥ I(1-I)/ε2δ时有: Prob[|h-I| < ε] ≥ 1 –δ 上述的意义告诉我们:Prob[|h-I| ≥ε] ≤δ, 即:当n ≥ I(1-I)/ ε2δ时,算法的计算结果的绝对误差超过ε的概率不超过δ,因此我们根据给定ε和δ可以确定算法迭代的次数 () 解此问题时可用切比雪夫不等式,将I看作是数学期望。 证明:由切比雪夫不等式可知: P( | X - E(X) | < ε ) ≥ 1 - D(X) / ε2 由题目知,E(X)=I。且根据题意,我们可知,在HotorMiss算法中,若随机选取n个点,其中k个点在积分范围内,则 。且k的分布为二项分布B(n,I)(在积分范围内或者不在 积分范围内),则 。又因为k=x*n,所以D(X)=I(1-I)/n。再将E(X)和D(X)带入切比雪夫不等式中即可得到 Ex5(p36). 用上述算法,估计整数子集1~n的大小,并分析n对估计值的影响。 解:由题知,集合的大小,通过计算新生成的集合中元素的个数来估计原集合的大小,代码的主体部分如下:

算法设计与分析第一章习题解1.1,1.10,1.15

1.15练习 1.1(a) 1)A[1…60] = A[(1+60)/2]=A[30]=40 由于33<40,舍弃A[30…60]; 2)A[1…29] = A[(1+29)/2]=A[15]=25 由于33>25,舍弃A[1…15]; 3) A[16…29]= A[(16+29)/2]=A[22]=32 由于33>32,舍弃A[16…22]; 4) A[23…29] = A[(23+29)/2]=A[26]=36 由于33<36,舍弃A[26…29]; 5) A[23…25] = A[(23+25)/2]=A[24]=34; 由于33<34,舍弃A[24, 25]; 6) A[23] = 11 12 13 … 68 69 70 11 12 13 … 37 38 39 26 27 28 … 37 38 39 33 34 35 36 37 38 39 33 34 35 33

由于33=33,搜索完毕。 综上,搜索33共执行了6次比较。 同理可得(b )搜索7共执行了5次比较。 (c )搜索70共执行了6次比较。 (d )搜索77共执行了6次比较。 1.10 对11 12 1 5 15 3 4 10 7 2 16 9 8 14 13 6用bottomupsort 算法,按非降序排列。 解:用图示,如下进行。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 3 4 5 10 11 12 15 1 5 11 1 2 1.15用Θ表示函数。 (b) 2 6 7 8 9 1 3 1 4 16 3 4 10 1 5 2 7 9 1 6 6 8 13 14 11 12 1 5 15 3 4 10 2 7 9 16 8 14 6 13

算法设计与分析C++语言描述(陈慧南版)课后答案

第一章 15P 1-3. 最大公约数为1。快1414倍。 主要考虑循环次数,程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环) 若考虑其他语句,则没有这么多,可能就601倍。 第二章 32P 2-8.(1)画线语句的执行次数为log n ??? ?。(log )n O 。划线语句的执行次数应该理解为一格整体。 (2)画线语句的执行次数为 111 (1)(2)16 j n i i j k n n n ===++= ∑∑∑。3 ()n O 。 (3)画线语句的执行次数为 。O 。 (4)当n 为奇数时画线语句的执行次数为 (1)(3) 4 n n ++, 当n 为偶数时画线语句的执行次数为 2(2)4 n +。2 ()n O 。 2-10.(1) 当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。对于0n n ≥, 22()5825f n n n n =-+≤,所以,22582()n n n -+=O 。 (2) 当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。对于0n n ≥, 22()5824f n n n n =-+≥,所以,22582()n n n -+=Ω。 (3) 由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以2 2 582()n n n -+=Θ。 2-11. (1) 当3n ≥时,3 log log n n n <<,所以()20log 21f n n n n =+<,3 ()log 2g n n n n =+>。可 选 21 2 c = ,03n =。对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。注意:是f (n )和g (n )的关系。

算法设计与分析第三章课后答案吕国英主编.

2、#include void main() { int a[6][6],b[6],i,j; printf("请输入6个整数:"); for(i=0;i<6;i++) { scanf("%d",&b[i]); } for(i=0;i<6;i++) { a[0][i]=b[i]; } for(i=1;i<=5;i++) a[i][0]=b[6-i]; for(i=1;i<=5;i++) for(j=1;j<=5;j++) { a[i][j]=a[i-1][j-1]; } for(i=0;i<=5;i++) { for(j=0;j<=5;j++) printf("%d ",a[i][j]); printf("\n"); } } 3、#include void main() { int i,j,count,n; int a[100][100]; printf("请输入矩阵的阶n="); scanf("%d",&n); count=1; for(i=1;i<=n/2;i++) { for(j=i;j<=n-i+1;j++)//上侧 { a[i][j]=count; count++; } for(j=i+1;j<=n-i;j++)//右侧 {

a[j][n-i+1]=count; count++; } for(j=n-i+1;j>=i+1;j--)//下侧 { a[n-i+1][j]=count; count++; } for(j=n-i+1;j>=i+1;j--)//左侧 { a[j][i]=count; count++; } } if(n%2==1) { i=(n+1)/2; a[i][i]=n*n; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%2d ",a[i][j]); printf("\n"); } } 4、#include void main() { int i,j,n,a[100][100],count=1; printf("请输入方阵的阶n:"); scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=i;j++) { a[i-j+1][j]=count; count++; } for(i=1;i<=n;i++) { for(j=1;j<=n-i+1;j++) printf("%4d",a[i][j]); printf("\n");

算法设计与分析1

算法设计与分析教师讲稿
第1章
教学重点 教学难点 计算机学科的符号化特征 知识点 教学内容 和 教学目标 算法及其重要特性 算法的描述方法 算法设计的一般过程 问题求解的一般过程 计算机学科的符号化特征 重要的问题类型
算法设计基础
算法及其重要特性;伪代码;算法设计的一般过程 教学要求 了解 理解 √ √ √ √ √ 掌握 熟练掌握 √
1.1
1.1.1 算法及其重要特性
算法的基本概念
算法是计算机科学的基石。其定义为: 算法是对特定问题求解步骤的一种描述,是指令的有限序列。 算法五个重要特性: (1)输入:一个算法有零个或多个输入(即算法可以没有输入),这些 输入通常取自于某个特定的对象集合。 (2)输出:一个算法有一个或多个输出(即算法必须要有输出),通常 输出与输入之间有着某种特定的关系。 (3)有穷性:一个算法必须总是(对任何合法的输入)在执行有穷步之 后结束,且每一步都在有穷时间内完成。 (4)确定性:算法中的每一条指令必须有确切的含义,不存在二义性。 并且,在任何条件下,对于相同的输入只能得到相同的输出。 (5)可行性:算法描述的操作可以通过已经实现的基本操作执行有限次 来实现。
输入 算法:操作步骤 满足确定性、有穷性、可行性 图 1.1 算法的概念 .1 算法的概念 输出
算法的中文名称出自周髀 算 经 , 英 文 (algorithm) 则 来自于波斯数学家阿勒·霍 瓦里松(Al·Khowarizmi)在 公元 825 年写的经典著作 《代数对话录》。 算法中有穷的概念不是纯 数学的, 而是指在实际应用 中是合理的、可接受的。 算法的确定性限制了它所 能够解决的问题种类。
例 1.1 设计算法求两个自然数的最大公约数。 解:设两个自然数是 m 和 n,求解过程如下:
1

湘潭大学算法设计与分析知识点

第一章算法概述 1、算法的五个性质:有穷性、确定性、能行性、输入、输出。 2、算法的复杂性取决于:(1)求解问题的规模(N),(2)具体的输入数据(I),(3)算法本身的设计(A),C=F(N,I,A)。 3、算法的时间复杂度的上界记号O, 下界记号Ω(记为f(N) = Ω(g(N))。即算法的实际运行时间至少需要g(n)的某个常数倍时间), 同阶记号Θ:f(N)= Θ(g(N))表示f(N)和g(N)同阶。 即算法的实际运行时间大约为g(n)的某个常数倍时间。 低阶记号o:f(N)=o(g(N))表示f(N)比g(N)低阶。 多项式算法时间: O(1)

算法设计与分析实验1

实验内容 一、实验内容 1)狼找兔子问题:一座山周围有n个洞,顺时针的编号为0,1,2,3,4,...,n-1,。 一只狼从0号洞开始,顺时针方向计数,每当经第m个洞时,就进洞找兔子。例如n=5,m=3,狼经过的洞依次为0, 3, 1, 4, 2, 0。输入m,n。试问兔子有没有幸存的机会?如果有应该藏在哪儿? 问题分析:设置两个数组,一个数组用于循环,演示狼每次经过的洞,如果每个洞都被经过,则兔子没有幸存的机会。如果最后经过的洞的数目小于总的数目,则比较两个数组,数组中不同的值代表被狼经过的洞,相同的值代表兔子可以藏身的洞。本题使用C++编写。 实验代码:

运行结果:

2)有52张牌,使它们全部正面朝上。第一轮是从第2张开始,凡是2的倍数 位置上的牌翻成正面朝下,第二轮从第3张牌开始,凡是3的倍数的牌,正面朝上的翻成正面朝下,正面朝下的牌翻成正面朝上。第三轮从第4张牌开始,凡是4的倍数位置上的牌按上面相同的规则反转,以此类推,直到翻过的牌超过104张为止。统计最后有几张牌正面朝上,以及它们的位置号。 问题分析:设置一个数组,数组中每一个数的初始值都为1,当某张牌被翻转的时候,用0表示。每翻转一次,用一个变量count累计加1,然后检查变量的值,当count超过104的时候,跳出循环体。本题使用Java编写。 实验代码:

运行结果: 3)A,B,C,D,E5人为某次竞赛的前五名,他们在名次公布前猜名次。A说:B得第三名,C得第五名。 B说:D得第二名,E得第四名。 C说:B得第一名,E得第四名。

D说:C得第一名,B得第二名。 E说:D得第二名,A得第三名。 结果每个人都猜对了一般,实际名次是什么呢? 问题分析:本题使用多重嵌套循环,ABCDE每个人可能获得的名次分别是1,2,3,4,5,分别使ABCDE遍历每一种可能,当每个人的两个预言只有一个为真时,循环结束。本题使用C++编写。 实验代码: 运行结果:

相关文档
最新文档