数据结构心得体会
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构心得体会
【篇一:数据结构学习总结】
数据结构学习总结
通过一学期对《数据结构与算法》的学习,大概的了解了基本的数
据结构和相应的一些算法。
下面总结一下自己一个学期学习的收获
和心得。
数据结构是什么:
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间
存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选
择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同
高效的检索算法和索引技术有关。
数据结构重要性:
一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。
对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须
在计算机内存储,数据的存储结构是数据结构的实现形式,是其在
计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据
上执行的运算才有意义。
一个逻辑数据结构可以有多种存储结构,
且各种存储结构影响数据处理的效率。
在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。
许多大型系统的构造
经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于
是否选择了最优的数据结构。
许多时候,确定了数据结构后,算法
就容易得到了。
有些时候事情也会反过来,我们根据特定算法来选
择数据结构与之适应。
不论哪种情况,选择合适的数据结构都是非
常重要的。
选择了数据结构,算法也随之确定,是数据而不是算法
是系统构造的关键因素。
这种洞见导致了许多种软件设计方法和程
序设计语言的出现,面向对象的程序设计语言就是其中之一。
常见的数据结构:
1. 顺序表:
定义:顺序表是在计算机内存中以数组的形式保存的线性表,是指用
一组地址连续的存储单元依次存储数据元素的线性结构。
线性表采
用顺序存储的方式存储就称之为顺序表。
顺序表是将表中的结点依
次存放在计算机内存中一组地址连续的存储单元中。
基本运算:
置表空:sqlsetnull(l)判表满:sqlempty(l)
求表长:sqllength(l)插入:sqlinsert(l,i,x)按序号取元素:sqlget(l,i)删除:sqldelete(l,i)
按值查找:sqllocate(l,x)
2. 链表
定义:链表是一种物理存储单元上非连续、非顺序的存储结构,数
据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表由一
系列结点(链表中每一个元素称为结点)组成,结点可以在运行时
动态生成。
每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
相比于线性表顺序结构,
链表比较方便插入和删除操作。
分类:单链表—用一组地址任意的
存储单元存放线性表中的数据元素。
循环链表—循环链表是另一种形式的链式存贮结构。
它的特点是表
中最后一个结点的指针域指向头结点,整个链表形成一个环。
基本运算:建立链表,插入节点,删除节点。
3. 堆栈
定义:堆栈都是一种数据项按序排列的数据结构,只能在一端(称为
栈顶(top))对数据项进行插入和删除。
要点:堆:顺序随意栈:后进
先出(last-in/first-out)。
基本算法:
置空栈:initstack(s)判栈空:stackempty(s)
判栈满:stackfull(s)取栈顶元素:gettop(s)
入栈:push(s)出栈:pop(s)
4. 队列
定义:队列是一种特殊的线性表,它只允许在表的前端(front)进
行删除操作,而在表的后端(rear)进行插入操作。
进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列中没有元素时,称
为空队列。
在队列这种数据结构中,最先插入的元素将是最先被删
除的元素;反之最后插入的元素将最后被删除的元素,因此队列又
称为“先进先出”(fifo—first in first out)的线性表。
分类:顺序队列;链队;
基本运算:初始化队列 qini (q)入队 qadd(q,x)
出队 qdel(q,x)判断队列是否为qempty(q)
判断队列是否为满qfull(q)
5. 特殊矩阵
分类:对阵矩阵;三角矩阵;稀疏矩阵;
6. 二叉树
定义:二叉树是每个节点最多有两个子树的有序树。
通常子树被称
作“左子树”(left subtree)和“右子树”(right subtree)。
二叉树
的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子
树有左右之分,次序不能颠倒。
二叉树的第i层至多有2的 i -1次方
个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二
叉树t,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为
n2,则n0 = n2 + 1。
(1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第 h 层有叶子节点,并且叶子
节点都是从左到右依次排布,这就是完全二叉树。
(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶结点都
处在最底层的二叉树,。
(3)深度——二叉树的层数,就是高度。
性质:
(1) 在二叉树中,第i层的结点总数不超过2^(i-1);
(2) 深度为h的二叉树最多有2^h-1个结点(h=1),最少有h个结点;
(3) 对于任意一棵二叉树,如果其叶结点数为n0,而度数为2的结
点总数为n2,则n0=n2+1;
(4) 具有n个结点的完全二叉树的深度为int(log2n)+1
(5)有n个结点的完全二叉树各结点如果用顺序方式存储,则结点之
间有如下关系:若i为结点编号则如果i1,则其父结点的编号为i/2;如果2*i=n,则其左儿子(即左子树的根结点)的编号为2*i;若
2*in,则无左
儿子;如果2*i+1=n,则其右儿子的结点编号为2*i+1;若2*i+1n,
则无右儿子。
(6)给定n个节点,能构成h(n)种不同的二叉树。
h(n)为卡特兰数的
第n项。
h(n)=c(n,2*n)/(n+1)。
(7)设有i个枝点,i为所有枝点的道路长度总和,j为叶的道路长
度总和j=i+2i。
二叉树遍历:
遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的
规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,
而且只被访问一次。
由于二叉树是非线性结构,因此,树的遍历实
质上是将二叉树的各个结点转换成为一个线性序列来表示。
设l、d、r分别表示遍历左子树、访问根结点和遍历右子树,则对
一棵二叉树的遍历有三种情况:dlr(称为先根次序遍历),ldr(称
为中根次序遍历),lrd (称为后根次序遍历)。
(1)前序遍历访问根;按前序遍历左子树;按前序遍历右子树
(2)中序遍历按中序遍历左子树;访问根;按中序遍历右子树
(3)后序遍历按后序遍历左子树;按后序遍历右子树;访问根
(4)层次遍历即按照层次访问,通常用队列来做。
访问根,访问
子女,再访问子女的子女(越往后的层次越低)(两个子女的级别
相同)。
7. 散列
定义:若结构中存在和关键字k相等的记录,则必定在f(k)的存储
位置上。
由此,不需比较便可直接取得所查记录。
称这个对应关系f
为散列函数(hash function),按这个思想建立的表为散列表。
散列函数:直接定址法;除留余数法;数字分析法;平方取中法;
折叠法。
冲突处理方法:开放地址法(线性探测再散列,二次探测
再散列,伪随机探测再散列)链地址法。
8. 图
定义:一种较线性表和树更为复杂的数据结构。
存储结构:邻接矩阵;邻接表;逆邻接表;十字链表;邻接多重表。
图的遍历:
深度优先遍历:深度优先遍历的思想类似于树的先序遍历。
其遍历
过程可以描述为:从图中某个顶点v出发,访问该顶点,然后依次
从v的未被访问的邻接点出发继续深度优先遍历图中的其余顶点,
直至图中所有与v有路径相通的顶点都被访问完为止。
广度优先遍历:对图的广度优先遍历方法描述为:从图中某个顶点
v出发,在访问该顶点v之后,依次访问v的所有未被访问过的邻接点,然后再访问每个邻接点的邻接点,且访问顺序应保持先被访问
的顶点其邻接点也优先被访问,直到图中的所有顶点都被访问为止。
下面是对一个无向图进行广度优先遍历的过程。
查找算法
1. 顺序查找:在一个已知无(或有序)序队列中找出与给定关键字相
同的数的具体位置。
原理是让关键字与队列中的数从第一个开始逐
个比较,直到找出与给定关键字相同的数为止。
2. 折半查找:首先,假设表中元素是按升序排列,将表中间位置记
录的关键字与查找关键字比较,如果两者相等,则查找成功;否则
利用中间位
置记录将表分成前、后两个子表,如果中间位置记录的关键字大于
查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子
表不存在为止,此时查找不成功。
3. 分块查找:先选取各块中的最大关键字构成一个索引表;查找分
两个部
分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一
块中;然后,在已确定的块中用顺序法进行查找。
4. 二叉排序树:
定义:二叉排序树(binary sort tree)又称二叉查找树。
它或者是
一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则
左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树
也分别为二叉排序树;
查找:若根结点的关键字值等于查找的关键字,成功。
否则,若小
于根结点的关键字值,递归查左子树。
若大于根结点的关键字值,
递归查右子树。
若子树为空,查找不成功。
排序算法:
1. 直接插入排序:插入排序的基本操作就是将一个数据插入到已经
排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算
法适用于少量数据的排序,时间复杂度为o(n^2)。
是稳定的排序方法。
插入算法把要排序的数组分成两部分:第一部分包含了这个数
组的所有元素,但将最后一个元素除外,而第二部分就只包含这一
个元素。
在第一部分排序后,再把这个最后元素插入到此刻已是有
序的第一部分里的位置。
2. 希尔排序:先取一个小于n的整数d1作为第一个增量,把文件
的全部记录分成d1个组。
所有距离为d1的倍数的记录放在同一个
组中。
先在各组内进行直接插入排序;然后,取第二个增量d2d1重
复上述的分组和排序,直至所取的增量dt=1(dtdt-l?d2d1),即所有
记录放在同一组中进行直接插入排序为止。
3. 冒泡排序:依次比较相邻的两个数,将小数放在前面,大数放在
后面。
即在第一趟:首先比较第1个和第2个数,将小数放前,大
数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,
如此继续,直至比较最后两个数,将小数放前,大数放后。
至此第
一趟结束,将最大的数放到了最后。
在第二趟:仍从第一对数开始
比较(因为可能由于第2个数和第3个数的交换,使得第1个数不
再小于第2个数),将小数放前,大数放后,一直比较到倒数第二
个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第
二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
如此下去,重复以上过程,直至最终完成排序。
4. 快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的
所有数据都比另外一部分的所有数据都要小,然后再按此方法对
这两部分数据分别进行快速排序,整个排序过程可以递归进行,以
此达到整个数据变成有序序列。
5. 直接选择排序:第一次从r[0]~r[n-1]中选取最小值,与r[0]交换,第二次从r{1}~r[n-1]中选取最小值,与r[1]交换,....第i次从r[i-
1]~r[n-1]中选取最小值,与r[i-1]交换.....第n-1次从r[n-2]~r[n-1]中
选取最小值,与r[n-2]交换,总共通过n-1次,得到一个按排序码从小
到大排列的有序序列。
6. 归并排序:申请空间,使其大小为两个已经排序序列之和,该空
间用来存放合并后的序列;设定两个指针,最初位置分别为两个已
经排序序列的起始位置;比较两个指针所指向的元素,选择相对小
的元素放入到合并空间,并移动指针到下一位置;重复直到某一指
针达到序列尾;另一序列剩下的所有元素直接复制到合并序列尾。
心得:无论我们学习什么课程,概念永远是基础,所有的知识都是
建立在基础概念之上的。
我们要将概念熟记于心,然后构建知识框架。
数据结构包括线性结构、树形结构、图状结构或网状结构。
线
性结构包括线性表、栈、队列、串、数组、广义表等,栈和队列是
操作受限的线性表,串的数据对象约束为字符集,数组和广义表是
对线性表的扩展:表中的数据元素本身也是一个数据结构。
除了线
性表以外,栈是重点,因为栈和递归紧密相连,递归是程序设计中
很重要的一种工具。
树状结构中的重点自然是二叉树和哈弗曼树了。
对于二叉树的很多操作都是基于对二叉树的遍历,掌握了如何遍历,很多问题也就迎刃而解了,比如对二叉树结点的查找访问、统计二
叉树中叶子结点的数目、求二叉树的深度等。
哈弗曼编码也有着很
广泛的应用。
对于图状结构,主要学习图的存储结构及图的遍历。
对算法的学习是学习数据结构的关键。
要注重对算法的掌握。
对于
一个算法,如果我们不是很理解的话,可以手动将算法走一遍,慢
慢理解该算法的思想。
学习这门课程的最终目的,还是要学会如何
设计算法,这需要我们长期的练习和思考。
【篇二:数据结构学习心得】
课程学习总结
各元素之间没有直接的关系,散列和冲突处理是散列法中最重要的
两个概念。
散列通过某种函数确定节点关键字与节点存储地址之间
的关系。
常用的散列函数有直接定址法、除留余数法、数字分析法、平方取中法和折叠法等。
由于散列法的自身特点,冲突的发生是不
可避免的。
第十章介绍了图的概念及其应用,是教材的难点。
图的存储结构的
知识点有:邻接矩阵、邻接表、逆邻接表、十字链表和邻接多重表。
图的遍历包括图的深度优先搜索遍历和广度优先搜索遍历。
其余知
识点有:有向图、连通图、生成树和森林、最短路径问题和有向无
环图及其应用。
有向无环图重点理解aov网和拓扑排序及其算法。
第十一章:略
二、学习体会
三、教学建议
1、希望平时阶段考核的题目能够按照考研的标准来出,让我们适应考研的试卷。
2、希望老师在讲完每章后,能增加一些随堂小练习,加深我们对每一章的理解。
3、希望老师到下课的时候能准时下课,听这门课真得很费脑力,给我们一点休息的时间。
以上是我对《数据结构与算法》这门课程所作的课程总结。
虽然这
门课程结束了,但是,我还有很多内容没有掌握牢固,我会继续努
力的。
【篇三:数据结构课程设计心得体会】
数据结构课程设计心得体会
经过一个星期的课程设计,过程曲折可谓一语难尽。
整天都是对着
电脑,不然就是翻阅资料。
在此期间我失落过,也曾一度热情高涨。
点点滴滴令我回味无长。
这次课程设计使我体会到只有做到细心耐心,恒心才能做好事情。
这次的课程设计,加强了我们动手、思考和解决问题的能力。
巩固
和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。
培养了我选用参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
通过实际编译系统的分析
设计、编程调试,掌握应用软件的分析方法和工程设计方法。
通过
课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。
而且做课程设计同时也是对课本知识的
巩固和加强,平时看课本时,有些问题就不是很能理解,做完课程
设计,那些问题就迎刃而解了。
而且还可以记住很多东西。
认识来
源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一
标准。
所以这个期末测试之后的课程设计对我们的作用是非常大的。
这次的课程设计使我懂得了理论与实际相结合是很非常重要的,只
有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实
际动手能力和独立思考的能力。
在整个设计过程中,构思是很花费
时间的。
调试时经常会遇到这样那样的错误,有的是因为粗心造成
的语法错误。
当然,很多也时用错了方法,总是实现不了。
同时在
设计的过程中发现了自己的不足之处,对以前所学过的知识理解得
不够深刻,掌握得不够牢固。
根据我在课程设计中遇到得问题,我将在以后的学习过程中注意以
下几点:
1、认真上好专业实验课,多在实践中锻炼自己。
2、写程序的过程中要考虑周到,严密。
3、在做设计的时候要有信心,有耐心,切勿浮躁。
4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运
用。
5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错
误,以便能节省调试程序的时间。
每个实验通常都要花费很久的时间才能理清一个程序的思路,而且
要不断的调试程序才能把程序调试正确,同时还要做到界面的输出
也是需要美化的。
这次课程设计终于顺利完成了,在设计中遇到了
很多专业知识问题,最后在老师的辛勤指导下,也完成了课程设计。
通过这次的课程设计,让我更加了解到数据结构的重要性。
以及它
对我们专业的发展发挥的作用。
对我们而言,知识上的收获很重要,但精神上的丰收更加可喜。
让我知道了学无止境的道理。
我们每一
个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后
面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
这次课程设计必将成为我人生旅途上一个非常美好的回忆!同时在做课程设计时要能够从多方面去考虑,去研究,用多种算法去实现要求。
此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,这些都让我受益非浅,今后的制作应该能够更轻松,自己也都能够解决并高质量的完成项目。