学习数据结构感想

学期即将结束,数据结构实训这节课也落下了帷幕,暮然回首,感想颇多,回想一个学期,有过快乐也有过失落,总的来说获益匪浅,从一开始的什么也不会,到最后虽然也还有很多不会,但总有进步,人不都是从不会到会中慢慢成长的吗?一个学期下来,老师布置了三个任务,虽然不多,但“兵不在多,而在于精”,三个题系统的概括了我们所学的知识,以及以前被我们遗忘的知识点,不仅能够使我们巩固以前的知识,还扩展了我们的知识面,使我们更加广阔的认识了软件世界的美好,但更多的是使我们认识到了自己的不足,我们的编程水还很菜,距离企业对毕业生的要求相差还很大,任重而道远,我们仍需继续努力。
第一个实验主要为了实现在一个面板里输入一行数,然后将它们按顺序排列,并输入一个已有的数,显示它在这行数的位置。应用到的技术主要包括递归与分治的方法,完成以后分别实现数据的排序与查找。用java设计界面,界面编写的很人性化,一个输入框,两个按钮升降序,还有查找等功能,刚接到任务,我束手无策,不知道从哪里开始,通过查找java书,才编写出来界面,然后又不知道怎么做了,不论是字形的强制转换还是函数的调用我都不知道,刚开始我也很失落,也想过得过且过抱着如果老师检查的话看别人的成果,但我发现别人都陆陆续续的编出来时我很不甘,曾几何时我也有过雄心壮志的梦想,随着大学生活的腐蚀,慢慢磨灭,随后我也加入了大军的行列,“路漫漫其修远兮,我将上下而求索”,经过慢慢的尝试,我开始懂了编程的思想,然后就是复杂而反复的修改再修改,那段日子尤其记忆犹新,是我迈出编程的第一步,虽然最后在老师规定的时间内没有完成任务,但是我也很高兴,因为我学到了很多东西,那是我以前不曾知道的,虽然对别人来说是很简单的问题,但是我知道自己的基础很差,这是上学期的Java没有学好带来的副作用。在这个程序中遇到的最大问题是数组的转换,我最后通过室友的程序片段明白了,最后通过百度彻底解决了,而且功能比老师布置的还强大,我很欣慰,我虽然编程差,但我很努力。通过这次试验,感觉Java很实用,尤其是小程序小软件小游戏的界面开发,简单实用,颠覆了以前我对Java的认识,让我对java有了一个全新的认识。
第二个实验主要完成目标是根据用户输入的一组相对应的数据,利用二维数组存储子问题的最优解完成一组数据的最优解计算。并且设计一个简单明了的界面供用户使用。其中运用动态规划来完成程序的设计。最终能够掌握数组的概念和基

本用法,学会用动态规划解决实际问题,熟练掌握利用动态规划解决问题的基本思想,掌握用数组实现数据最优解计算的思想 。一般而言,最优子结构通过如下三个步骤解决问题:
a) 将问题分解成较小的子问题;
b) 通过递归使用这三个步骤求出子问题的最优解;
c) 使用这些最优解构造初始问题的最优解
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题。但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,为此,可以用一个表来记录所有已解决的子问题的答案而不管该答案是否用到,这就是动态规划的基本思想。
动态规划就是把一个大问题分成子问题,范围大的以范围小的为基础计算,最后实现大问题的解决。所以用二维数组存储子问题的最优解并用一个一维数组存储物体的是否转入状态。并设计了用动态思想实现的最优求解和求最优解时装入的物体的方法。用窗口类中的动作事件实现求解,并调用这两个方法来实现相关功能。
本次试验实验出现的最大问题是事件的发生,不能准确的把握,总是不能很好的把几个数与数组引到一个算法中,就是物品个数物品重量和物品价值以及背包容量,这四个未知量,刚开始无法用程序把它们四个量联系到一起,转换总出现错误,我很想放弃,怎么想也想不到好的办法,最终我妥协了,还是百度了,又看了室友的程序,最终才能完成。纵观整个实验过程,
本次试验最大的亮点是用动态规划思想实现这组数据的最有价值计算,他的思想以计算法,而其他的如窗口以及事件都很容易搞定,因为有了上次的基础。这次最大的收获是彻底熟悉了界面的设计和事件的各种处理方法,虽不能完全的掌握,但一般的问题已经没有问题了。
最后一次实验课题主要完成目标是利用最短路径的设计,实现求一个点到其余点的最短路径能够运用数据结构中的弗洛伊德(FLOYD)算法或迪杰斯特拉 (Dijkstra)算法 ,并运用邻接矩阵的查找方法来实现最短路径的求解。
Dijkstra算法思想为:
设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递

增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
算法具体步骤
(1)初始时,S只包含源点,即S=,v的距离为0。U包含除v外的其他顶点,U中顶点u距离为边上的权(若v与u有边)或 )(若u不是v的出边邻接点)。
(2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
(4)重复步骤(2)和(3)直到所有顶点都包含在S中。
以上是实验的具体内容和步骤,这次试验的内容对我来说很难,刚开始时既不知道怎样用程序设计表格也不知道各种图形的程序表示方法,这次试验也是花费时间最长的,但很遗憾我还是没有把所有功能实现完全,但我还会做下去,这次实验是对我们很好的检验,说明上学期java书上的知识我们还没有完全掌握,甚至都不知道,为我们以后的学习敲响了警钟,不能放过书上的任何有用的知识点,那怕是老师没讲过的。至此实验遇到的最大困难是表格的程序设计和图形的程序设计,这都是以前我们不曾知道的知识点,尤其是图形的程序设计,都不知道从何下手。对弗洛伊德(FLOYD)算法或迪杰斯特拉 (Dijkstra)算法能够理解,但真正的让自己去编,还是感觉有点力不从心,后来通过书上的例子,渐渐的知道了表格的设计方法,但图形还是没能够明白,所以到现在还没有编出来,这次试验的最大亮点就是用程序来表示以前学习中常用到的东西,并且应用到解决实际问题当中,提高学生的综合应用能力,我虽然没能够完成实验的所有要求,但至少我知道了以前很多不知道的东西,我,一直在进步,这就是一个收获,而且也明白了自己以后的学习方向。虽然学期结束了,但这几个程序我不会放弃,在以后的日子里我会把它们一一编出来并完善,最终把它们保存下来,作为美好的回忆。
通过这学期的三个实验,尤其是最后一个,让我学到了很多东西,也让我有了一个学习的目标,以前学习java或数据结构没有什么标准,看看书听听课不挂科就行啦,现在不一样啦,明白了要有动手的能力,现在充分的体现到了能动手

能力的重要性。懂得了很多,总结起来就是;
a)、一定要善于利用手中的工具,只有反复练习、使用,才能真正熟悉它的属性和用法;
b)、不要轻易放弃。遇到问题,不要轻易地错过它,也许是否能跨越它,战胜它,就是同学们之间彼此的差别;
c)、要善于在学习中找到知识的节点,善于给知识打包。只有有了点之后,将来才会去连线、织网、疏而不漏的机会;
d)、发现问题与解决问题的无缝连接。
总之,编程是一项很枯燥的事,非毅力坚定者不能胜任,编程永无止境,我相信我会一直走下去,很远、很远,“路漫漫其修远兮,我将上下而求索”。







相关文档
最新文档