算法设计课程设计报告.docx
《算法设计课程设计报告.docx》由会员分享,可在线阅读,更多相关《算法设计课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
算法设计课程设计报告
《算法设计与分析》
课程设计报告
题目:
循环赛日程表
院(系):
信息科学与工程学院
专业班级:
软工
学生姓名:
学号:
指导教师:
2013年12月30日至2014年1月10日
华中科技大学武昌分校制
算法设计与分析课程设计任务书
一、设计题目
循环赛日程表
问题描述:
设有n=2k个运动员要进行网球循环赛。
现要设计一个满足一下要求的比赛日程表。
(1)每个选手必须与其他n-1个选手各赛一次。
(2)每个选手一天只能参赛一次。
(3)循环赛在n-1天内结束。
请按此要求将比赛日程表设计成有n行和n-1列的一个表格。
在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手,其中1≤i≤n,1≤j≤n-1。
例如:
当n=4时,其比赛日程表如下:
123(天)
2
3
4
1
4
3
4
1
2
3
2
1
1
2
3
4
当n=8时,其比赛日程表如下:
1234567(天)
2
3
4
5
6
7
8
1
4
3
6
5
8
7
4
1
2
7
8
5
6
3
2
1
8
7
6
6
7
8
1
2
3
4
5
8
7
2
1
4
3
8
5
6
3
4
1
2
7
6
5
4
3
2
1
1
2
3
4
5
6
7
8
二、设计主要内容
具体要求如下:
(1)使用分治策略递归算法实现。
(2)使用分治策略非递归算法实现。
(3)使用递推算法实现。
(4)对各种算法的时间复杂度进行分析和比较。
(5)设计出相应的菜单,通过菜单的选择实现各个功能
三、原始资料
无
四、要求的设计成果
(1)实现该系统功能的程序代码
(2)撰写符合规范要求的课程设计报告
五、进程安排
序号
课程设计内容
学时分配
备注
1
选题与搜集资料
1天
2
分析与设计
1天
3
模块实现
4天
4
系统调试与测试
2天
5
撰写课程设计报告
2天
合计
10天
六、主要参考资料
[1] 吕国英.算法设计与分析.第2版.北京:
清华大学出版社,2011.
[2]王晓东.算法设计与分析.北京,清华大学出版社,2009.
[3]徐士良.计算机常用算法.第2版.北京,清华大学出版社出版,2010.
指导教师(签名):
20年月日
1.常用算法1
1常用算法
1.1分治算法
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。
求出子问题的解,就可得到原问题的解。
当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。
对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。
如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。
分治法解题一般步骤:
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
1.2递推算法
给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当n>n0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0
递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。
递推算法分为顺推和逆推两种。
所谓顺推法是从已知条件出发,逐步推算出要解决的问题的方法叫顺推。
所谓逆推法从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为逆推。
2问题分析及算法设计
2.1分治策略递归算法的设计
inta[50][50];
fun1()
{
intn=1.k;
input(k);
for(i=1;i<=k;i=i+1)n=n*2;
digui(1,n,n);
for(i=1;i<=k;i=i+1)
{print(换行);
for(j=1;j<=n;j=j+1)
print(a[i][j]);}
}
digui(inti,intj,intn)
{
intt,m;
if(n==2)
{
a[i][n]=j;
a[j][n]=i;
a[i][n-1]=i;
a[j][n-1]=j;
}
else
{
digui(i,i+n/2-1,n/2);
digui(i+n/2,j,n/2);
for(t=n;t>n/2;t--)
{
for(m=i;m<=i-1+n/2;m=m+1)
a[m][t]=a[m+n/2][t-n/2];
for(m=i+n/2;m<=i-1+n;m=m+1)
a[m][t]=a[m-n/2][t-n/2];
}
}
}
2.2分治策略非递归算法的设计
fun2()
{
intn=1,e,m;
inti,j,t,h,k;
intw,y;
input(k)
for(i=1;i<=k;i=i+1)
n=n*2;
for(j=1;j<=n;j=j+1)
a[j][1]=j;
m=n;
for(n=2;n<=m;n=n*2)
{
e=n/2;
for(t=n;t>e;t=t-1)
for(i=1;i{
for(h=i;h<=i-1+e;h=h+1)
a[h][t]=a[h+e][t-e];
for(h=i+e;h<=i-1+n;h=h+1)
a[h][t]=a[h-e][t-e];
}
}
for(i=1;i<=m;i=i+1)
{
print("\n");
for(j=1;j<=m;j=j+1)
print(a[i][j]);
}
print("\n");}
2.3递推策略算法的设计
fun3()
{
intn=2,e=1,i,j,k,k0;
intw,y;
a[1][1]=1;
input(k);
for(k0=1;k0<=k;k0=k0+1)
{
for(i=e+1;i<=n;i=i+1)
for(j=1;j<=n;j=j+1)
a[i][j]=a[i-e][j]+e;
for(j=e+1;j<=n;j=j+1)
for(i=1;i<=e;i=i+1)
a[i][j]=a[i][j-e]+e;
for(j=e+1;j<=n;j=j+1)
for(i=e+1;i<=n;i=i+1)
a[i][j]=a[i][j-e]-e;
e=n;
n=n*2;
}
n=n/2;
for(i=1;i<=n;i=i+1)
{
printf("\n");
for(j=1;j<=n;j=j+1)
print(a[i][j]);
}
print("\n");}
3算法实现
3.1分治策略递归算法的实现
voiddigui(inti,intj,intn)//digui(1,4,4)
{
intt,m;
if(n==2)//①a[0][0]空闲
{
a[i][n]=j;
a[j][n]=i;
a[i][n-1]=i;
a[j][n-1]=j;
}
else
{
digui(i,i+n/2-1,n/2);//digui(1,2,2)//初始化12和34
digui(i+n/2,j,n/2);//digui(3,4,2)2143
for(t=n;t>n/2;t--)//for(t=4;t>2;t--)
{
for(m=i;m<=i-1+n/2;m++)//for(m=1;m<=2;m++)
a[m][t]=a[m+n/2][t-n/2];//从右上角开始遍历a[1][4]=a[3][2]
for(m=i+n/2;m<=i-1+n;m++)//for(m=3;m<=4;m++)
a[m][t]=a[m-n/2][t-n/2];//向右下角遍历a[3][4]=a[1][2],a[4][4]=a[2][2]
}
}//对角相等策略
}
voidfun1()
{
intk,n=1,i,j;
intw,y;
printf("请输入2的幂指数\n");
scanf("%d",&k);
w=clock();
for(i=1;i<=k;i++)
n=n*2;//计算数组的长度n
digui(1,n,n);//当k=1,n=2,digui(1,2,2),执行①12;当n>2,
for(i=1;i<=n;i++)//21
{
printf("\n");
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
}
y=clock();
printf("\n");
b[0]=y-w;
printf("该算法用时%d\n",y-w);
printf("\n");
}
3.2分治策略非递归算法的实现
voidfun2()
{
intn=1,e,m;
inti,j,t,h,k;
intw,y;
printf("请输入2的幂指数\n");
scanf("%d",&k);
w=clock();
for(i=1;i<=k;i++)
n=n*2;//确定数组的边长
for(j=1;j<=n;j++)
a[j][1]=j;//初始化1——n
m=n;
for(n=2;n<=m;n=n*2)
{
e=n/2;//二分策略
for(t=n;t>e;t--)
for(i=1;i{
for(h=i;h<=i-1+e;h++)
a[h][t]=a[h+e][t-e];//如方法①
for(h=i+e;h<=i-1+n;h++)
a[h][t]=a[h-e][t-e];
}
}
for(i=1;i<=m;i++)
{
printf("\n");
for(j=1;j<=m;j++)
printf("%4d",a[i][j]);
}
y=clock();
printf("\n");
b[1]=y-w;
printf("%d\n",y-w);
printf("\n");
}
3.3递推策略算法的实现
voidfun3()
{
intn=2,e=1,i,j,k,k0;
intw,y;
a[1][1]=1;
printf("请输入2的幂指数\n");
scanf("%d",&k);
w=clock();
for(k0=1;k0<=k;k0++)
{
for(i=e+1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=a[i-e][j]+e;
for(j=e+1;j<=n;j++)
for(i=1;i<=e;i++)
a[i][j]=a[i][j-e]+e;
for(j=e+1;j<=n;j++)
for(i=e+1;i<=n;i++)
a[i][j]=a[i][j-e]-e;
e=n;
n=n*2;
}
n=n/2;
for(i=1;i<=n;i++)
{
printf("\n");
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
}
y=clock();
printf("\n");
b[2]=y-w;
printf("%d\n",y-w);
printf("\n");
}
4测试和分析
4.1分治策略递归算法测试
4.2分治策略递归算法时间复杂度的分析
理论上O(lg2n),实际上三个各不一样
4.3分治策略非递归算法测试
4.4分治策略非递归算法时间复杂度的分析
理论上O(lg2n),实际上三个各不一样
4.5递推策略算法测试
4.6递推策略算法时间复杂度的分析
理论上O(lg2n),实际上三个各不一样
4.7三种算法的比较
从时间复杂度和适用的范围等方面对各种算法进行比较和说明。
5总结
经过这次的课程设计,让我受益良多,算法设计这门课程主要教会我们如何优化算法,每个算法的复杂程度都是不相同的,优化了的算法可以让程序变得简单,实用性较强,价值较高。
在这次课程设计中,我遇到了很多以前没遇到的困难,我受益良多。
当然,这不是我第一次做课程设计,所以我的优点在于对于课程设计上手简单。
总的来说,课程设计让我将理论知识运用到了实际中解决问题,我的实力得到了提升。
参考文献
1.使用教材
[1] 吕国英.算法设计与分析.第2版.北京,清华大学出版社,2011.
2.教学参考资源
[1]王晓东.算法设计与分析.北京,清华大学出版社,2009.
[2]徐士良.计算机常用算法(第二版).北京,清华大学出版社出版,2010.
[3]王新.C语言课程设计.北京:
清华大学出版社,2009.
[4]严蔚敏.数据结构与算法.北京:
清华大学出版社,2010.
附录
#include
#include
inta[1000][1000];
intb[2]={0};
voiddigui(inti,intj,intn)
{
intt,m;
if(n==2)
{
a[i][n]=j;
a[j][n]=i;
a[i][n-1]=i;
a[j][n-1]=j;
}
else
{
digui(i,i+n/2-1,n/2);
digui(i+n/2,j,n/2);
for(t=n;t>n/2;t--)
{
for(m=i;m<=i-1+n/2;m++)
a[m][t]=a[m+n/2][t-n/2];
for(m=i+n/2;m<=i-1+n;m++)
a[m][t]=a[m-n/2][t-n/2];
}
}
}
voidfun1()
{
intk,n=1,i,j;
intw,y;
printf("请输入2的幂指数\n");
scanf("%d",&k);
w=clock();
for(i=1;i<=k;i++)
n=n*2;//计算数组的长度n
digui(1,n,n);//当k=1,n=2,digui(1,2,2),执行①12;当n>2,
for(i=1;i<=n;i++)//21
{
printf("\n");
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
}
y=clock();
printf("\n");
b[0]=y-w;
printf("该算法用时%d\n",y-w);
printf("\n");
}
voidfun2()
{
intn=1,e,m;
inti,j,t,h,k;
intw,y;
printf("请输入2的幂指数\n");
scanf("%d",&k);
w=clock();
for(i=1;i<=k;i++)
n=n*2;//确定数组的边长
for(j=1;j<=n;j++)
a[j][1]=j;//初始化1——n
m=n;
for(n=2;n<=m;n=n*2)
{
e=n/2;//二分策略
for(t=n;t>e;t--)
for(i=1;i{
for(h=i;h<=i-1+e;h++)
a[h][t]=a[h+e][t-e];//如方法①
for(h=i+e;h<=i-1+n;h++)
a[h][t]=a[h-e][t-e];
}
}
for(i=1;i<=m;i++)
{
printf("\n");
for(j=1;j<=m;j++)
printf("%4d",a[i][j]);
}
y=clock();
printf("\n");
b[1]=y-w;
printf("%d\n",y-w);
printf("\n");
}
voidfun3()
{
intn=2,e=1,i,j,k,k0;
intw,y;
a[1][1]=1;
printf("请输入2的幂指数\n");
scanf("%d",&k);
w=clock();
for(k0=1;k0<=k;k0++)
{
for(i=e+1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=a[i-e][j]+e;
for(j=e+1;j<=n;j++)
for(i=1;i<=e;i++)
a[i][j]=a[i][j-e]+e;
for(j=e+1;j<=n;j++)
for(i=e+1;i<=n;i++)
a[i][j]=a[i][j-e]-e;
e=n;
n=n*2;
}
n=n/2;
for(i=1;i<=n;i++)
{
printf("\n");
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
}
y=clock();
printf("\n");
b[2]=y-w;
printf("%d\n",y-w);
printf("\n");
}
voidjiemian()
{
printf("*******************************欢迎使用日程表系统*******************************\n");
printf("软工1101李杰\n");
printf("\t\t\t1.二分递归方法\n\n");
printf("\t\t\t2.二分非递归方法\n\n");
printf("\t\t\t3.递推实现方法\n\n");
printf("\t\t\t4.比较三个方法用时\n\n");
printf("\t\t\t0.退出系统\n\n");
}
voidmain()
{
ints;
l1:
jiemian();
scanf("%d",&s);
switch(s)
{
case0:
printf("\t\t退出成功,欢迎下次使用\n");break;
case1:
fun1();gotol1;
case2:
fun2();gotol1;
case3:
fun3();gotol1;
case4:
if(b[0]==0)
{
printf("\t\t第一个算法还未运行,无时间统计\n");
gotol2;
gotol1;
}
else
printf("\t\t第一个算法用时%d\n",b[0]);
l2:
if(b[1]==0)
{
printf("\t\t第二个算法还未运行,无时间统计\n");
gotol3;
gotol1;
}
else
printf("\t\t第二个算法用时%d\n",b[1]);
l3:
if(b[2]==0)
{
printf("\t\t第三个算法还未运行,无时间统计\n");
gotol1;
}
else
printf("\t\t第三个算法用时%d\n",b[2]);
gotol1;
default:
printf("\t\t输入不合法,请重新输入\n");gotol1;
}
}
(要求:
一级标题,黑体,三号,居中;二级标题,黑体,小三号;三级标题,黑体,四号;正文,宋体,小四号,1.25倍行距)
课程设计成绩评定表
成
绩
评
定
项目
比例
得分
平时成绩(百分制记分)
30%
业务考核成绩(百分制记分)
70%
总评成绩(百分制记分)
100%
评定等级
优良中及格不及格
指导教师(签名):
20年月日