算法设计课程设计报告.docx
- 文档编号:30293996
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:23
- 大小:66.31KB
算法设计课程设计报告.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年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)