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;ifor(j=i+1;jfor(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)
致谢
此次的课程设计,我们又学到了很多知识。
因此我们首先要感谢老师,是他们为我们提供了实践的机会,我们才有这样一个学习知识的机会。
其次,这次课程设计的过程中,我查阅了大量的书籍资料,并且我自己的技术和能力有了很大的提高。
设计工作还是比较顺利,但也遇到了不少问题,在同学和老师那儿得到一些有益的帮助,更重要的是指导老师也不辞辛苦,总能及时的对我进行指导,正是由于他们的无私的帮助和指导,我才能比较顺利的完成这次毕业设计任务。
在此,我表示由衷地感谢!