算法与数据结构.docx

上传人:b****0 文档编号:12833176 上传时间:2023-04-22 格式:DOCX 页数:23 大小:576.61KB
下载 相关 举报
算法与数据结构.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

算法与数据结构

 

数据结构与算法课程设计

 

题目求素数问题、数据删除问题、

方程求解问题、排序重构问题

目录

摘要3

一.求素数问题4

1.采用类语言定义相关的数据类型4

2.算法设计4

3.函数的调用关系图4

4.调试分析4

5.测试结果5

6.源程序(带注释)5

二.数据删除问题6

1.采用类语言定义相关的数据类型6

2.算法设计6

3.函数的调用关系图6

4.调试分析6

5.测试结果6

6.源程序(带注释)6

三.方程求解问题7

1.采用类语言定义相关的数据类型7

2.算法设计7

3.函数的调用关系图7

4.调试分析7

5.测试结果7

6.源程序(带注释)7

四.排序重构问题7

1.采用类语言定义相关的数据类型7

2.算法设计7

3.函数的调用关系图7

4.调试分析7

5.测试结果7

6.源程序(带注释)7

总结8

参考文献9

致谢10

摘要

求素数问题:

素数问题的求解是一种利用埃拉托色尼筛法来查找小于N的素数的求解方法,它能够实现对数据N的输入,判断N是否越界,查找小于N的素数,判断是否继续输入N等操作。

数据删除问题:

删除具有N个数据项的数组A中所有重复项的程序,返回A中仍有的数据项。

运行时间在O(NlogN)

方程求解问题:

方程A5+B5+C5+D5+E5=F5刚好有一个满足0≤A≤B≤C≤D≤E≤F≤

75的整数解。

排序重构问题:

令A为一个由N个已特殊排序数组成的数列:

A1,A2,…,AN,其中A1=0。

令B为N(N-1)/2个数(定义为Dij=Ai-Aj(i>j))组成的数列。

例如,A=0,1,5,8,那么D=1,3,4,5,7,8。

关键词:

素数埃拉托色尼筛法删除元素

方程求解递归算法排序与重构

一.求素数问题

它素数问题的求解是一种利用埃拉托色尼筛法来查找小于N的素数的求解方法,能够实现对数据N的输入,判断N是否越界,查找小于N的素数,判断是否继续输入N等操作。

1.采用类语言定义相关的数据类型

构建线性表

typedefstruct

{

intdata[MaxSize];

intlength;

}SeqList;

SeqListL,Q;

判断素数

SeqListJudgePrimeNumber(SeqListL,SeqListQ,intm)

{

inti,j,l=0,a=0,b=0;

doublen;

2.算法设计

冒泡排序

voidbubble_sort(inta[],intn)//n为数组a的元素个数

{

    inti,j,temp;

    for(j=0;j

        for(i=0;i

        {

            if(a[i]>a[i+1])//数组元素大小按升序排列

            {

                temp=a[i];

                a[i]=a[i+1];

                a[i+1]=temp;

            }

        }

}

3.函数的调用关系图

 

判断2~N之间的整数是否是素数,算法的时间复杂度为O(n^2)

4.调试分析

a、输入的数据错误。

解决办法:

对输入的数据进行筛选和检验

b、算法的时间复杂度为o(n2)

c、算法的空间复杂度为o(n2)

5.测试结果

6.源程序(带注释)

#include

#defineTRUE1

#defineFALSE0

#defineSIZE200

main()

{

intl;/*用于遍历数*/

inti;/*i表示整数和对应的下标*/

intj;/*j表示正要处理的质数j之前的已处理j之后的未处理*/

intk;/*k表示正在处理的j的倍数从2开始到j*k

inta[SIZE];/*下标表示整数内容判断是否为质数*/

int*p;/*控制循环*/

for(l=2;l<=200;l++){

printf("%d",l);

}

printf("\n200以内的素数有:

");

for(p=a;p

*p=TRUE;

}

a[0]=a[1]=FALSE;/*设置前面两个不是质数的数的状态为FALSE*/

i=2;

while(i

while(a[i++]==TRUE){

j=i-1;

break;

}

for(k=2;j*k

a[j*k]=FALSE;

}

}

for(p=a;p

if(*p==TRUE){

printf("%8d",p-a);

}

}

printf("\n");

return0;

二.数据删除问题

编写删除具有N个数据项的数组A中所有重复项的程序,返回A中仍有的数据项。

要求运行时间在O(NlogN)。

1.采用类语言定义相关的数据类型

typedefstructStackNode{//结点结构体

chardata;

structStackNode*next;

}StackNode,*LinkStackPtr;

typedefstructLinkStack{//链栈结构体

LinkStackPtrtop;

intcount;

}LinkStack;

2.算法设计

1.产生随机数组。

2.利用随机数组创建链表。

3.用x数组中的n个数据创建一个单链表,返回表头节点地址。

4.删除重复节点:

递归函数。

5.从输入参数节点出发,删去值相同的多余节点的算法。

3.函数的调用流程图

4.调试分析

1.起初设置的是自己输入一组数组,在进行删除,不过问题是过于繁琐,处理方法是随机出现数组。

2.时间复杂度是0(n);

5.测试结果

6.源程序(带注释)

#include

main()

{

inti,j,t;

inta[10];

printf("请输入10个数:

\n");

for(i=0;i<10;i++)//输入

scanf("%d",&a[i]);

printf("输入的10个数是:

");

for(i=0;i<10;i++)

printf("%d",a[i]);

printf("\n");A

for(i=0;i<10;i++)//排序

{

for(j=i+1;j<10;j++)

{

if(a[i]>a[j])

{

t=a[i];

a[i]=a[j];

a[j]=t;

}

}

}

printf("10个数排序后是:

");

for(i=0;i<10;i++)

{

printf("%d",a[i]);

}

printf("\n");

for(i=0;i<9;i++)//删除重复数字

{

if(a[i]==a[i+1])//如果后一个数等于前一个数,就把后一个数删掉(ps:

这里已经排过序,所以可以这样做来删除重复数字)

{

for(j=i+1;j<9;j++)//这里的删除用的直接覆盖

a[j]=a[j+1];

}

}

printf("删除重复数字后:

");

for(i=0;i<10;i++)

{

if(i>0&&a[i-1]==a[i])//只输出前面不重复的数

break;

printf("%d",a[i]);

}

printf("\n");

}

三.方程求解问题

方程A5+B5+C5+D5+E5=F5刚好有一个满足0≤A≤B≤C≤D≤E≤F≤75的整数解。

请编写一个求出该解的程序。

1.采用类语言定义相关的数据类型

typedefcharVerT;

#defineMaxSize100

#defineMaxVertices10

#defineMaxWeight10000

#defineN7

typedefintDataType;

typedefstruct{

DataTypelist[MaxSize];

intsize;

}SeqList;

2.算法设计

首先建立数组,用来存储整型ABCDEF五次方的值,然后利用fo嵌套循环,一次求ABCDEF五次方的值,接下来用if判断语句,若ABCDE次方之和与F五次方的差为零,输出ABCDEF的整数解。

运用递归算法,其中时间复杂度为n的6次方

3.函数的调用关系图

函数关系调用图

 

赋予A值

 

赋予B值

赋予C值

赋予D值

 

赋予E值

计算条件判断

赋予F值

计算结果

 

4.调试分析

运行程序,是否可以输出ABCDEF的整数解。

需注意的是在嵌套循环的时候必须嵌套在相应的位置,以免出错。

时间复杂度为O(76^6).

5.测试结果

6.源程序(带注释)

include

#include

intkey()

//求方程的解找到解返回否则返回

{

longp[76];

longA,B,C,D,E,F,i,flag=0;

for(i=1;i<=75;i++)

p[i]=pow(i,5);

//把—的次方放在数组中,以便调用

for(A=1;A<=60;A++)

//循环穷举找到方程的解

for(B=A;B<=75;B++)

for(C=B;C<=75;C++)

for(D=C;D<=75;D++)

for(E=D;E<=75;E++)

for(F=E;F<=75;F++)

if(p[A]+p[B]+p[C]+p[D]+p[E]-p[F]==0)

{

printf("\t\t\t%d%d%d%d%d%d\n\n",A,B,C,D,E,F);

flag=1;

}

if(flag==1)

return1;

else

return0;

}

intmain()

{

if(key()==0)

printf("方程A^5+B^5+C^5+D^5+E^5=F^5(0<=A<=B

return1;

}

四.排序重构问题

令A为一个由N个已特殊排序数组成的数列:

A1,A2,…,AN,其中A1=0。

令B为N(N-1)/2个数(定义为Dij=Ai-Aj(i>j))组成的数列。

例如,A=0,1,5,8,那么D=1,3,4,5,7,8。

请完成:

编写程序,根据A构造D;

编写程序,构造与D相对应的某一个数列A,注意A不是唯一的。

1.采用类语言定义相关的数据类型

#ifndefADJACENCYMATRIXED//防止该头文件被重复引用

#defineADJACENCYMATRIXED//而引起的数据重复定义

#defineINFINITY32767//最大值∞

#defineMAX_VERTEX_NUM20//最大顶点个数

typedefintVRType;//权值,即边的值

typedefcharInfoType;//附加信息的类型,后面使用时会定义成一个指针

typedefcharVertexType[MAX_VERTEX_NUM];//顶点类型

typedefenum{DG=1,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向图,无向网}

typedefstructArcCell

{

VRTypeadj;//VRType是顶点关系类型。

对无权图,用1或0表示相邻否;对带权图,则为权值类型。

InfoType*info;//该弧关系信息的指针

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedefstruct

{

VertexTypevexs[MAX_VERTEX_NUM];//顶点向量

AdjMatrixarcs;//邻接矩阵

intvexnum,arcnum;//图的当前顶点数和弧数

GraphKindkind;//图的种类标志

}MGraph;

typedefstruct//普里姆算法辅助数组的定义

{

VertexTypeadjvex;

VRTypelowcost;

}closedge[MAX_VERTEX_NUM];

#endif//结束if

2.算法设计

首先用题目给的顺序序列按照题目给的规律生成序列D,然后根据D生成A,经过分析我们发现后来生成的A里面的元素一定是D里面的元素,即A为D的子集,这样得到算法:

从D里面找到和A的个数一样的元素,然后按照题目给的那个算法生成D1,当D1和D完全相等的时候,我们找到的那几个元素就是A的一个组合。

3.函数的调用关系图

4.调试分析

a.调试中遇到的问题及对问题的解决方法

第一次排序的时候忘了让对应的下标对应起来,结果导致排序结果失误。

解决方法,检查到之后更正回来。

b.算法的时间复杂度和空间复杂度

由于采用了三重循环进行组合计算,所以时间复杂度为O(n^3)

5.测试结果

6.源程序(带注释)

#include

#include

#include

#include

#defineMAX100

typedefstruct

{

intdata[MAX];

intflag[MAX];

intsize;

}array;

int

CREAT_NEW_A()

{

FILE*fp;

arrayb,a;//b原始数据存储.a,构造的用于判断的结构体

inti,j,z;

charch[MAX];

strcpy(ch,"数组c.c");

if((fp=fopen("数组B.c","rb"))==NULL)

{

printf("文件打开失败!

\n");

exit(0);

}

while(!

feof(fp))

{

fread(&b,1,sizeof(array),fp);

}

fclose(fp);

a.data[0]=0;

printf("数组:

\n");

for(i=0;i

for(j=i+1;j

for(z=j+1;z

{

a.data[1]=b.data[i];

a.data[2]=b.data[j];

a.data[3]=b.data[z];

a.size=4;

COMPARE(&a,ch);

}

printf("满足条件\n");

return0;

}intmax;

int

COMPARE(array*a,charch[MAX])

{

FILE*fp;

arrayd;

arrayb;

inti,j,k=0,n,x,y,z;

if((fp=fopen(ch,"wb"))==NULL)

{

printf("文件打开失败!

\n");

exit(0);

}

for(i=0;isize;i++)

{

x=a->data[i];

for(j=i+1;jsize;j++)

{

y=a->data[j];

b.data[k]=y-x;

k++;

}

}

b.size=k;

sort(&b);

fwrite(&b,1,sizeof(array),fp);

fclose(fp);

if((fp=fopen("数组B.c","rb"))==NULL)

{

printf("文件打开失败!

\n");

exit(0);

}

while(!

feof(fp))

{

fread(&d,1,sizeof(array),fp);

}

fclose(fp);

for(i=0;i

{

if(b.data[i]!

=d.data[i])

break;

}

if(i==d.size)

{

for(i=0;isize;i++)

printf("%d",a->data[i]);

printf("\n");

}

return0;}

总结

在为期一周的算法与程序设计的课设中学到了好多的知识。

起初我对四个问题无从下手,但通过在图书馆和网上查阅资料,和与老师的交流后豁然开朗有了一定的了解。

便开始着手进行程序设计,在设计的途中遇到了很多问题,有些自己能够看出问题所在并改正过来,有些则是问老师或者问同学才逐渐改过来,在整个课设过程中我对算法与程序设计这门课程有了更加深刻的理解和认识,在以前的时候,学习最多的是算法的概念,而对算法的编码了解很少,通过这一次课程设计,对编码方面也有了较深刻的理解。

在这一周中,我们合理的分配了任务,并经过我们共同的努力才把这一课题基本完成了。

通过此次课程设计我们更加理解了这方面的内容。

这次的课程设计不仅考查了我们理论知识,更主要的是考查了我们动手实践的能力,考查了我们用C,数据结构编程的能力。

从这次的课程设计中,我看到了自己的不足,首先就是比较轻浮,不能够踏踏实实的,其次,就是我个人的动手操作能力,即上机编程能力还是十分欠缺的,这还是我们平时锻炼的少所造成的。

所以在以后的学习中我们要加强这方面的锻炼,为我们走上社会打下坚实的基础。

所以此次的课程设计对我来说意义重大。

参考文献

[1]梁路宏,艾海舟,何克忠.基于多模板匹配的单人脸检测[J].中国图象图形学报,1999,4A(10):

823-830.

[2]胡珊珊.基于遗传算法的人脸检测研究[M].青岛:

青岛大学出版社,2006)

致谢

此次的课程设计,我们又学到了很多知识。

因此我们首先要感谢老师,是他们为我们提供了实践的机会,我们才有这样一个学习知识的机会。

其次,这次课程设计的过程中,我查阅了大量的书籍资料,并且我自己的技术和能力有了很大的提高。

设计工作还是比较顺利,但也遇到了不少问题,在同学和老师那儿得到一些有益的帮助,更重要的是指导老师也不辞辛苦,总能及时的对我进行指导,正是由于他们的无私的帮助和指导,我才能比较顺利的完成这次毕业设计任务。

在此,我表示由衷地感谢!

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

当前位置:首页 > 农林牧渔 > 农学

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

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