赞
踩
什么是数据结构?简单来说,就是点(集合)、线、树、图。
如果把点看成一个个数据,连接线看成点与点之间关系。
那么数据结构要研究就是就是数据和数据相互关系。
这些结构在生活中都可以找对应的参照物。
当我们有着使用数据结构,进行存储数据,操作数据达到我们目的的前提下,
数据结构自然还包括关于这些结构一些操作部分,也是我们操作处理。
操作一般包括这些一组操作:增(创建)、删、查(遍历)、改(调整)。
我们从数据结构研究内容,可以总结出数据结构框架体系或者这是你的学习工具和方向,在学习过程不断回顾这一框架和逐步填充下面这张图的内容。
可能大家没意识这张图的意义,这么说,学习是一种讲究效率活动,如果你反反复复去学习数据结构具体知识,没有关注这个框架构建,你会陷入反复学习反复忘记过程,陷入一种对具体技术追求,没搞清原理,一段时间后总是在某个节点卡住了。
又要回头看书、查阅资料低效率学习过程。
工作时候,别人又拿这些知识来恶心你。
正如上面所说的,数据结构研究内容主要包括点、线、树、图类型以及他们数据定义、数据相互关系、数据操作方法。
所以我们高度总结任何一个数据结构为抽象数据类型(Abstract Data Type)ADT,即所有数据结构都可以描述为一个数学模型以及定义在该模型上一组操作。
ADT 抽象数据类型名(
数据对象:(数据对象的定义)
数据关系:(数据关系的定义)
基本操作:(基本操作的定义)
)ADT 抽象数据类型名
可以这么说,当你掌握某个数据结构,肯定能列出它的抽象数据类型。
这是我们学习数据结构知识框架体系或者工具,每学一个数据结构,都要尝试写出或者回答每个数据结构的抽象数据类型。而且你向别人表达你对某个数据结构理解,也应该按照三个方面进行表述。
再次强调,抽象数据类型:数据对象的定义、数据关系的定义、基本操作的定义。
举例一个顺序线性表的数据结构。
数据对象定义:一组数据。
数据关系:
你可能对这种描述表示难以理解和啰嗦,但是必须承认上述非常严谨表述达出数据之间关系。你甚至可以简单总结顺序表就是一组从左到右顺序的数据。
当教材引入这些表述,且放在比较容易的线(线性表、栈、队列)学习内容,是让你热身,习惯 前驱和后继的表达方式,让在后面树和图的学习不至于没有方向感。
除了正常语言描述,还有数学语言表达,加深你对数据结构的理解。
使用二元组方式表示。
顺序表数据结构 = (D,S),D是Data Object(数据对象),S是Structure (关系)
其中:
D={1,2,3}
表示包含1、2、3数据元素的集合
S={<1,2>,<2,3>}
表包含1、2、3数据元素的相互关系的集合,
其中有序偶<1,2>表示数据1的后面是数据2,依次类推<2,3>的含义。
以上是用数学模型的表达,其中二元组、有序偶这些概念自查不作解释。
我换成集合常用符号表达一下。
我觉得,知识可以往浅显来说,如何入门是很重要,但是这不是学习知识的主要方法。反反复复入门没有太多意思,纯浪费时间。而且非得强调外部环境适应自己,才能学好,学习能力也就停滞不前。
现在外部环境就是这是一套完整的解释理论表达方式。你不按照这样表达方式,要么自创一套费时费力,另外学了这一套表达那些人,也是这一套表述方式来传授知识。不学这些,岂不是后面追求更加高深的知识的路也被隔断了。
所以,不好学,也得忍着,如果要深入学习。
为什么要说树,因为拿线性表热身,现在才是真正要开始说有用的;再说举个单例,没有比较,不好理解。
重新表达一下抽象数据类型
从数学上的数据结构定义来说,可以有无数的数据结构。
而学习的数据结构(点、线、树、图)是一种设计出来数据和数据关系,同时满足和实现计算机功能这一类的数据结构。当一种数据结构被设计出来,肯定是要实现某种操作,为操作提供便利。
所以有对应有某个数据结构的抽象数据类型(某个数据结构+操作方法)。
用三元组表示抽象数据类型=(D,S,P) ,对比用二元组表示数据结构=(D,S)的 多了一个P,Process 表示操作。
树的抽象数据类型
1、数据对象是:每个数据元素都是一个节点,有一个有前驱和0个到多个后继的节点。例如:节点结构([前驱,节点数据,后继1,后继2,后继3])
2、数据关系:没有前驱的节点是根。叶子就是没有后继节点是叶子,节点有前驱,它的和它后继的后继…一起叫子树。
3、基本操作:构造、增、删、改、查、遍历。(这个要单独说明一下,所有数据结构基本操作都是类似内容,不要去死记硬背操作函数,一些特别函数一定要结合数据关系来理解)
4、对树的理解最重要是理解前驱和后继这两个概念。
ADT Tree( 数据对象:D是具有相同特性的数据元素的集合。([前驱,节点数据,后继1,后继2,后继3]) 数据关系:我用自己话描述一下(什么是空树,什么是根,什么是子树), 1、当D是空集,为空树。 2.1、当D只有一个数据元素,这个数据元素是根root。 例如:D=(d1),d1为根。 2.2、当D存在多个数据元素,每个数据元素都存在前驱或者后继, 而存在无前驱的数据元素是根root。 例如:D=(A,B,C,D,E,F,G,I,J,K) 共10个节点,且都是不相同。 S=( <A,B>,<A,C>,<A,D>, <B,E>,<B,F>, <C,G>, <D,I>,<D,J>, <I,K> ) 类似<A,B> 表示B的前驱就是A,A的后继是B。 在这个S数据对象关系集合中,我们是不是找不到一个<?,A>这样关系。 所以A没有前驱,所以A是root。 2.3、叶子就是没有后继节点是叶子。 2.4、节点有前驱,它的和它后继的后继...一起叫子树。 ... 基本操作:initTree、destroyTree、createTree、ClearTree...等等 )
对了,图这类结构最为复杂。复杂地方在于在点、线、树内容,我们很少探讨连接点那些线有啥用,最多就是给我们感觉线是方向,带箭头的概念,但是没有对连接的线,赋权值。
而图就是把前面类型综合了,同时对线赋权值,带方向。只要你看一遍,也可以总结出来。
学习数据结构,不要尝试去背代码,所有数据结构要按照ADT三个方面去理解,多画图,多整理ADT这个数学模型。初学阶段不要拘泥数据结构基本操作具体实现,最重要是理解这种思维方式。
什么思维方式?
每学一个数据结构,都要尝试写出或者回答每个数据结构的抽象数据类型。而且你向别人表达你对某个数据结构理解,也应该按照
第一步:数据对象的定义、第二步:数据关系的定义、第三步:基本操作的定义等三个方面进行表述。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。