1、精品文档算法设计与分析实验报告格式精选word文档 30页本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!= 本文为word格式,下载后可方便编辑和修改! = 算法设计与分析实验报告格式算法设计与分析实验报告一实验名称 统计数字问题 评分 实验日期 年月 日指导教师 刘长松 姓名 刘飞初 专业班级计算机0901 学号 10一.实验要求1、掌握算法的计算复杂性概念。2、掌握算法渐近复杂性的数学表述。3、掌握用C+语言描述算法的方法。4实现具体的编程与上机实验,验证算法的时间复杂性函数。二.实验内容统计数字问题1、问题描述一本书的页码从自然数1 开始顺序编
2、码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,9。 2、编程任务给定表示书的总页码的10 进制整数n (1n109) 。编程计算书的全部页码中分别用到多少次数字0,1,2,9。三.程序算法将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个19作为个位数,余数代表有1余数本身这么多个数作为剩余的个位数,此外,商还代表1商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。把这些结果统计起
3、来即可。 四.程序代码#includeint s10; /记录09出现的次数int a10; /ai记录n位数的规律void sum(int n,int l,int m)if(m=1) int zero=1;for(int i=0;i=l;i+) /去除前缀0 s0-=zero;zero*=10; if(n10)for(int i=0;i=n;i+)si+=1;return;/位数为1位时,出现次数加1/位数大于1时的出现次数for(int t=1;t=l;t+)/计算规律f(n)=n*10(n-1) m=1;int i; for(i=1;it;i+) m=m*10; at=t*m; int
4、zero=1;for(int i=0;il;i+)zero*= 10; /求出输入数为10的n次方int yushu=n%zero; /求出最高位以后的数int zuigao=n/zero; /求出最高位zuigaofor(i=0;izuigao;i+)si+=zero; /求出0zuigao-1位的数的出现次数for(i=0;iyushu)i+;s0+=i*(yushu+1);/补回因作模操作丢失的0szuigao+=(yushu+1);/补回最高位丢失的数目sum(yushu,l-i-1,m+1);/处理余位数 void main() int i,m,n,N,l;coutN; cout=1
5、0;i+)n/=10; /求出N的位数n-1l=i;sum(N,l,1);for(i=0; i10;i+)cout 数字i出现了:si次n;五.程序调试中的问题调试过程中总是有这样那样的问题,通过一步步的修改,最终得以实现。六.实验结果算法设计与分析实验报告二实验名称分治法实现归并排序算法评分 实验日期 年月 日指导教师 刘长松姓名 刘飞初 专业班级 计算机0901 学号10一.实验要求1.了解用分治法求解的问题:当要求解一个输入规模为n,且n的取值相当大的问题时, 如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1kn,而且子问题与原问题性质相同,原问题的解可由这些子问
6、题的解合并得出。那末,对于这类问题分治法是十分有效的。 2.掌握分治法的一般控制流程。DanC(p,q)global n,A1:n; integer m,p,q; / 1?p?q?nif Small(p,q) then return G(p,q);else m=Divide(p,q); / p?mqreturn Combine(DanC(p,m),DanC(m+1,q);endifend DanC3实现典型的分治算法的编程与上机实验,验证算法的时间复杂性函数。二.实验内容1.编程实现归并排序算法,程序中加入比较次数的计数功能,输出排序结果和比较次数。2.输入10组相同的数据,验证排序结果和完成
7、排序的比较次数。3.与复杂性函数所计算的比较次数比较。4.用表格列出比较结果。5.给出文字分析。三.程序算法1. 归并排序算法procedure MERGESORT(low,high)/A(low;high)是一个全程数组,它含有high-low+10个待排序的元素/integer low,high;if lowmid thenfor kj to high do /处理剩余的元素/B(i) A(k);ii+1repeatelse for kh to mid doB(i) A(k);ii+1repeatendif将已归并的集合复制到Aend MERGE2. 快速排序算法QuickSort(p,q
8、)/将数组A1:n中的元素Ap, Ap+1, ? , Aq按不降次序排列,并假定An+1是一个确定的、且大于A1:n中所有的数。/int p,q; global n, A1:n;if pq thenj=Partition(p, q+1); / 划分后j成为划分元素的位置 QuickSort(p,j-1);QuickSort(j+1,q);endifend QuickSortprocedure PARTITION(m,p)/退出过程时,p带着划分元素所在的下标位置。/integer m,p,i;global A(m:p-1)vA(m);im /A(m)是划分元素/looploop ii+1 un
9、til A(i)v repeat /i由左向右移/loop pp-1 until A(p)v repeat /p由右向左移/if ipthen call INTERCHANGE(A(i),A(p) /A(i)和A(p)换位/ else exitendifrepeatA(m) A(p);A(p) v /划分元素在位置p/End PARTITION四.程序代码归并排序#include#include#include#include#define M 11typedef int KeyType;typedef int ElemType;struct recKeyType key;ElemType d
10、ata;typedef rec sqlistM;class guibingpublic:guibing(sqlist b) for(int i=0;iM;i+) ri=bi; void xuanze(sqlist b,int m,int n) void merge(int l,int m,int h,sqlist r2) xuanze(r,l,m); xuanze(r,m,h); output(r,M); int i,j,k; k=i=l; for(j=m;im&jh;k+) if(ri.key=rj.key) else r2k=ri; i+; int i,j,k; for(i=m;in-1;
11、i+) k=i; for(j=i;jbj.key) k=j; if(k!=i) rec temp=bk; bk=bi; bi=temp; for(int i=0;in;i+) coutsetw(4)ri.key; coutendl; j+; output(r2,M); while(jh) while(i=m) output(r2,M); r2k=ri; i+; k+; r2k=rj; j+; k+;private:sqlist r;void main()coutguibingfa1运行结果:n; sqlist a,b; int i,j=0,k=M/2,n=M; srand(time(0); f
12、or(i=0;iM;i+) guibing gx(a); cout排序前数组:n; gx.output(a,M); cout数组排序过程演示:n; gx.merge(j,k,n,b); cout排序后数组:n; ai.key=rand()%80;bi.key=0; cin.get();快速排序#include #include#include#include#define MAXI 10typedef int KeyType; typedef int ElemType; struct recKeyType key;ElemType data;typedef rec sqlistMAXI; cl
13、ass kuaisupublic:kuaisu(sqlist a,int m):n(m) void quicksort(int s,int t) int part(int s,int t) int i,j; rec p; i=s;j=t;p=bs; int i; if(st) else return; i=part(s,t); quicksort(s,i-1); quicksort(i+1,t); for(int i=0;in;i+) bi=ai; while(ij) bi=p; output(); return i; while(i=p.key)j-; bi=bj; while(ij&bi.
14、key=p.key)i+; bj=bi;void output()private:sqlist b;int n;void main()coutkuaisu1.cpp运行结果:n;sqlist a1;int i,n=MAXI,low=0,high=9;srand(time(0);for(i=0;in;i+)a1i.key=rand()%80;kuaisu px(a1,n);cout数组排序过程演示:n;px.quicksort(low,high);cout排序后数组:n;px.output();cin.get(); for(int i=0;in;i+) coutsetw(4)bi.key; co
15、utendl;五.程序调试中的问题1. 归并排序2. 快速排序算法设计与分析实验报告三实验名称 动态规划算法实现多段图的最短路径问题 评分 实验日期 年月 日指导教师 刘长松 姓名 刘飞初 专业班级 计算机0901 学号10一.实验要求1. 理解最优子结构的问题。有一类问题的活动过程可以分成若干个阶段,而且在任一阶段后的行为依赖于该阶段的状态,与该阶段之前的过程如何达到这种状态的方式无关。这类问题的解决是多阶段的决策过程。在50年代,贝尔曼(Richard Bellman)等人提出了解决这类问题的“最优化原理”,从而创建了最优化问题的一种新的算法设计方法动态规划。 对于一个多阶段过程问题,是否
16、可以分段实现最优决策,依赖于该问题是否有最优子结构性质,能否采用动态规划的方法,还要看该问题的子问题是否具有重叠性质。 最优子结构性质:原问题的最优解包含了其子问题的最优解。 子问题重叠性质:每次产生的子问题并不总是新问题,有些子问题被反复计算多次。问题的最优子结构性质和子问题重叠性质是采用动态规划算法的两个基本要素。2.理解分段决策Bellman方程。每一点最优都是上一点最优加上这段长度。即当前最优只与上一步有关。 ?us?0, ?u?minu?w.iij?ji?j ?Us 初始值,uj第j段的最优值。3.一般方法1) 找出最优解的性质,并刻画其结构特征;2) 递归地定义最优值(写出动态规划
17、方程);3) 以自底向上的方式计算出最优值;4) 根据计算最优值时得到的信息,构造一个最优解。步骤1-3是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤4可以省略,步骤3中记录的信息也较少;若需要求出问题的一个最优解,则必须执行步骤4,步骤3中记录的信息必须足够多以便构造最优解。 二.实验内容1.编程实现多段图的最短路径问题的动态规划算法。2.图的数据结构采用邻接表。3.要求用文件装入5个多段图数据,编写从文件到邻接表的函数。4.验证算法的时间复杂性。三.程序算法多段图算法procedure FGRAPH(E,k,n,P)/输入是按段的顺序给结点编号的,有n个结点的k段图。E是边集,c
18、(i,j)是边的成本。P(1:k)是最小成本路径。/real COST(n),integerD(n一1),P(k),r,j,k,nCOST(n) 0for jn-1to 1by1do /计算COST(j)/设r是一个这样的结点,(j,r)?E且使c(j,r)+COST(r)取最小值 COST(j)c(j,r)+COST(r)D(j)rrepeat /向前对j-1进行决策/P(1)1;P(k)n;for j2 to k-1 do /找路径上的第j个节点/P(j)D ( P(j-1) )repeatend FGRAPH四.程序代码多段图问题#include#include#include#defi
19、ne MAX_VERTEX_NUM 50typedef struct ArcNodeint adjvex; /该弧所指向的顶点的位置int value; /该结点与邻接结点间的代价struct ArcNode *nextarc; /指向下一条弧的指针ArcNode, *node;typedef struct VNodeint data; /顶点信息ArcNode *firstArc; /指向第一条依附该顶点的弧的指针 VNode, AdjListMAX_VERTEX_NUM;typedef struct GraphAdjList vertices;int vexnum,arcnum; /图的当
20、前顶点数和弧数 *ALGraph;int build_adList(ALGraph G,int n,int a) /建立邻接表int v, m, i, t, h;node p, q;if(n vexnum = n; /图的顶点数if(a arcnum = a; /图的弧数for(m = 0; m n; m+)for(m = 1; m adjvex = h; p-value = v; p-nextarc = NULL; while(G-verticesi.data != t) i+; /转到下一个结点 if(!G-verticesi.firstArc) /终点 G-verticesi.first
21、Arc = p; else /若当前结点有后继节点则后移 for(q = G-verticesi.firstArc; q-nextarc; q = q-nextarc); q-nextarc = p; /新开辟结点 G-verticesm.data = m; G-verticesm.firstArc = NULL; void print_Graph(ALGraph G) /打印邻接表ArcNode *p=(ArcNode *)malloc(sizeof(ArcNode);int i;for(i = 1; i vexnum; i+)void fgraph(ALGraph G ,int k,int
22、 n) /多段图ALGraph G,n为结点数,k为图的段数/输入是按段的顺序给结点编号int cost100;int d100;int path100;int j, r, i, min, w, value;node p;costn = 0;for(j = n - 1; j = 1; j-) /向前处理结点p = G-verticesj.firstArc; min = p-value+costp-adjvex; /初始化路径最小代价 r = p-adjvex; value = p-value; while(p != NULL) /r是一个的这样的结点,权值c(j,r)+costr取最小值 if
23、(p-value + costp-adjvex) value + costp-adjvex; /p-value=c(j,r) p = G-verticesi.firstArc; printf(%d,i); while(p) printf(n); printf(-%d,%d,p-adjvex,p-value);/第i个结点的邻接结点信息 p = p-nextarc; value = p-value; p = p-nextarc; costj = value + costr; /当前节点的代价值 dj = r; /决策阶段,各结点到终点最小代价路径上前方顶点的编号path1 = 1; pathk
24、= n;for(i = 2; i = k - 1; i+) /找出最小代价路径上的结点pathi = dpathi - 1;printf(最小成本为:%dn,cost1);printf(最小成本路径为: );for(w = 1; w , pathw);五.实验结果多段图问题算法设计与分析实验报告四实验名称 贪心算法实现背包问题 评分 实验日期 年月 日指导教师 刘长松姓名 刘飞初 专业班级 计算机0901 学号 10一.实验要求1. 优化问题有n个输入,而它的解就由这n个输入满足某些事先给定的约束条件的某个子集组 成,而把满足约束条件的子集称为该问题的可行解。可行解一般来说是不唯一的。那些使目标函数取极值(极大或极小)的可行解,称为最优解。 2.贪心法求优化问题算法思想:在贪心算法中采用逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。决策一旦作出,就不可再更改。作出贪心决策的依据称为贪心准则(greedy criterion)。 3.一般方法1)根据题意,选取一种量度标准。2)按这种量度标准对这n个输入排序3)依次选
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1