080551张超.docx
《080551张超.docx》由会员分享,可在线阅读,更多相关《080551张超.docx(71页珍藏版)》请在冰豆网上搜索。
![080551张超.docx](https://file1.bdocx.com/fileroot1/2023-2/5/d3b9be7b-2972-4ffe-ac6b-4d09104f4914/d3b9be7b-2972-4ffe-ac6b-4d09104f49141.gif)
080551张超
实验最终成绩:
差
《算法设计与分析》实验教学大纲
实验学时:
32实验个数:
7实验学分:
1
课程性质:
适用专业:
计算机科学与技术、软件工程
教材及参考书:
1.《计算机算法设计与分析》,王晓东,北京:
电子工业出版社,2005年
2.《算法与数据结构》,傅清祥等著,北京:
电子工业出版社,2003
3.《计算机算法导引—设计与分析》,卢开澄著,北京:
清华大学出版社,2001
大纲执笔人:
刘芳大纲审定人:
郭涛
一、实验课的性质与任务
算法的设计与分析是计算机科学的核心问题之一,也是计算机科学与技术专业本科及研究生的一门重要的专业基础课,其内容是研究计算机领域及其有关领域中的一些非数值计算的常用算法。
课程将覆盖计算机软件实现中常用的、有代表性的算法,并具有一定的深度和广度,通过实验,使学生理解并掌握算法设计的基本技术,让学生具有针对所给的问题设计和实现高效算法的基本能力。
二、实验课程目的与要求
计算机科学的一个核心问题是算法理论,本课程介绍非数值算法设计的策略与技术,同时介绍算法的复杂性的概念通过对一些代表性算法的使用达到了解掌握与运用的目的。
通过完成课程实验,使学生达到如下要求:
1.熟悉各种基本常用算法的基本思想、适用范围,初步掌握算法分析的基本技巧以及如何根据实际问题设计一个有效的算法。
2.能对给定问题分析出恰当的数学模型,并设计出解决方案,将算法用高级语言(C,VC++等)编程实现。
三、实验项目及内容提要
算法设计与分析实验课程
序号
实验项目编号
实验名称
学时
必做
选做
学分数
实验类型
内容提要
基本操作
验证
综合
设计
1
1
算法设计基础
4
√
差
√
√
通过本次实验,程序设计语言基础知识,熟悉文件操作等
2
2
递归与分治策略及其应用
6
√
良
√
√
掌握递归算法的设计思想,提高应用分治法设计算法的技能
3
3
动态规划及其应用
6
√
差
√
√
掌握设计动态规划算法的步骤,并编程实现有关算法。
4
4
贪心算法及其应用
6
√
差
√
√
通过本次实验,掌握设计贪心算法的步骤,并编程实现有关问题的求解
54
5
回溯法及其应用
6
√
差
√
√
通过本实验,理解回溯法的深度搜索策略,掌握用回溯法解题的算法框架。
6
6
分支限界法及其应用
2
√
差
√
通过本实验,理解分支限界法的剪枝搜索策略,掌握用分支限界法算法框架
7
7
线性规划问题的求解
2
√
差
√
理解线性规划的算法模型,了解求解线性规划的单纯形算法,学会使用Excel求解线性规划问题。
三、实验内容安排:
实验一算法设计基础
(验证型、设计型实验4学时)
1.实验目的
(1)巩固程序设计语言基础知识,熟悉文件操作等。
(2)对给定问题,能设计算法并编程实现问题的求解,并分析算法的时间复杂性。
2.实验要求
(1)认真填写实验报告,附加源代码(主要代码)和运行记录;
(2)对设计好的算法,测试运行实验数据,检查输出是否正确。
并对算法的时间和空间复杂度进行分析。
3.实验内容:
(1)统计数字问题(P8)
#include"stdafx.h"
#include
#include
#include
usingnamespacestd;
voidread_information(string&Data)
{//从文件中读出停车场信息,并且存放在数组中
cout<<"正在读取数据......"<FILE*fp;
charch;
if((fp=fopen("data.txt","rt+"))==NULL)
{
printf("\nCannotopenfilestrikeanykeyexit!
");
getch();
exit
(1);
}
ch=fgetc(fp);
while(ch!
=EOF)
{
Data=Data+ch;
ch=fgetc(fp);
}
fclose(fp);
cout<<"读取完成......"<}
voidsave_information(stringdata)
{//把数组中的停车场信息存放回文件中
cout<<"正在写入文件......"<FILE*fp;//定义文件流指针,用于打开写操作的文件
charch[2]="\0";//定义一个字符串数组,用于存储读取的字符
inti=0;
fp=fopen("answer.txt","w");//写方式打开文件a.txt
while(i{
ch[0]=data[i++];
fputs(ch,fp);//将内容写到fp2所指向文件中
}
fclose(fp);//关闭文件b.txt
cout<<"写入完成......"<}
intmain(intargc,char*argv[])
{
intPage;
intNum[10]={0,0,0,0,0,0,0,0,0,0};
stringData;
intjishu=0;
read_information(Data);
Page=atoi(Data.c_str());
cout<<"计算中.\n"<for(inti=1;i<=Page;i++)
{
charsz[10];
itoa(i,sz,10);
for(intj=0;sz[j]!
='\0';j++)
{
Num[sz[j]-48]++;
}
if((int)i/Page*100>jishu)
{
jishu=i/Page*100;
cout<}
}
cout<stringanswer="";
for(i=0;i<10;i++)
{
chartmp[10];
charsz[2];
itoa(Num[i],tmp,10);
itoa(i,sz,10);
answer=answer+sz[0];
answer=answer+":
";
for(intj=0;j<10&&tmp[j]!
='\0';j++)
{
answer=answer+tmp[j];
}
answer=answer+'\n';
}
save_information(answer);
system("pause");
return0;
}字典序问题(P8)
(2)最多约数问题(P9)
#include"stdafx.h"
#include
#include
usingnamespacestd;
intyueshuNum(intx)
{
intnum=0;
for(inti=1;i<=x;i++)
{
if(x%i==0)
{
num++;
}
}
returnnum;
}
voidread_information(string&Data)
{//从文件中读出停车场信息,并且存放在数组中
cout<<"正在读取数据......"<FILE*fp;
charch;
if((fp=fopen("data.txt","rt+"))==NULL)
{
printf("\nCannotopenfilestrikeanykeyexit!
");
exit
(1);
}
ch=fgetc(fp);
while(ch!
=EOF)
{
Data=Data+ch;
ch=fgetc(fp);
}
fclose(fp);
cout<<"读取完成......"<}
voidsave_information(stringdata)
{//把数组中的停车场信息存放回文件中
cout<<"正在写入文件......"<FILE*fp;//定义文件流指针,用于打开写操作的文件
charch[2]="\0";//定义一个字符串数组,用于存储读取的字符
inti=0;
fp=fopen("answer.txt","w");//写方式打开文件a.txt
while(i{
ch[0]=data[i++];
fputs(ch,fp);//将内容写到fp2所指向文件中
}
fclose(fp);//关闭文件b.txt
cout<<"写入完成......"<}
intmain(intargc,char*argv[])
{
intstart,end;
intNum=0,flag=1;
stringdata;
read_information(data);
chartmpstart[10];
chartmpend[10];
for(intj=0;data[j]!
='\0';j++)
{
if(data[j]=='')
{
flag=j+1;
}
elseif(flag==1)
{
tmpstart[j]=data[j];
}
else
{
tmpend[j-flag]=data[j];
}
}
start=atoi(tmpstart);
end=atoi(tmpend);
for(inti=start;i<=end;i++)
{
intnum=yueshuNum(i);
if(num>Num)
{
Num=num;
}
}
charanswerchar[10];
stringanswer="";
itoa(Num,answerchar,10);
for(i=0;i<10&&answerchar[i]!
='\0';i++)
{
answer=answer+answerchar[i];
}
save_information(answer);
return0;
}
(3)最大间隙问题(P10)
(4)设计算法求解fibonacci数列的第110项的值,并统计和分析算法的时间性能。
注:
至少选择其中2题完成
实验二递归与分治策略及其应用
(验证型、设计型实验6学时)
1.实验目的
(1)进一步掌握递归算法的设计思想以及递归程序的调试技术。
(2)提高应用分治法设计算法的技能
(3)理解这样一个观点:
分治和递归经常同时应用在算法设计中。
2.实验要求
(1)认真填写实验报告,附加源代码(主要代码)和运行记录;
(2)对设计好的算法,要分析算法的时间性能。
3.实验内容:
(1)设计算法求解整数的划分问题,对给定的整数,输出划分数。
(P14)并思考如何实现输出每个具体的划分。
#include"iostream"
#include
usingnamespacestd;
intq(intm,intn)
{
if((n<1)||(m<1))
return0;
if((n==1)||(m==1))
return1;
if(mreturnq(m,m);
if(m==n)
returnq(m,n-1)+1;
returnq(m,n-1)+q(m-n,n);
}
voidmain()
{
intn,m;
cout<<"分别输入m和n的值(m为被划分数,n为最大加数)"<cin>>m>>n;
cout<<"划分数为:
"<cout<system("pause");
}
(2)设计算法求解n个互异元素的全排列的算法并编程实现(P13),并在此基础上修改程序,使其能解决有重复元素的排列问题(P41算法实现题2-5)。
(3)设计算法求解棋盘的覆盖问题,并编程实现(P20)。
#include
inttile=1;
intboard[100][100];
voidchessBoard(inttr,inttc,intdr,intdc,intsize)
{
if(size==1)
return;
intt=tile++;
ints=size/2;
if(dr
chessBoard(tr,tc,dr,dc,s);
else
{
board[tr+s-1][tc+s-1]=t;
chessBoard(tr,tc,tr+s-1,tc+s-1,s);}
if(dr
|
=tc+s)chessBoard(tr,tc+s,dr,dc,s);
else
{
board[tr+s-1][tc+s]=t;
chessBoard(tr,tc+s,tr+s-1,tc+s,s);
}
if(dr>=tr+s&&dcchessBoard(tr+s,tc,dr,dc,s);
else
{
board[tr+s][tc+s-1]=t;
chessBoard(tr+s,tc,tr+s,tc+s-1,s);}
if(dr>=tr+s&&dc>=tc+s)
chessBoard(tr+s,tc+s,dr,dc,s);
else
{
board[tr+s][tc+s]=t;
chessBoard(tr+s,tc+s,tr+s,tc+s,s);}}
voidmain()
{
intsize;
cout<<"输入棋盘的size(大小必须是2的n次幂):
";
cin>>size;
intindex_x,index_y;
cout<<"输入特殊方格位置的坐标:
";
cin>>index_x>>index_y;
chessBoard(0,0,index_x,index_y,size);
for(inti=0;i{
for(intj=0;jcout<cout<}
}
(4)设计一个求解Gray码的分治策略,并编程实现(P39算法分析题2-14)。
(5)设计求解半数集问题的算法,并编程实现。
(P40算法实现题2-3)
#include
#include
ifstreamfin("input.txt");
ofstreamfout("output.txt");
usingnamespacestd;
voidset(intnum,int&count)
//递归函数
{
for(inti=1;i<=num;i++)
{
count+=1;
set(i/2,count);
}
}
voidmain()
{
intcount=1;
intNum;
//文件操作
fin>>Num;//重新设置count的值
set(Num/2,count);
//调用递归函数进行计算
fout<//向文件中写入数据
fout.close();
//关闭文件
fin.close();
}
(6)设计求解整数因子分解问题的算法,并编程实现。
(P43算法实现题2-11)
#include"iostream"
#include
#include
ifstreamfin("input.txt");
ofstreamfout("output.txt");
usingnamespacestd;
voidmain()
{
intnumber,result;
intcount=1;
fin>>number;//输入整数
for(inti=2;i{
if(number%i==0)
{
result=number/i;//因子
for(inti=2;i<=result;i++)
{
if(result%i==0)
count++;
}
}
}
fout<fin.close();
fout.close();
}
(7)设计求解双色hanoi问题的算法,并编程实现。
(P43算法实现题2-11)
注:
至少选择其中4题完成
实验三动态规划及其应用
(验证型、设计型实验6学时)
1.目的要求
(1)理解动态规划算法的概念和基本要素,并能和分治法进行比较。
(2)掌握设计动态规划算法的步骤,并编程实现有关算法。
(3)理解这样一个观点:
同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果。
2.实验内容
(1)编程实现矩阵连乘问题的求解。
#include
usingnamespacestd;
constintMAX=100;
//p用来记录矩阵的行列,main函数中有说明
//m[i][j]用来记录第i个矩阵至第j个矩阵的最优解
//s[][]用来记录从哪里断开的才可得到该最优解
intp[MAX+1],m[MAX][MAX],s[MAX][MAX];
intn;//矩阵个数
intmatrixChain()
{
for(inti=0;i<=n;i++)
m[i][i]=0;
for(intr=2;r<=n;r++)//对角线循环
for(inti=0;i<=n-r;i++)//行循环
{
intj=r+i-1;//列的控制
//找m[i][j]的最小值,先初始化一下,令k=i
m[i][j]=m[i+1][j]+p[i+1]*p[i]*p[j+1];
s[i][j]=i;
//k从i+1到j-1循环找m[i][j]的最小值
for(intk=i+1;kinttemp=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];
if(temp{
m[i][j]=temp;
//s[][]用来记录在子序列i-j段中,在k位置处
//断开能得到最优解
s[i][j]=k;
}
}
}
returnm[0][n-1];
}
//根据s[][]记录的各个子段的最优解,将其输出
voidtraceback(inti,intj)
{
if(i==j)
{
cout<<'A'<
return;
}
if(i
cout<<'(';
traceback(i,s[i][j]);
if(i
cout<<')';
if(s[i][j]+1cout<<'(';
traceback(s[i][j]+1,j);
if(s[i][j]+1cout<<')';
}
voidtraceback(){
cout<<'(';
traceback(0,n-1);
cout<<')';
cout<}
intmain()
{
cout<<"请输入矩阵的个数:
"<>n;
cout<<"输入矩阵(形如a*b,中间用空格隔开):
"<for(inti=0;i<=n;i++)
cin>>p[i];
//测试数据可以设为六个矩阵分别为
//A1[30*35],A2[35*15],A3[15*5],A4[5*10],A5[10*20],A6[20*25]
//则p[0-6]={30,35,15,5,10,20,25}
cout<<"输出结果如下:
"<matrixChain();
traceback(0,n-1);
//最终解值为m[0][n-1];
cout<return0;
}
(2)编程实现最大子段和问题的求解(分别采用分治法和动态规划法求解)。
#include"iostream"
#include
usingnamespacestd;
//分治法
intmaxsubsum(int*a,intleft,intright)
{
intsum=0;
if(left==right)sum=a[left]>0?
a[left]:
0;
else
{
intcenter=(left+right)/2;
intleftsum=maxsubsum(a,left,center);
intright
展开阅读全文
相关搜索