数据结构课程设计报告-模板.docx
《数据结构课程设计报告-模板.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告-模板.docx(25页珍藏版)》请在课桌文档上搜索。
1、电3科技比W信息与软件工程学院课程设计报告课程名称:数据结构课程设计学院专业:信息与软件学院XX专业学生姓名:赵大钱二孙三李四周五吴六学号:20112210XXXXX2011221011XXX20112210XX11X20112210XXXXX20112210XX11X20112210XXXXX指导教师:周益民日期:2012年06月08日目录第一章绪论11.1. 数据结构课程设计概要11.2. 训练要求11.3. 课程设计的根本内容2第二章约瑟夫生死者游戏32.1. 游戏描述32.2. 需求分析32.3. 概要设计42.3.1. 循环链表42.3.2. 顺序表42.4. 详细设计42.4.1.
2、 循环链表解决方案42.4.2. 顺序表解决方案62.5. 低复杂度求解进阶方案72.6. 测试分析82.7. 小结10第三章哈夫曼压缩编码H3.1. 哈夫曼树和哈夫曼编码113.1.1. 哈夫曼树113.1.2. 哈夫曼编码113.2. 需求分析123.3. 概要设计133.4. 详细设计153.5. 测试分析213.6. 小结22第四章报告总结23第五章参考文献25第一章绪论计算机科学与技术专业强调四个方面的专业能力:计算思维能力、算法设计与分析能力、程序设计与实现能力和计算机系统的认知、分析、设计和运用能力。1.1. 数据结构课程设计概要数据结构课程设计是数据结构课程的深入与实践,是计算
3、机科学与技术学科的核心课程。通过数据结构课程设计的学习.目的在于使学生:1、使学生进一步理解和掌握课堂上所学各种根本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。2、使学生掌握软件设计的根本内容和设计方法,并培养学生进行标准化软件设计的能力。3、使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的根本能力。4.使学生学会自主学习,也学会以团队的形式思考问题,解决问题,培养学生的团队合作能力。5.使学生在团队工作中培养良好的人际交流的能力,以及沟通能力随着计算机的普遍应用与日益开展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设
4、计以及设计最短路线等复杂的非数值处理和操作。算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术根底。算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法到达最优。数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。
5、数据结构主要介绍一些最常用的数据结构,说明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要根底,广泛的应用于信息学、系统工程等各种领域。学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。1.2. 训练要求数据结构课程设计独立于具体的数据结构教科书,重点放在数据的存储及在存储结构
6、上实现的相关典型算法上。以较多的应用实例来涵盖数据结构这门课程所要求的各类重要根底知识。结合实际应用的要求,使课程设计既覆盖教学所要求的知识点,又接近工程的实际需要。训练了实际分析问题、解决问题及编程能力的整体提高。通过详细的实例分析、循序渐进的描述,启发同学们顺利完成设计。课程设计将设计要求、需求分析、算法设计、编程和测试运行分开,为同学们创造分析问题、独立思考的条件。在充分理解要求和算法的前提下,完全可以不按教材中提供的参考程序,设计出具有特色的应用程序。课程设计的内容根本上按照课程教学的顺序设计,可以让学生循序渐进地学习,以加深同学们对数据结构知识的理解。课程设计的最后提出了几个比拟大的
7、综合课程设计题目,以进一步锻炼同学们的动手能力。1.3. 课程设计的根本内容主要内容包含有:1 .链表的应用:约瑟夫生死者游戏。2 .树结构的应用:赫夫曼编码的应用。学生必须仔细阅读数据结构课程设计方案,认真主动完成课设的要求。有问题及时主动通过各种方式与教师联系沟通。学生要发挥自主学习的能力,充分利用时间,安排好课设的时间方案,并在课设过程中不断检测自己的方案完成情况,及时向教师汇报。课程设计按照教学要求需要16课时的时间完成,上机调试程序时间总共不少于16小时。第二章约瑟夫生死者游戏在这一次的课程中,将利用线性链表,特别是循环链表来实现约瑟夫生死问题。2.1. 游戏描述【其一】据说著名犹太
8、历史学家JoSePhUS有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与JoSePhUS及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而JOSePhUS和他的朋友并不想遵从,JOSePhUS要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。【其二】17世纪的法国数学家加斯帕在数目的游戏问题中讲了这样一个故事:15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免
9、于难,于是想了一个方法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。【其三】N个人,编号0.N-1,从0开始报效,报到M-I的退出,通常取Mnext;while(q-next!=p)(q=q-next;while(P!=p-next)(for(inti=l;knext;q-next=p-next;free(p);p=q-next;returnp-number;J采用线性链表来解决约瑟夫问题必然使用到N个节点,节点中既要存储数据信息也需要存储位置信息(即循环链表的指针)。存储空间使用较多,
10、为O(N)O构造线性循环链表Jonse*Create(intn)(Jonse*hz*p;inti;h=(Jonse*)malloc(sizeof(Jonse);=h;for(i=l;icode=i;if(inext=(Jonse*)malloc(sizeof(Jonse);p=p-next;)-next=h;returnh;榆出遍历链表voidShowList(Jonse*h)(JonSe*p;=h;do(printfzp-code);p=p-next;while(!=h);执行算法voidOut(Jonse*hzintizintdzintnum,intflag)Jonse*pz*q;intk
11、;p=h;for(q=hq-next!=h;q=q-next);for(k=l;knext;)while(p!=p-next)(for(k=l;knext;)printf(%dt,p-code);q-next=p-next;free(p);p=NULL;p=q-next;flag+;if(num-flag=2)break;)printf(%dnrp-code);free(P);p=NULL;J2.4.2. ,顺序表解决方案intJonesArray(intN,intM)int*jones;intwinner;jones=newint(N);intizjzt;for(i=0;i=l;i-)t=(
12、t+M-l)%i;coutjonest;for(j=t+l;j=i-l;j+)jonesj-l=jonesj;)winner=jones0;coutwinneriswinnerl奎茎封祥亮线曳汨N-1个人报数的子问题,假设我们知道这个子问题的解:例如X是最终的胜利者,那么根据上面这个表把这个X变回去不刚好就是N个人情况的解吗?变回去的公式很简单,相信大家都可以推出来:x=(x+2)modN如何知道N-I个人报数的问题的解?对,只要知道N-2个人的解就行了。N-2个人的解呢?当然是先求N-3的情况这显然就是一个倒推问题!好了,思路出来了,下面写递推公式:令/表示i个人玩游戏报M退出最后胜利者的编
13、号,最后的结果自然是/()fn。递推公式/(D=O=(+M)modzl有了这个公式,我们要做的就是从1.N-1顺序算出/的数值,最后结果是/(N)。因为实际生活中编号总是从1开始,我们输出f(N)+l0由于是逐级递推,不需要保存每个了,程序也是异常简单。intJonesWinner(intN,intM)(intwinner=O;for(inti=2;i=N;i+)winner=(winner+M)%i;winner+=l;coutwinneriswinner winner is 334数学方法耗时:3 msplease input the N:10000Please input the M:5
14、00JonesArrayO v/inner is 368飒序表方案耗时:108 msJonesListO winner is 368链表方法耗时:87msJonesWinnerO winner is 368留学方法耗时:1msPlease input the N:10000Please input the M:9999JonesArrayO winner is 3377顺序表方莱耗时:II6 msJonesListO winner is 3377链表方法耗时:998 nsJonesWinnerO winner is 3377数学方法耗时:3 ms上面只是进行了简单的测试,从上面的测试我们可以看
15、出至少这三种方案都正确的进行了模拟,得出了我们想要的结果。关于效率问题,前面有提到过顺序表和链表的实现的时间复杂度都是O(MM,但是在实际的程序运行还是存在差异。顺序表每次淘汰一个数后还需要消耗时间将后续的数向前搬移1个单元;链表每次淘汰一个节点后需要消耗时间释放该节点的内存空间。数学的模拟方法确实就比拟高而稳定了,时间复杂度为O(N)o其实本人还进行了很多的测试,想要总结一下它们之间的效率比照问题。但是最后发现测试结果不规律,主要是链表方法的结果不规律。由于未能分析得出非常确切的答案,所以下面只进行大致的描述,提出猜测,待以后进行验证。顺序表实现和数学实现还是比拟规律的,比拟可以分析理解。关
16、于链表实现不规律的问题,我直接举一个例子就能看到了,如右图。都是N=IoOO0,M=I的结果是M=2的结果的9倍左右,差距非常的大。再进行其他的一些测试,测试结果也是存在波动的。下面是本人关于这个问题的一些猜测。当M=I时,链表的处理比拟特殊,链表不会往后移动,会直接淘汰当前的节点,释放free单元。从理论上来说,不管M为何值,最终N个节点都会释放的,也就是要free()N次,一般我们认为这N次释放的时间花销应该是一样的,那么当M=I时,时间花销应该是最小的,因为它节约了向后移动的时间花销。但是我们实际结果,不仅不是最小的,反而效率非常低下,当M=2时,每次向后移动一个节点,效率马上又不那么低
17、下了。从此,我们可以推断:释放内存操作不能够连续高效地进行,操作之间存在一些间隔反而能更加高效。这里面就应该设计到内存池的实现机制的问题了。在此,我们可以猜测:链表实现方法的效率的不规律受内存池的机制内存分配与释放等影响较大。比方:free。之后内存可能不会立即归还系统,下次malloc时也许会重用,那么这个时间间隙是多久呢?在时间间隙中有要释放内存单元呢?该问题需进一步研究后得出结论,在此就简单描述了。2.7. 小结通过上面的实验,验证了用3种方法实现约瑟夫的模拟。另外,有趣的是在分析实验数据的时候发现了链表实现的不规律问题,猜测原因是与内存池机制有关,留待后续处理。通过遇到的问题,真正让我
18、感受到,很多时候实践确实是很有价值的,能发现问题,也只有通过实践后才能去肯定我们的理论技术。当我们只有真正去动手做时,就会发现该游戏程序中很多问题,在发现问题的过程中,也伴随着大家培养解决问题的能力,促进这个团队的工作力与协作性,在诸多问题的一个个解决过程中,每一位队员都学习了良好的经验与纠错能力。总之,一句话,我们正在成长。第三章哈夫曼压缩编码3.1. 哈夫曼树和哈夫曼编码3.1.1. 哈夫曼树哈夫曼树。给定n个权值作为n个叶子结点,构造一棵二叉树,假设带权路径长度到达最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(HUffmantree)。哈夫曼树相关的根本术语:(1)路径和路径长度在一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 模板
链接地址:https://www.desk33.com/p-1093114.html