算法设计课程设计报告.docx

上传人:b****8 文档编号:30293996 上传时间:2023-08-13 格式:DOCX 页数:23 大小:66.31KB
下载 相关 举报
算法设计课程设计报告.docx_第1页
第1页 / 共23页
算法设计课程设计报告.docx_第2页
第2页 / 共23页
算法设计课程设计报告.docx_第3页
第3页 / 共23页
算法设计课程设计报告.docx_第4页
第4页 / 共23页
算法设计课程设计报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

算法设计课程设计报告.docx

《算法设计课程设计报告.docx》由会员分享,可在线阅读,更多相关《算法设计课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。

算法设计课程设计报告.docx

算法设计课程设计报告

《算法设计与分析》

课程设计报告

 

题目:

循环赛日程表

院(系):

信息科学与工程学院

专业班级:

软工

学生姓名:

学号:

指导教师:

 

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年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1