2016-10-14 10:29:30 hello_bravo_ 阅读数 2738
                                                                                       数据结构渐进式学习
      数据结构毫无疑问的是在编程上非常重要的一部分内容,在我的学习过程中,我经历了迷茫,入门,熟悉等阶段,我以个人经历为例子,讲解一下我对数据结构从惧怕到熟悉的过程。

      我是一个学习编程主动性很强的人,大二上学期,我知道了数据结构这门课程对于编程的重要性,加上自己自学完了C语言,就开始在网络上查找资料学习数据结构了,一开始光靠自己看,进度真的很慢很慢,一开始很难理解他为什么是一段一段的代码,后来经过查阅资料和看视频才慢慢入了门,但也只是对着书上的代码知道他要干什么,自己去编写是完全做不到的。

      阶段一

      第一阶段自学的时候,我对于数据结构的感觉就是难,现在回头看,发现其实当初的难,只是自己的惧怕和懈怠,最大的原因是自己的不重视,我当时只在英语课上看一看数据结构,没办法做到静心去思考问题,加之自己认为这是我自己给自己的任务,不完成也没有关系,所以经常遇到难得就不愿意花费时间去思考,但是这段经历也给了我警示,现在的我对于自己学习的东西也会上一百分的心去学习,不会在让自己一知半解了。  

       阶段二

      后来报了一个关于教学的培训班,不得不说的是学习上有人讲和没有人讲,效率差别真的很大,而且练习和不练习的差别也很大,自己学习的时候,看到那些代码就不想动手去敲,加上还有课业的负担,后来我一整个寒假待在了补习的地方,也没有课业的负担,就感觉当初深奥难懂的数据结构的代码,概念等等这些东西原来都是这么的简单,加上自己在课下不断地编写数据结构相关的代码,很快的就把这些知识都串联熟悉了起来,能够靠自己写出相应的数据结构了。这一段经历给我最大的感触就是上手练习,真的是很重要很重要的一个环节,哪怕你开始不是很懂,基础不是很牢固,那你可以对着书一行一行的抄代码,在抄代码的过程中,你会熟悉数据结构的框架,毕竟比如链表这些数据结构他们都是有相应固定的结构体结点和操作的,甚至当你完全熟悉了一个的时候,对于别的的理解你也会加快很多,所以可以试着先去弄透链表的所有结构和相应的函数集,然后在学习别的数据结构的时候你就可以把之前理解链表的模式套进去,这样学习会加快你理解的速度,不要对链表都还一知半解的时候就着急的去看栈这些东西,学习要一步一步踏实的走。

      如果说通过自学的阶段我对数据结构有了个大致的概念,那么第二阶段的训练对我而言是对数据结构真正的入门,通过大量的练习和编程,我很快速的熟练了所有数据结构的实现,先不说是否深入理解了什么东西,但是最起码我可以靠着自己去实现自己的数据结构了,而且还可以在原先的基础上根据自己的需求去增改一些东西,面对许多数据结构的题目也可以得心应手的解决,算是真真正正的能用数据结构了,对于学习方面的建议真的就是多练,一定要多练,不管理解不理解,先敲了再说,不要想着偷懒,你敲得代码也不会白费你的努力。

      阶段三

      然后,我觉得对数据结构最后的阶段是理解,虽然我报了培训班,但是那也是加强型的走马观花的练习,深入的概念理解学习还是要靠学校的学习和自己的联系,现在的我正在努力的攻克这一难点,以前的我对于数据结构,如果题目让我去实现一个东西,只要给我时间,那我有自信一定能够做出来,题目要求我用链表,我就用链表,题目要求我用广义表,我就用广义表,我觉得我能够实现它,那就足够了,却从不知道去想一想他为什么让我用链表,我用数组行不行?我之前对于学习有一个不好的心态就是做题为准,后来上学校的数据结构课,这已经算是我第三遍的学习了,我开始不是很在意,后来我发现虽然我已经算是学过两遍的人了,但是老师讲概念这些的时候有的我还不是很熟,也就是说这个东西的特性,比如链表,我可以靠之前的学习说出他的优点和缺点,但是他的优点和缺点决定了他那些应用的范畴,我倒是很少考虑,我觉得上课完了我最大的经历是我思想上的改观,以前的我会以直接实现功能为主的去使用数据结构,现在的我会多去想一想,他为什么要用这个数据结构?我换一个行不行?换一个以后他的那些方面会得到优化,又会丧失那些自己的特性?这样做是否值得?
      数据结构是没有标准答案的,就和老师举得例子一样,一个迷宫问题,走过的路用双向链表可以存储,用栈可以存储,那么哪一个的存储效率更高呢?如果非让你用队列这些结构去存储你又该怎么实现能够使解题的思路最为高效清晰呢?这些都是问题,而且都是我们实际工作后也肯定会问道的问题,这就需要我们对这些数据结构的特性去做更深一步的理解了。

   

   最后对于老师教学方面的个人感悟,我觉得老师在学生完成普通课业的情况下给予相应的额外任务也是能够帮助学生去更加深入理解数据结构的一个有很大益处的举动,因为学生的个人进度是不一样的,有的已经完成了自己的工作,那么还有主动性去学习一些更新的更难得东西的时候,这时候真的需要有人给他们指一个方向,还有就是学生对于自己哪方面不足也是很难去发现了,就比如我对于静态链表的实现在之前学习的时候就不是很上心,就感觉已经有链表了为什么还要用静态链表?后来老师跟我说让我用静态链表做一个约瑟夫环,我才发现,我好像对静态链表掌握的不熟悉,后来是通过看书才实现了相应的工作,通过这样的工作我就发现了自己难以发现的薄弱的环节,也加深了自己对于不同数据结构的理解,我个人感觉自己是获益匪浅的。

        

      
        

        
       
2018-11-19 14:58:05 pythonbanana 阅读数 97

写一下自己平时学习的一些体会。
今天学的是一般的树。首先是数组实现的树,使用它可以很方便地实现树的并查集算法(父指针法)。
数据结构课开始就讲了数组和链表,这是学习其他数据结构的基础,其他类型的数据结构都先有基于数组的实现方法,然后有些不足,就介绍基于链表的实现方法。(因为链表增删复杂度更低)。
数组不够动态,他一般都固定化了。比如一个一般树的节点一般都要预留足够大的空间,但是这会造成极大的浪费(一个节点有100个孩子,那么数组最少要预留100,但是对于只有2,3个孩子的节点就会造成巨大的浪费)。
实现一般树的方法有子节点法,左子节点/右兄弟节点表示法(有基于数组还有基于链表实现的)。
分析:
首先是介绍子节点法,他就是对于每个父节点都用一个链表来存储他的子节点(子节点连成一串)。但是这种方法对于找节点的兄弟节点比较麻烦(一棵树中与某一节点相关联的节点有父节点,兄弟节点还有子节点,如果他能把他所有相关联的关系都能很好表示出来,并且操作的复杂度比较低,而且没有过多浪费,那就是比价好的设计方法)。
子节点方法中每个父节点的子节点链是由子节点相接而成的,他们相接不就可以表示他子节点之间的兄弟关系吗(兄弟节点才回被连在一个链表中)?但是这种表示方法并没有充分利用这种结构所能表示的其他含义,所以浪费,不节约。而且这种设计方法的链表虽然是可变的,但是最好是定义一个通用的(空间固定的)节点。这样才不会浪费,便于设计。
之前那个没利用好,就是因为我们没从递归方法去思考问题。我们一般的思路存储他的所有孩子,其实只要存储他的有孩子就可以了,因为他的其他孩子不就是他左孩子的右兄弟,所以就可以通过(左孩子的右兄弟)一直递归下去,从而找到他所有的孩子。所以就像是一个链表将所有的东西都串起来,他们不是一种直接关系,而是一种间接(递归的关系)。
所以用递归的思想去思考(链式结构)之后,就有左子节点/右兄弟节点表示法。一个节点只要有三个指针(指向父节点,右兄弟,最左的孩子)就可以了,不但空间统一了。而且也得到了充分的利用。
总结:
像很多这种数据结构,定义中间节点时,要定义一种统一的结构。比如一个节点有100个孩子,而有些节点只有2,3个孩子,我如何把这些混乱统一成一种形式?这就要用到递归的思想和链表的结构。一个节点的孩子就是他最左孩子的右兄弟,然后这个节点的右兄弟,知道节点没有右兄弟为止,这就是他所有的孩子。那么他的兄弟的方法不就是和他子节点的存储和遍历方式一样的吗?所以思维要灵活。
还有就是要把结构之间所能表达的一些关系利用到极致,这样才不浪费空间。
正如老师所说的,有时候解决简单的问题用简单的方法,复杂的问题用复杂的方法,复杂到极致时,就回到了简单的方法,这或许就是大道至简。
我觉得这才是数据结构精华,关键是思想,而不是代码。我们在大学不是学了多少知识,而是你学习方法还有思维,这才是最重要的。所以我对面向对象程序设计思想,算法,数据结构,操作系统很感兴趣。
还记得老师说过的一句话,别人都不愿意做的事,就是门槛所在。

2017-12-14 11:26:52 goujingshen 阅读数 5843

       时间转眼即逝,一转眼一学期的数据结构课就已经快要结束了,我对第一节课的时候老师向我们介绍云班课时的场景还历历在目,老师兴致勃勃的介绍着数据结构课的作用,重要性。老师每节课都充满活力让我们每节课都不好意思打盹偷笑。在学习这门课程以前,我觉得编程只要会简单的写代码就好了。然而实际上数据结构才是计算机界的大佬。着计算机应用领域的延伸与扩展,数据结构类的问题占据了现在计算机技术领域的大部分,数据元素之间的关系已经不是普通方程式能够表达的了,已经变得非常复杂,所以数据结构就成为了不可缺少的角色。贺老师用在线视频和线下讲课结合来让我们学习数据结构,教学方式新颖也让我们有了学习的乐趣,   在学期初,我觉得数据结构还是比较简单的,可能是由于之前c 语言学习的还不错,但是对指针掌握的不够熟练,老师给很多设计题,感觉是不小的挑战,导致在数据结构中接触到与指针有关的问题,面对线性表,堆栈,队列,二叉树等问题的时候,都会稍显吃力。但是在不断学习数据结构的过程中不断强化对指针理解,现在我对指针的相关基本知识并且能够熟练运用了。这一学期的学习下来我觉得学好数据结构有以下几点经验{虽然可能我的数据结构学的一般般} 
 1. 初步了解算法思想、原理  整明白抽象结构,想要弄清楚一个算法的实现,首先要大致知道这个算法的原理,这是最简单的一步,也是最基础的一步。
 2. 查找各种算法资料  发现许多不同的算法,其实书上列举的只是数据结构的一小部分,我们通过查阅资料可以发现很多其他不同的排序算法,而且对于一个算法,也有各种不同的实现方法。有了这些知识储备和实践,我们可以提出问题与同学交流或者解答同学的问题,蓝墨云班课的答疑区也就得到了充分利用的
 3.我们还是要注重看懂弄懂会做书上的代码,毕竟那是最基础也是最重要的了解他们的目的,在此基础上深入的了解算法的实现过程,而不是在死记硬背,那样会事倍功半。 
 4. 坚持上机操作,实践出真知 和所有计算机类的学习一样,数据结构是非常需要动手的一门课程,看书看一天也不如把书上的代码打到电脑上实践一遍,发现错误弄懂,那收获必定匪浅的5. 勤于练习,寻找感觉  算法是解决问题的方法,掌握树上的只是以后,要去找一些具有综合性的题目来做一做,这些问题里面包含了各种知识点,例如同时蕴含了排序,堆栈的相关知识,只有在解决这类问题的时候,才能知道如何去灵活准确的运用各种算法,才能检验我们是否扎实了课本上的知识。  
       这学期的数据结构课感觉自己学的还不是很尽力,没有尽力去对待他,但是学到了这种新的学习方式,都是大学生了,应该有自律能力,该学的必须要学,体验了这种全新的上课方式,掌握了学习的主动权,而不是像木头一样坐在桌子上听老师讲,总的来说这学期还是学到了很多东西,希望以后有问题还能向贺老师请教,能得到贺老师的指点,在这里再次感谢贺老的半年的指导。


2010-03-04 20:02:00 ldy19881126 阅读数 1092

    我们老师讲的很好,但是我自己觉得自己并没有下大功夫去好好研究学习,虽然自己觉得这门课很重要,要想达到自己理想的水平还很远,不过既然认识到了自己的不足,就应该好好去学习,多看资料,多思考。

     现在要让我说学习后有什么感想,有什么经验可以拿来说说,我还真不敢说,因为自己学的很粗略,没有自己独特的见解。

     我自己觉得最主要的还是应该养成较好的编程思想,虽然自己说不出来什么大的道理,但是我找到了以后努力的方向,数据结构研究的是非数值运算在计算机内的表示及实现,第一还是得明白怎么表示,第二就是实现了。一开始觉得表示很简单,实现很难,但是经过深入的学习以后发现表示其实也是挺难的,如果不知道数据之间的关系根本无法实现。虽然开始学的比较简单的链表,但对于实现还是不是那么熟练,致使后面越学越难,根本无法自己单独的实现,学习就是从易到难,只要把简单的弄懂弄通了,难的自然也就不难了。其实我个人觉得这门课并不是想象中的那么难,只要自己重视了,没有什么能过难倒自己的!

数据结构Status

阅读数 13145

没有更多推荐了,返回首页