北邮 算法设计与分析_第三章实验报告

合集下载

北邮 DSP硬件实验报告

北邮 DSP硬件实验报告

目录第三章 (2)实验一 (2)实验二 (3)实验三 (4)实验四 (5)实验五 (9)实验六 (13)实验七 (17)第四章 (35)实验一 (35)第三章实验一.mmregs ;定义存储器映像寄存器.global _main ;全局符号,可在外部定义_main:stm #3000h,sp ;设置堆栈指针寄存器的值为3000hssbx xf ;置位状态寄存器xf=1,灯亮call delay ;调用延时子程序,延时rsbx xf ;将xf置0call delay ;调用delay函数b _main ;程序跳转到"_MAIN"nopnop;延时子程序delay:stm 270fh,ar3 ;设置辅助寄存器ar3值为9999loop1:stm 0f9h,ar4 ;设置辅助寄存器ar4值为249loop2:banz loop2,*ar4- ;寄存器ar4值减一,当其值不为0时跳转到loop2 banz loop1,*ar3- ;寄存器ar3值减一,当其值不为0时跳转到loop1 ret ;可选择延迟的返回nop ;空指令nop.end.mmregs.global _main_main:;store data 存入数据stm 1000h,ar1 ;address of internal memory 寄存器ar1地址1000hrpt #07h ;循环执行下一条指令8次st 0aaaah,*ar1+ ;将数据"0AAAAH"存放到以地址1000H~1007H的八个存储单元中.;;read data then re-store 读取数据再存到别的寄存器中stm 7h,ar3 ; 寄存器ar3地址7hstm 1000h,ar1 ; 寄存器ar1地址1000hstm 1008h,ar2 ; 寄存器ar2地址1008hloop: ;循环的将1000H~1007H的八个单元中的数据COPY到1008H~100F的;八个存储单元中.ld *ar1+,t ;,把地址为ar1 的数据单元中的数据装到累加器t 中,ar1 = ar1 +1 st t,*ar2+banz loop,*ar3-here: ;死循环.b here.end.mmregs ;定义映像寄存器.global _main ;声明全局符号.text_main:stm 3100h,sp ;设置堆栈指针寄存器的值为3100hstm 1000h,ar1 ;设置辅助寄存器ar1值为1000hportr 8000h,*ar1 ;读入I/O 8000H数据,将其存储到数据空间的1000H nop ;NOP为空操作,起延时作用.nopportw *ar1,8001h ;将数据空间的1000H单元的数据,写出到I/O 8000H nopnop 5b _main ;程序跳转到"_MAIN"执行.nopnop.end.global _c_int00,_timer0 ;引用函数c_int00,引用了c中的函数.sect ".vecs" ;自定义一个已初始化段.vecsreset: b _c_int00 ;复位中断向量,跳转到主程序nopnopnmi: rete ;非屏蔽外部中断的输入引脚nopnopnop; software interruptssin17: .space 4*16 ;软件中断,内部中断,保留出中断向量的地址空间,将4*16的地址;存储在sin17~sin30sin18: .space 4*16sin19: .space 4*16sin20: .space 4*16sin21: .space 4*16sin22: .space 4*16sin23: .space 4*16sin24: .space 4*16sin25: .space 4*16sin26: .space 4*16sin27: .space 4*16sin28: .space 4*16sin29: .space 4*16sin30: .space 4*16int0: rete ;此处int0中断响应为0,设置rete响应中断并返回nopnopnopint1: rete ;此处int1中断响应为0,设置rete响应中断并返回nopnopnopint2: rete ;此处int2中断响应为0,设置rete响应中断并返回nopnopnoptint0: b _timer0 ;同步串口0(McBSP0)接受中断,直接返回nopnopbrint0: rete ;同步串口0(McBSP1)发送中断,直接返回nopnopnopbxint0: rete ;同步串口0(McBSP1)发送中断,直接返回nopnopnopdmac0: rete ;RESERVED OR DMA CHANNEL0 INTERRUPTnopnopnoptint1_dmac1: rete ;TIMER1 INTERRUPT OR DMA CHANNEL1 INTERRUPTnopnopnopint3: rete ;外部中断int3,允许中断并返回nopnopnophpint: rete ;HPI INTERRUPTnopnopnopbrint1_dmac2: rete ;McBSP1 RECEIVE INTERRUPT OR DMA CHANNEL 2 INTERRUPT nopnopnopbxint1_dmac3: rete ;McBSP1 TRANSMIT INTERRUPT OR DMA CHANNEL 3 INTERRUPT nopnopnopdmac4: rete ;DMA CHANNEL 4 INTERRUPTnopnopnopdmac5: rete ;DMA CHANNEL 5 INTERRUPTnopnopnop; ****************************结束*****************************;*************************************************************//*;* 文件名称: exp04.c;* 适用平台: EXPIII+实验系统;* CPU类型: DSP TMS320VC54X;* 软件环境: CCS3.1 (5000系列);* 试验接线: 1、实验箱的拨码开关SW2.4置OFF(54x的译码有效);54x CPU板的跳线J2的1、2短接;* (HPI 8位模式);SW1的2、6置ON,其余置OFF(HPI使能;DSP工作微处理器方式;;* CPU_CS=0);SW2全部置ON(FLASH工作在数据空间,LED灯D5的工作状态处于灭状态);;* 试验现象: LED灯(LED1~LED8)以一定的间隔时间不停闪亮变化;;*************************************************************//************************文件预处理***************************/#include "tms320uc5402.h"/*************************************************************//********************全局变量定义与初始化*********************/ioport unsigned port8001;unsigned int show=0x00aa;unsigned int num=0x0000;/*************************************************************//*******************函数、子程序声明与定义********************/void sys_ini() //系统初始化子程序{asm(" ssbx INTM"); //全局禁止所有可屏蔽中断PMST&=0x00FF; //(DRAM映射到程序空间和数据空间)向量表映射到0x0080空间SWWSR=0x7000; //io空间7个等待周期,程序与数据空间0个等待周期CLKMD=0x17FA; //CLKOUT=2*CLKIN=2*10M=20M,自动延时最长时间}void timer0_ini() //定时器0初始化子程序{TCR|=0x0010; //停止定时器0PRD=0x2710; //PRD=10000(D)TCR|=0x000A; //TDDR=10(D),所以定时器时钟=1/(20M/10/10000)=5msIMR=0x0008; //使能定时器0中断IFR=0xFFFF; //清除所有中断标志位asm(" rsbx INTM"); //全局使能可屏蔽中断TCR&=0xFFEF; //开始定时器0TCR|=0x0020; //复位定时起0}/*************************************************************//*****************中断服务子程序声明与定义********************/interrupt void timer0() //定时器0中断子程序{if(num==200) //记200次定时器中断,时间=200*5ms=1s{show=~show; //取反num=0;}elsenum++;return;}/*************************************************************//**************************主程序*****************************/ void main(void){sys_ini();timer0_ini();for(;;){port8001=show;}}/***************************结束******************************/实验五Initial.asm.mmregs.global _initial.text_initial:NOPLD #0, DP ;重置数据指针,为DP寄存器赋值0;DP是状态寄存器ST0 的低9 位,和7 位(数据存储器地址)构成16 位数据存储区地址STM #0, CLKMD ;设置时钟模式寄存器的值为0;可通过调整CLKMD 寄存器改变CPU 时钟。

算法设计与分析实验报告三篇

算法设计与分析实验报告三篇

算法设计与分析实验报告一实验名称统计数字问题评分实验日期2014 年11 月15 日指导教师姓名专业班级学号一.实验要求1、掌握算法的计算复杂性概念。

2、掌握算法渐近复杂性的数学表述。

3、掌握用C++语言描述算法的方法。

4.实现具体的编程与上机实验,验证算法的时间复杂性函数。

二.实验内容统计数字问题1、问题描述一本书的页码从自然数1 开始顺序编码直到自然数n。

书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。

例如,第6 页用数字6 表示,而不是06 或006 等。

数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9)2、编程任务给定表示书的总页码的10 进制整数n (1≤n≤109) 。

编程计算书的全部页码中分别用到多少次数字0,1,2, (9)三.程序算法将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。

把这些结果统计起来即可。

四.程序代码#include<iostream.h>int s[10]; //记录0~9出现的次数int a[10]; //a[i]记录n位数的规律void sum(int n,int l,int m){ if(m==1){int zero=1;for(int i=0;i<=l;i++) //去除前缀0{ s[0]-=zero;zero*=10;} }if(n<10){for(int i=0;i<=n;i++){ s[i]+=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;i<t;i++)m=m*10;a[t]=t*m;}int zero=1;for(int i=0;i<l;i++){ zero*= 10;} //求出输入数为10的n次方int yushu=n%zero; //求出最高位以后的数int zuigao=n/zero; //求出最高位zuigaofor(i=0;i<zuigao;i++){ s[i]+=zero;} //求出0~zuigao-1位的数的出现次数for(i=0;i<10;i++){ s[i]+=zuigao*a[l];} //求出与余数位数相同的0~zuigao-1位中0~9出现的次数//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数if(yushu==0) //补上所缺的0数,并且最高位加1{ s[zuigao]++;s[0]+=l; }else{ i=0;while((zero/=10)>yushu){ i++; }s[0]+=i*(yushu+1);//补回因作模操作丢失的0s[zuigao]+=(yushu+1);//补回最高位丢失的数目sum(yushu,l-i-1,m+1);//处理余位数}}void main(){ int i,m,n,N,l;cout<<"输入数字要查询的数字:";cin>>N;cout<<'\n';n = N;for(i=0;n>=10;i++){ n/=10; } //求出N的位数n-1l=i;sum(N,l,1);for(i=0; i<10;i++){ cout<< "数字"<<i<<"出现了:"<<s[i]<<"次"<<'\n'; }}五.程序调试中的问题调试过程,页码出现报错。

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

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

实验一全排列、快速排序【实验目的】1.掌握全排列的递归算法。

2.了解快速排序的分治算法思想。

【实验原理】一、全排列全排列的生成算法就是对于给定的字符集, 用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。

任何n个字符集的排列都可以与1~n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法。

n个字符的全体排列之间存在一个确定的线性顺序关系。

所有的排列中除最后一个排列外, 都有一个后继;除第一个排列外, 都有一个前驱。

每个排列的后继都可以从它的前驱经过最少的变化而得到, 全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方法。

二、快速排序快速排序(Quicksort)是对冒泡排序的一种改进。

它的基本思想是: 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行, 以此达到整个数据变成有序序列。

【实验内容】1.全排列递归算法的实现。

2.快速排序分治算法的实现。

【实验结果】1.全排列:快速排序:实验二最长公共子序列、活动安排问题【实验目的】了解动态规划算法设计思想, 运用动态规划算法实现最长公共子序列问题。

了解贪心算法思想, 运用贪心算法设计思想实现活动安排问题。

【实验原理】一、动态规划法解最长公共子序列设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一个最长公共子序列Z=<z1, z2, …, zk>, 则:..i.若xm=yn, 则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列...ii.若xm≠yn且zk≠x., 则Z是Xm-1和Y的最长公共子序列...iii.若xm≠yn且zk≠y.,则Z是X和Yn-1的最长公共子序列.其中Xm-1=<x1, x2, …, xm-1>, Yn-1=<y1, y2, …, yn-1>, Zk-1=<z1, z2, …, zk-1>。

北邮程序设计实验报告

北邮程序设计实验报告

实验名称:程序设计实验实验时间:2023年X月X日实验地点:北邮计算机实验室一、实验目的1. 熟悉C语言编程环境,掌握基本的程序设计方法。

2. 通过实际编程,提高逻辑思维和问题解决能力。

3. 理解算法设计的重要性,掌握常用的算法设计方法。

二、实验内容本次实验主要分为以下几个部分:1. 编写一个计算两个整数相加的程序。

2. 编写一个计算两个整数相减的程序。

3. 编写一个计算两个整数相乘的程序。

4. 编写一个计算两个整数相除的程序(要求考虑除数为0的情况)。

5. 编写一个判断两个整数是否相等的程序。

三、实验步骤1. 打开C语言编程环境,创建一个新的项目。

2. 编写计算两个整数相加的程序:```c#include <stdio.h>int main() {int a, b, sum;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);sum = a + b;printf("两个整数相加的结果为:%d\n", sum); return 0;}```3. 编写计算两个整数相减的程序:```c#include <stdio.h>int main() {int a, b, sub;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);sub = a - b;printf("两个整数相减的结果为:%d\n", sub); return 0;}```4. 编写计算两个整数相乘的程序:```c#include <stdio.h>int main() {int a, b, mul;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);mul = a b;printf("两个整数相乘的结果为:%d\n", mul);return 0;}```5. 编写计算两个整数相除的程序(考虑除数为0的情况):```c#include <stdio.h>int main() {int a, b, div;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);if (b == 0) {printf("除数不能为0,请重新输入。

算法设计与分析实验报告(模版)

算法设计与分析实验报告(模版)

武汉工程大学计算机科学与工程学院《算法设计与分析》实验报告专业班级实验地点学生学号指导教师学生姓名实验时间实验项目算法基本工具和优化技巧实验类别基本性实验实验目的及要求目的与要求:练习算法基本工具和优化技巧的使用实验内容要点:1、熟悉循环和递归的应用2、熟悉数据结构在算法设计中的应用3、了解优化算法的基本技巧4、掌握优化算法的数学模型成绩评定表类别评分标准分值得分合计上机表现积极出勤、遵守纪律主动完成实验设计任务30分实验报告及时递交、填写规范内容完整、体现收获70分说明:评阅教师:日期:年月日一、狼找兔子问题:一座山周围有n个洞,顺时针编号为0,1,2.,…,n-1。

一只狼从0号洞开始,顺时针方向计数,每当经过第m个洞时,就进洞找兔子。

输入m,n,问兔子有没有幸免的机会?如果有,该藏哪里?代码设计:。

结果:。

二、有52张牌,使他们全部正面朝上,第一轮是从第2张开始,凡是2的倍数位置上的牌翻成正面朝下;第二轮从第3张牌开始,凡是3的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;第三轮从第4张开始,凡是4的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上,以此类推,直到翻的牌超过104张为止。

统计最后有几张正面朝上,以及他们的位置号。

代码设计:。

结果:。

三、A、B、C、D、E 5人为某次竞赛的前5名,他们在名次公布前猜名次。

A说:B得第三名,C得第五名。

B说:D得第二名,E得第四名。

C说:B得第一名,E得第四名。

D说:C得第一名,B得第二名。

E说:D得第二名,A得第三名。

结果每个人都猜对了一半,实际名次是什么呢?代码设计:。

结果:。

北邮-算法设计和分析-第三章实验报告

北邮-算法设计和分析-第三章实验报告

算法设计与分析第三章程序作业源程序代码1.最长公共子序列#include<stdio.h>#include<stdlib.h>#define N 1000int e[N][N],f[N][N];void LCSLength(int m,int n,char *x,char *y,int c[][N],int b[][N])//构造数组b[i][j]{int i,j;for (i=1; i<=m;i++)c[i][0]=0; //初始化, Y[j]为空时for (i=1;i<=n;i++)c[0][i]=0; //初始化,X[i]为空时for (i=1;i<=m;i++) //两重循环,自下而上,// 计算子问题{X(i), Y(j)}for (j=1;j<=n;j++){if(x[i]==y[j]){ //情况1c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}else if(c[i-1][j]>=c[i][j-1]){ //情况2c[i][j]=c[i-1][j];b[i][j]=2;}else //情况3{c[i][j]=c[i][j-1];b[i][j]=3;}}}void LCS(int i,int j,char *x,int b[][N]){if (i==0||j==0)return;if (b[i][j]==1){LCS(i-1,j-1,x,b);printf("%c",x[i]);/*第1种情况下,X(i)和Y(j)的最长公共子序列由X(i-1)和Y(j-1)的解LCS(i-1, j-1, x, b),加上位于最后的X[i]组成*/}else if(b[i][j]==2)LCS(i-1,j,x,b);elseLCS(i,j-1,x,b); //其它2种情况下,原问题解等于子问题解}main(){char A[N],B[N],C[N],D[N];int a=1,b=1,c=1,d=1;char ch;int i;FILE * fp;if((fp=fopen("最长公共子序列输入数据.txt","r"))==NULL)//打开文件失败printf("Can't open file ");else{//读取文件内容ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!='B'&&ch!=EOF) {A[a]=ch;a++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}a--;ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!='C'&&ch!=EOF) {B[b]=ch;b++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}b--;ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!='D'&&ch!=EOF) {C[c]=ch;c++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}c--;ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!=EOF){D[d]=ch;d++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}d--;}fclose(fp);printf("文件读取完成\n");/* for(i=0;i<=a;i++)printf("%c",A[i]);printf("\n");for(i=0;i<=b;i++)printf("%c",B[i]);printf("\n");for(i=0;i<=c;i++)printf("%c",C[i]);printf("\n");for(i=0;i<=d;i++)printf("%c",D[i]);printf("\n"); */printf("\n\n\nA和B的最长公共子序列为:\n");LCSLength(a,b,A,B,e,f);LCS(a,b,A,f);printf("\n\n\nC和D的最长公共子序列为:\n");LCSLength(c,d,C,D,e,f);LCS(c,d,C,f);printf("\n\n\nA和D的最长公共子序列为:\n");LCSLength(a,d,A,D,e,f);LCS(a,d,A,f);system("pause");return 0;}2.最大子段和#include<stdio.h>#include<stdlib.h>#define N 400void MaxSum(int n,int *a){int sum=0,b=0;int i,x1=0,y1=0,x=0,y=0;for(i=1;i<=n;i++){if (b>0){b+=a[i];y1=i;}else{b=a[i];x1=i;}if(b>sum){sum=b;x=x1;y=y1;}}printf("\n该序列的最大子段和的位置为从第%d个到第%d个",x+1,y+1);printf("\n该序列的和最大子段为:\n");for(i=x;i<=y;i++)printf("%d ",a[i]);printf("\n它们的和为%d \n",sum);}main(){int A[N],B[N];int a=0,b=0;int i;FILE *fp1,*fp2;if((fp1=fopen("最大子段和输入数据-序列1.txt","r"))==NULL)//打开文件失败printf("Can't open file1 ");else //读取文件内容for(i=0;!feof(fp1);i++)fscanf(fp1,"%d\n",&A[i]);a=i-1;}if((fp2=fopen("最大子段和输入数据-序列2.txt","r"))==NULL)//打开文件失败printf("Can't open file2 ");else{for(i=0;!feof(fp2);i++)fscanf(fp2,"%d\n",&B[i]);b=i-1;}fclose(fp1);fclose(fp1);printf("文件读取成功!!!\n\n\n");printf("对于最大子段和输入数据-序列1 ");MaxSum(a,A);//计算最大子段和printf("\n\n对于最大子段和输入数据-序列2 ");MaxSum(b,B);// for(i=0;i<=b;i++)// printf("%d ",B[i]);system("pause");return 0;}3.凸多边形最优三角剖分#include<stdio.h>#include<stdlib.h>#include<math.h>#define N 30#define EARTH_RADIUS 6378.137struct Base{//基站结构体int ENODEBID;//基站标识float LONGITUDE;//基站经度float LATITUDE;//基站纬度int NUM;//基站k-dist距离};void readfile(struct Base * base,int n) //读取文件函数{FILE * fp;int i=0;if(n==21)fp=fopen("21个基站凸多边形数据.csv","rb");elsefp=fopen("29个基站凸多边形数据.csv","rb");if(fp==NULL)//打开文件失败printf("Can't open file ");else{while(EOF!=fscanf(fp,"%d,%f,%f,%d",&base[i].ENODEBID,&base[i].LO NGITUDE,&base[i].LATITUDE,&base[i].NUM)){//将数据读入结构体数组i++;//printf("%d\n",i);}// printf("文件读入成功!!!\n\n\n");fclose(fp);}float rad(float LatOrLon){return LatOrLon * 3.14/180.0;}float distance(struct Base * base,int a,int b)//求两个基站间的距离{float s;float radLat1,radLat2,radlng1,radlng2;radLat1 = rad(base[a].LATITUDE);radLat2 = rad(base[b].LATITUDE);radlng1 = rad(base[a].LONGITUDE);radlng2 = rad(base[b].LONGITUDE);//利用正弦余弦公式求距离if(radLat1==radLat2&&radlng1==radlng2)s=0;elses=acos(cos(radLat1)*cos(radLat2)*cos(radlng1-radlng2)+sin(radLat1)*s in(radLat2));s = s * EARTH_RADIUS;s=round(s*1000);}return s;}float weight(struct Base * base,int a,int b,int c){float s,s1,s2,s3;s1=distance(base,a,b);s2=distance(base,b,c);s3=distance(base,a,c);//s=distance(base,a,b)+distance(base,b,c)+distance(base,a,c);s=s1+s2+s3;return s;}float MinWeightTriangulation(struct Base * base,int n,float t[][N],int s[][N]){int i,j,r,k;float u=0;for(i=1;i<=n;i++)t[i][i]=0;for(r=2;r<=n;r++) //r为当前计算的链长(子问题规模)for(i=1;i<=n-r+1;i++)//n-r+1为最后一个r链的前边界{j=i+r-1;//计算前边界为r,链长为r的链的后边界t[i][j]=t[i+1][j]+weight(base,i-1,i,j);//将链ij划分为A(i) * ( A[i+1:j] )这里实际上就是k=is[i][j]=i;for (k=i+1;k<i+r-1;k++) //将链ij划分为( A[i:k] )* (A[k+1:j]){u=t[i][k]+t[k+1][j]+weight(base,i-1,k,j);if(u<t[i][j]){t[i][j]=u;s[i][j]=k;}}}return t[1][n];}void Traceback(int i,int j,int s[][N]){if(i==j)return;Traceback(i,s[i][j],s);Traceback(s[i][j]+1,j,s);printf("三角剖分顶点:V%d , V%d , V%d\n",i-1,j,s[i][j]); }main(){int i;float t[N][N];int s[N][N];struct Base base21[N];//结构体(N宏定义)struct Base base29[N];//结构体(N宏定义)readfile(base21,21);//将数据从文件中读到结构体中readfile(base29,29);//将数据从文件中读到结构体中printf("文件读入成功!!!\n\n\n");// for(i=0;i<=28;i++)//printf("%6d %.3f %.5f %d\n",base29[i].ENODEBID,base29[i].LONGITU DE,base29[i].LATITUDE,base29[i].NUM);printf("凸21多边形的最优三角剖分值为%f",MinWeightTriangulation(base21,20,t,s));printf("最优三角剖分结构为:\n");Traceback(1,20,s); //s[i][j]记录了Vi-1和Vj构成三角形的第3个顶点的位置printf("凸29多边形的最优三角剖分值为%f",MinWeightTriangulation(base29,28,t,s));printf("最优三角剖分结构为:\n");Traceback(1,28,s); //s[i][j]记录了Vi-1和Vj构成三角形的第3个顶点的位置system("pause");return 0;}4.01背包问题#include<stdio.h>#include<stdlib.h>#define N 100struct Goods{int weight;//物品重量int value;//物品价值};int knapsack(struct Goods *goods,int bag,int number,int p[][2],int head[]){int left=0,right=0,next=1,i,j,k,m,y;p[0][0]=0;p[0][1]=0;head[number+1]=0;head[number]=1;for(i=number;i>=1;i--){k=left;for(j=left;j<=right&&p[j][0]+goods[i-1].weight<=bag;j++){ y=p[j][0]+goods[i-1].weight;m=p[j][1]+goods[i-1].value;while(k<=right&&p[k][0]<y){p[next][0]=p[k][0];p[next][1]=p[k][1];next++;k++;}if(k<=right&&p[k][0]==y){if(m<p[k][1]){m=p[k][1];}k++;}if(m>p[next-1][1]){p[next][0]=y;p[next][1]=m;next++;}while(k<=right&&p[k][1]<=p[next-1][1]){k++;}}while(k<=right){p[next][0]=p[k][0];p[next][1]=p[k][1];next++;k++;}left=right+1;right=next-1;head[i-1]=next;}return next;}void traceback(struct Goods *goods,int number,int head[],int p[][2],int x[]){int j=p[head[0]-1][0],m=p[head[0]-1][1];int i,k,a;for(i=1;i<=number;i++){x[i]=0;a=1;// for(k=3450;k<=head[i]-1&&a==1;k++)for(k=head[i+1];k<=head[i]-1&&a==1;k++){if(p[k][0]+goods[i-1].weight==j&&p[k][1]+goods[i-1].value==m){x[i]=1;j=p[k][0];m=p[k][1];a=0;}}}}main(){int bag1,bag2;//背包容量int number1,number2;//物品数目int i,n;int p[20000][2];int h[N],x[N];struct Goods goods1[N],goods2[N];FILE *fp;char ch='0';if((fp=fopen("附件4.背包问题输入数据.txt","r"))==NULL)//打开文件失败printf("Can't open file ");else //读入背包和物品信息{fseek(fp,18,SEEK_CUR);fscanf(fp,"%d",&bag1);//背包1容量fseek(fp,18,SEEK_CUR);ch='0';for(i=0;ch!='\n';i++){fscanf(fp,"%d",&goods1[i].weight);//物品重量}number1=i;ch='0';fseek(fp,14,SEEK_CUR);for(i=0;ch!='\n'&&ch!=EOF;i++){fscanf(fp,"%d",&goods1[i].value);//物品价值ch=fgetc(fp);}if(number1!=i){printf("读取数据出错,程序将退出!\n");system("pause");}fseek(fp,22,SEEK_CUR);fscanf(fp,"%d",&bag2);//背包1容量fseek(fp,18,SEEK_CUR);ch='0';for(i=0;ch!='\n';i++){fscanf(fp,"%d",&goods2[i].weight);//物品重量}number2=i;ch='0';fseek(fp,14,SEEK_CUR);for(i=0;ch!='\n'&&ch!=EOF;i++){fscanf(fp,"%d",&goods2[i].value);//物品价值ch=fgetc(fp);}if(number2!=i){printf("读取数据出错,程序将退出!\n");system("pause");}}printf("文件读取成功!!!\n");/*打印文件的信息*/printf("\n\n第一组背包数据:\n");printf("背包容量:%d 物品数量:%d\n物品重量:\n",bag1,number1);for(i=0;i<number1;i++)printf("%d ",goods1[i].weight);printf("\n物品价值:\n");for(i=0;i<number1;i++)printf("%d ",goods1[i].value);printf("\n\n第二组背包数据:\n");printf("背包容量:%d 物品数量:%d\n物品重量:\n",bag2,number2);for(i=0;i<number2;i++)printf("%d ",goods2[i].weight);printf("\n物品价值:\n");for(i=0;i<number2;i++)printf("%d ",goods2[i].value);n=knapsack(goods1,bag1,number1,p,h);traceback(goods1,number1,h,p,x); //确定放入的物品//打印结果printf("\n\n第一组:\n背包重量为:%d 背包价值为:%d\n",p[n-1][0],p[n-1][1]);printf("放入的物品为:\n");for(i=1;i<number1;i++)if(x[i]==1)printf("物品%-2d 重量%-2d 价值%d\n",i,goods1[i-1].weight,goods1[i-1].value);//第二组数据n=knapsack(goods2,bag2,number2,p,h);traceback(goods2,number2,h,p,x);printf("\n\n第二组:\n背包重量为:%d 背包价值为:%d\n",p[n-1][0],p[n-1][1]);printf("放入的物品为:\n");for(i=1;i<number2;i++)if(x[i]==1)printf("物品%-2d 重量%-2d 价值%d\n",i,goods2[i-1].weight,goods2[i-1].value);system("pause");return 0;}运行结果1.最长公共子序列2.最大子段和3.凸多边形最优三角剖分4.01背包问题。

北邮数据结构第三次实验-实验报告

北邮数据结构第三次实验-实验报告

数据结构实验报告实验名称:实验三——栈和队列学生姓名:班级:班内序号:学号:日期:1.实验要求1.1 实验目的通过选择下面两个题目之一进行实现,掌握如下内容:➢掌握二叉树基本操作的实现方法➢了解赫夫曼树的思想和相关概念➢学习使用二叉树解决实际问题的能力1.2 实验内容根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。

二叉树的基本功能:1、二叉树的建立2、前序遍历二叉树3、中序遍历二叉树4、后序遍历二叉树5、按层序遍历二叉树6、求二叉树的深度7、求指定结点到根的路径8、二叉树的销毁9、其他:自定义操作编写测试main()函数测试线性表的正确性2. 程序分析2.1 二叉链表2.2 二叉树的二叉链表存储示意图2.3 关键算法分析2.3.1算法1:void create(Binode<T> *&R, T data[], int i);[1] 算法功能:创建一个二叉树[2] 算法基本思想:通过构造函数创建一个二叉树,构造函数通过调用函数create()创建二叉树,关于函数create()的伪代码:1.定义根指针,输入节点储存的data,若输入“#”,则该节点为空;2.申请一个新节点,判断它的父结点是否不为空,如果不为空在判断其为左或者右孩子,并把地址付给父结点,把data写入。

[3] 算法空间、时间复杂度:O(n)[4] 代码逻辑(可用伪代码描述):if(data[i-1]!=0){R = new Binode<T>;R->data= data[i-1];R->lch = R->rch = NULL;create(R->lch, data,2*i);create(R->rch, data, 2*i+1);}2.3.2算法2:void Destroy(Binode<T> *R);[1] 算法功能:二叉树的销毁[2] 算法基本思想:采用后序遍历的方法,释放节点。

算法设计与分析实验报告

算法设计与分析实验报告

算法设计与分析实验报告算法设计与分析实验报告引言:算法设计与分析是计算机科学中的重要课程,它旨在培养学生解决实际问题的能力。

本次实验旨在通过设计和分析不同类型的算法,加深对算法的理解,并探索其在实际应用中的效果。

一、实验背景算法是解决问题的步骤和方法的描述,是计算机程序的核心。

在本次实验中,我们将重点研究几种经典的算法,包括贪心算法、动态规划算法和分治算法。

通过对这些算法的设计和分析,我们可以更好地理解它们的原理和应用场景。

二、贪心算法贪心算法是一种基于局部最优选择的算法,它每一步都选择当前状态下的最优解,最终得到全局最优解。

在实验中,我们以背包问题为例,通过贪心算法求解背包能够装下的最大价值物品。

我们首先将物品按照单位重量的价值从大到小排序,然后依次将能够装入背包的物品放入,直到背包无法再装下物品为止。

三、动态规划算法动态规划算法是一种通过将问题分解为子问题,并记录子问题的解来求解整体问题的算法。

在实验中,我们以斐波那契数列为例,通过动态规划算法计算斐波那契数列的第n项。

我们定义一个数组来保存已经计算过的斐波那契数列的值,然后通过递推公式将前两项的值相加得到后一项的值,最终得到第n项的值。

四、分治算法分治算法是一种将问题分解为更小的子问题,并通过递归求解子问题的算法。

在实验中,我们以归并排序为例,通过分治算法对一个无序数组进行排序。

我们首先将数组分成两个子数组,然后对子数组进行递归排序,最后将两个有序的子数组合并成一个有序的数组。

五、实验结果与分析通过对以上三种算法的设计和分析,我们得到了以下实验结果。

在贪心算法中,我们发现该算法能够在有限的时间内得到一个近似最优解,但并不能保证一定得到全局最优解。

在动态规划算法中,我们发现该算法能够通过记忆化搜索的方式得到准确的结果,但在问题规模较大时,其时间复杂度较高。

在分治算法中,我们发现该算法能够将问题分解为更小的子问题,并通过递归求解子问题,最终得到整体问题的解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计与分析第三章程序作业源程序代码1.最长公共子序列#include<stdio.h>#include<stdlib.h>#define N 1000int e[N][N],f[N][N];void LCSLength(int m,int n,char *x,char *y,int c[][N],int b[][N])//构造数组b[i][j]{int i,j;for (i=1; i<=m;i++)c[i][0]=0; //初始化, Y[j]为空时for (i=1;i<=n;i++)c[0][i]=0; //初始化,X[i]为空时for (i=1;i<=m;i++) //两重循环,自下而上,// 计算子问题{X(i), Y(j)}for (j=1;j<=n;j++){if(x[i]==y[j]){ //情况1c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}else if(c[i-1][j]>=c[i][j-1]){ //情况2c[i][j]=c[i-1][j];b[i][j]=2;}else //情况3{c[i][j]=c[i][j-1];b[i][j]=3;}}}void LCS(int i,int j,char *x,int b[][N]){if (i==0||j==0)return;if (b[i][j]==1){LCS(i-1,j-1,x,b);printf("%c",x[i]);/*第1种情况下,X(i)和Y(j)的最长公共子序列由X(i-1)和Y(j-1)的解LCS(i-1, j-1, x, b),加上位于最后的X[i]组成*/}else if(b[i][j]==2)LCS(i-1,j,x,b);elseLCS(i,j-1,x,b); //其它2种情况下,原问题解等于子问题解}main(){char A[N],B[N],C[N],D[N];int a=1,b=1,c=1,d=1;char ch;int i;FILE * fp;if((fp=fopen("最长公共子序列输入数据.txt","r"))==NULL)//打开文件失败printf("Can't open file ");else{//读取文件内容ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!='B'&&ch!=EOF) {A[a]=ch;a++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}a--;ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!='C'&&ch!=EOF) {B[b]=ch;b++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}b--;ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!='D'&&ch!=EOF) {C[c]=ch;c++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}c--;ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);ch=fgetc(fp);while(ch!=EOF){D[d]=ch;d++;ch=fgetc(fp);while(ch=='\n')ch=fgetc(fp);}d--;}fclose(fp);printf("文件读取完成\n");/* for(i=0;i<=a;i++)printf("%c",A[i]);printf("\n");for(i=0;i<=b;i++)printf("%c",B[i]);printf("\n");for(i=0;i<=c;i++)printf("%c",C[i]);printf("\n");for(i=0;i<=d;i++)printf("%c",D[i]);printf("\n"); */printf("\n\n\nA和B的最长公共子序列为:\n");LCSLength(a,b,A,B,e,f);LCS(a,b,A,f);printf("\n\n\nC和D的最长公共子序列为:\n");LCSLength(c,d,C,D,e,f);LCS(c,d,C,f);printf("\n\n\nA和D的最长公共子序列为:\n");LCSLength(a,d,A,D,e,f);LCS(a,d,A,f);system("pause");return 0;}2.最大子段和#include<stdio.h>#include<stdlib.h>#define N 400void MaxSum(int n,int *a){int sum=0,b=0;int i,x1=0,y1=0,x=0,y=0;for(i=1;i<=n;i++){if (b>0){b+=a[i];y1=i;}else{b=a[i];x1=i;}if(b>sum){sum=b;x=x1;y=y1;}}printf("\n该序列的最大子段和的位置为从第%d个到第%d个",x+1,y+1);printf("\n该序列的和最大子段为:\n");for(i=x;i<=y;i++)printf("%d ",a[i]);printf("\n它们的和为%d \n",sum);}main(){int A[N],B[N];int a=0,b=0;int i;FILE *fp1,*fp2;if((fp1=fopen("最大子段和输入数据-序列1.txt","r"))==NULL)//打开文件失败printf("Can't open file1 ");else //读取文件内容{for(i=0;!feof(fp1);i++)fscanf(fp1,"%d\n",&A[i]);a=i-1;}if((fp2=fopen("最大子段和输入数据-序列2.txt","r"))==NULL)//打开文件失败printf("Can't open file2 ");else{for(i=0;!feof(fp2);i++)fscanf(fp2,"%d\n",&B[i]);b=i-1;}fclose(fp1);fclose(fp1);printf("文件读取成功!!!\n\n\n");printf("对于最大子段和输入数据-序列1 ");MaxSum(a,A);//计算最大子段和printf("\n\n对于最大子段和输入数据-序列2 ");MaxSum(b,B);// for(i=0;i<=b;i++)// printf("%d ",B[i]);system("pause");return 0;}3.凸多边形最优三角剖分#include<stdio.h>#include<stdlib.h>#include<math.h>#define N 30#define EARTH_RADIUS 6378.137struct Base{//基站结构体int ENODEBID;//基站标识float LONGITUDE;//基站经度float LATITUDE;//基站纬度int NUM;//基站k-dist距离};void readfile(struct Base * base,int n) //读取文件函数{FILE * fp;int i=0;if(n==21)fp=fopen("21个基站凸多边形数据.csv","rb");elsefp=fopen("29个基站凸多边形数据.csv","rb");if(fp==NULL)//打开文件失败printf("Can't open file ");else{while(EOF!=fscanf(fp,"%d,%f,%f,%d",&base[i].ENODEBID,&base[i].LO NGITUDE,&base[i].LATITUDE,&base[i].NUM)){//将数据读入结构体数组i++;//printf("%d\n",i);}// printf("文件读入成功!!!\n\n\n");}fclose(fp);}float rad(float LatOrLon){return LatOrLon * 3.14/180.0;}float distance(struct Base * base,int a,int b)//求两个基站间的距离{float s;float radLat1,radLat2,radlng1,radlng2;radLat1 = rad(base[a].LATITUDE);radLat2 = rad(base[b].LATITUDE);radlng1 = rad(base[a].LONGITUDE);radlng2 = rad(base[b].LONGITUDE);//利用正弦余弦公式求距离if(radLat1==radLat2&&radlng1==radlng2)s=0;else{s=acos(cos(radLat1)*cos(radLat2)*cos(radlng1-radlng2)+sin(radLat1)*s in(radLat2));s = s * EARTH_RADIUS;s=round(s*1000);}return s;}float weight(struct Base * base,int a,int b,int c){float s,s1,s2,s3;s1=distance(base,a,b);s2=distance(base,b,c);s3=distance(base,a,c);//s=distance(base,a,b)+distance(base,b,c)+distance(base,a,c);s=s1+s2+s3;return s;}float MinWeightTriangulation(struct Base * base,int n,float t[][N],int s[][N]){int i,j,r,k;float u=0;for(i=1;i<=n;i++)t[i][i]=0;for(r=2;r<=n;r++) //r为当前计算的链长(子问题规模)for(i=1;i<=n-r+1;i++)//n-r+1为最后一个r链的前边界{j=i+r-1;//计算前边界为r,链长为r的链的后边界t[i][j]=t[i+1][j]+weight(base,i-1,i,j);//将链ij划分为A(i) * ( A[i+1:j] )这里实际上就是k=is[i][j]=i;for (k=i+1;k<i+r-1;k++) //将链ij划分为( A[i:k] )* (A[k+1:j]){u=t[i][k]+t[k+1][j]+weight(base,i-1,k,j);if(u<t[i][j]){t[i][j]=u;s[i][j]=k;}}}return t[1][n];}void Traceback(int i,int j,int s[][N]){if(i==j)return;Traceback(i,s[i][j],s);Traceback(s[i][j]+1,j,s);printf("三角剖分顶点:V%d , V%d , V%d\n",i-1,j,s[i][j]); }main(){int i;float t[N][N];int s[N][N];struct Base base21[N];//结构体(N宏定义)struct Base base29[N];//结构体(N宏定义)readfile(base21,21);//将数据从文件中读到结构体中readfile(base29,29);//将数据从文件中读到结构体中printf("文件读入成功!!!\n\n\n");// for(i=0;i<=28;i++)//printf("%6d %.3f %.5f %d\n",base29[i].ENODEBID,base29[i].LONGITU DE,base29[i].LATITUDE,base29[i].NUM);printf("凸21多边形的最优三角剖分值为%f",MinWeightTriangulation(base21,20,t,s));printf("最优三角剖分结构为:\n");Traceback(1,20,s); //s[i][j]记录了Vi-1和Vj构成三角形的第3个顶点的位置printf("凸29多边形的最优三角剖分值为%f",MinWeightTriangulation(base29,28,t,s));printf("最优三角剖分结构为:\n");Traceback(1,28,s); //s[i][j]记录了Vi-1和Vj构成三角形的第3个顶点的位置system("pause");return 0;}4.01背包问题#include<stdio.h>#include<stdlib.h>#define N 100struct Goods{int weight;//物品重量int value;//物品价值};int knapsack(struct Goods *goods,int bag,int number,int p[][2],int head[]){int left=0,right=0,next=1,i,j,k,m,y;p[0][0]=0;p[0][1]=0;head[number+1]=0;head[number]=1;for(i=number;i>=1;i--){k=left;for(j=left;j<=right&&p[j][0]+goods[i-1].weight<=bag;j++){ y=p[j][0]+goods[i-1].weight;m=p[j][1]+goods[i-1].value;while(k<=right&&p[k][0]<y){p[next][0]=p[k][0];p[next][1]=p[k][1];next++;k++;}if(k<=right&&p[k][0]==y){if(m<p[k][1]){m=p[k][1];}k++;}if(m>p[next-1][1]){p[next][0]=y;p[next][1]=m;next++;}while(k<=right&&p[k][1]<=p[next-1][1]){k++;}}while(k<=right){p[next][0]=p[k][0];p[next][1]=p[k][1];next++;k++;}left=right+1;right=next-1;head[i-1]=next;}return next;}void traceback(struct Goods *goods,int number,int head[],int p[][2],int x[]){int j=p[head[0]-1][0],m=p[head[0]-1][1];int i,k,a;for(i=1;i<=number;i++){x[i]=0;a=1;// for(k=3450;k<=head[i]-1&&a==1;k++)for(k=head[i+1];k<=head[i]-1&&a==1;k++){if(p[k][0]+goods[i-1].weight==j&&p[k][1]+goods[i-1].value==m){x[i]=1;j=p[k][0];m=p[k][1];a=0;}}}}main(){int bag1,bag2;//背包容量int number1,number2;//物品数目int i,n;int p[20000][2];int h[N],x[N];struct Goods goods1[N],goods2[N];FILE *fp;char ch='0';if((fp=fopen("附件4.背包问题输入数据.txt","r"))==NULL)//打开文件失败printf("Can't open file ");else //读入背包和物品信息{fseek(fp,18,SEEK_CUR);fscanf(fp,"%d",&bag1);//背包1容量fseek(fp,18,SEEK_CUR);ch='0';for(i=0;ch!='\n';i++){ch=fgetc(fp);}number1=i;ch='0';fseek(fp,14,SEEK_CUR);for(i=0;ch!='\n'&&ch!=EOF;i++){fscanf(fp,"%d",&goods1[i].value);//物品价值ch=fgetc(fp);}if(number1!=i){printf("读取数据出错,程序将退出!\n");system("pause");}fseek(fp,22,SEEK_CUR);fscanf(fp,"%d",&bag2);//背包1容量fseek(fp,18,SEEK_CUR);ch='0';for(i=0;ch!='\n';i++){ch=fgetc(fp);}number2=i;ch='0';fseek(fp,14,SEEK_CUR);for(i=0;ch!='\n'&&ch!=EOF;i++){fscanf(fp,"%d",&goods2[i].value);//物品价值ch=fgetc(fp);}if(number2!=i){printf("读取数据出错,程序将退出!\n");system("pause");}}printf("文件读取成功!!!\n");/*打印文件的信息*/printf("\n\n第一组背包数据:\n");printf("背包容量:%d 物品数量:%d\n物品重量:\n",bag1,number1);for(i=0;i<number1;i++)printf("%d ",goods1[i].weight);printf("\n物品价值:\n");for(i=0;i<number1;i++)printf("%d ",goods1[i].value);printf("\n\n第二组背包数据:\n");printf("背包容量:%d 物品数量:%d\n物品重量:\n",bag2,number2);for(i=0;i<number2;i++)printf("%d ",goods2[i].weight);printf("\n物品价值:\n");for(i=0;i<number2;i++)printf("%d ",goods2[i].value);n=knapsack(goods1,bag1,number1,p,h);traceback(goods1,number1,h,p,x); //确定放入的物品//打印结果printf("\n\n第一组:\n背包重量为:%d 背包价值为:%d\n",p[n-1][0],p[n-1][1]);printf("放入的物品为:\n");for(i=1;i<number1;i++)if(x[i]==1)printf("物品%-2d 重量%-2d 价值%d\n",i,goods1[i-1].weight,goods1[i-1].value);//第二组数据n=knapsack(goods2,bag2,number2,p,h);traceback(goods2,number2,h,p,x);printf("\n\n第二组:\n背包重量为:%d 背包价值为:%d\n",p[n-1][0],p[n-1][1]);printf("放入的物品为:\n");for(i=1;i<number2;i++)if(x[i]==1)printf("物品%-2d 重量%-2d 价值%d\n",i,goods2[i-1].weight,goods2[i-1].value);system("pause");return 0;}运行结果1.最长公共子序列2.最大子段和3.凸多边形最优三角剖分4.01背包问题。

相关文档
最新文档