是相互之间存在一种或多种特定关系的数据元素的集合
if you give someone a program,you will frustrate them for a day;
if you teach them how to program,you will frustrate them for a lifetime.
(如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子)
成为优秀的程序员,考研或者更高层次的为了感受编程之美,理由有很多种.都不妨碍数据结构作为计算机基础课中重要的一环.
需求要做一个实时用户排队表,但是学生却使用了数据库,每次在表的最后自动递增一个整形数字作为客户编号,但实际上这在内存中做就可以了,通常用数据结构中的’队列结构’是比较好的,用数组虽然也可以,但是又要考虑溢出,又要考虑新增和删除后的数据移动,总的来说不方便.但现在程序语言的开发工具总都有完美的实现了,为什么还需要理解算法的原理呢?这种问题下次别说出去,会在后面的学习中明白的.
早期人们把计算机当作数值计算工具,就是感觉计算机是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件.
可现实中,我们更多的不是解决数值计算问题,而是需要一些更科学有效的手段(比如表,树,和图等数据结构)的帮助,才能更好的处理问题.
所以,数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科.
说到数据结构,得先谈谈什么是数据
是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合.数据不仅仅包含整形,实数型等数值类型,还包括字符及声音,图像/视频等非数值类型.
比如我们现在常用的搜索引擎,一般会有网页,mp3,图片,视频等分类.mp3就是声音数据,图片当然是图像数据,视频就不用说了,而网页其实指的就是全部数据的搜索,包括最重要的数字和字符等文字数据.(数字1,2,3,歌曲.mp3,视频.mkv等等,网页.html)
也就是说,我们这里说的数据,其实就是符号,而且这些符号必须具备两个前提:
对于整形/实型等数值类型,可以进行数值计算
对于字符数据类型,就需要进行非数值的处理.而声音,图像,视频等其实可以是通过编码的手段变成字符数据来处理的.
数据元素:组成数据的,有一定意义的基本单位,在计算机中通常作为整体处理.也成为记录.
比如,在人类中,人就是数据元素
数据项:一个数据元素可以由多个数据项组成
比如人这杨的数据元素,可以有眼,耳,鼻,嘴,手,脚这些数据项,也可以有姓名,年龄,性别,出生地址,联系电话等数据项,具体有哪些数据项,要视你做的系统来决定.
数据项是数据不可分割的最小单位.在本书后面的内容里,我们把数据项定义为最小单位,是有助于我们更好地解决问题.所以,记住数据项是数据的最小单位.但真正讨论问题时,数据元素才是数据结构中的建立数据模型的着眼点.就像我们讨论一部电影时,是讨论这部电影角色这样的’数据元素’,而不是针对这个角色的姓名或者年龄这样的"数据项"去研究分析.
数据对象:是性质相同的数据元素的集合,是数据的子集.
什么是性质相同呢,是指数据元素具有相同数量和类型的数据项,比如,还是刚才的例子,人都有姓名,生日,性别等相同的数据项.
既然数据对象是数据的子集,在实际应用中,处理的数据元素有相同性质,在不产生混淆的情况下,我们都将数据对象简称为数据
说了数据的定义,那么数据结构中的结构又是什么呢?
结构,简单的理解就是关系,比如分子结构,就是说组成分子的原子之间的排列方式.
严格点说,结构是指各个组成部分相互搭配和排列的方式.在现实世界中,不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构.
那数据结构是什么?
在计算机中,数据元素并不是孤立,杂乱无序的,而是具有内在联系的数据集合.数据元素之间存在的一种或多种特定关系,也就是数据的组织形式.
为编写一个’好’的程序,必须分析待处理数据对象的特性及各处理对象之间存在的关系,这也就是研究数据结构的意义所在.
定义中提到了一种或多种关系,具体是什么样的关系,这正是我们下面要讨论的问题
按照视点的不同,我们把数据结构分为逻辑结构和物理结构
逻辑结构:是指数据对象中数据元素之间的相互关系.其实这也是我们今后最需要关注的问题.逻辑结构分为以下四种:
集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系.各个数据元素之间是’平等’的,它们的共同属性是’同属于一个集合’.数据结构中的集合关系就类似与数学中的集合
线性结构:线性结构中的数据元素是一对一的关系
树形结构:树形结构中的数据元素之间存在一种一对多的层次关系
图形结构:图形结构的数据元素是多对多的关系
我们再用示意图表示数据的逻辑结构时,要注意两点:
从之前的例子可以看出,逻辑结构是针对具体问题的,是为了解决某个问题,在对问题理解的基础上,选择一个合适的数据结构表示数据元素之间的逻辑关系
说完了逻辑结构,再来说说数据的物理结构(很多书中也叫存储结构,可以理解是一回事)
物理结构:是指数据的逻辑结构在计算机中的存储形式
数据是数据元素的集合,那么根据物理结构的定义,实际上是如何把数据元素存储到计算机的存储器中.存储器主要是针对内存而言的,像硬盘,软盘,光盘等外部存储器的数据组织通常用文件结构来描述.
数据的存储结构应正确反映数据元素之间的逻辑关系,这才是最为关键的.如何存储数据元素之间的逻辑关系,是实现物理结构的重点和难点.
数据元素的存储结构形式有两种:顺序存储和链式存储
顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的
这种存储结构其实很简单,说白了,就是排队占位,大家都按照顺序拍好,每个人占一小段空间,大家谁也别插队.我们之前学习计算机语言时,数组就是这样的顺序存储结构.当你告诉计算机,你要建立一个有9个整形数据的数组时,计算机就在内存中找了片空地,按照一个整形所占位置的大小乘以9,开辟一段连续的空间,于是第一个数组数据就放在第一个位置,第二个数据就放在第二个,这样依次摆放.
如果就是这么简单和有规律,一切就好办了.可实际上,总会有人插队,也会有人要上厕所,有人会放弃排队.所以这个队伍当中会添加新成员,也有可能会去掉老元素,整个结构时刻都处于变化中,显然,面对这样时常要变化的结构,顺序存储是不科学的,那怎么办呢?
现在在银行,医院等地方,都有排队系统,你关注的是前一个号有没有被叫到,叫到了,下一个就轮到了
链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的.数据的存储关系并不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址,这样通过地址就可以找到相关数据元素的位置
显然,链式存储就灵活的多了,数据存在哪里不重要,只要有一个指针存放了相应的地址就能找到它了
逻辑结构是面向问题的,而物理结构是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机内存中
数据类型:是指一组性质相同的值的集合以及定义在此集合上的一些操作的总称.
数据类型是按照值的不同进行划分的.在高级语言中,每个变量,常量和表达式都有各自的取值范围.类型就用来说明变量或表达式的取值范围和所能进行的操作.
当年那些设计计算机语言的人,为什么会考虑到数据类型呢?
在计算机中,内存不是无线大的,你要计算一个如1+1=2,3+5=8这样的整形数字的加减乘除计算,显然不需要开辟很大的适合小数甚至字符运算的内存空间,于是计算机的研究者们就考虑,对数据进行分类,分出来多种数据类型
在C语言中,按取值不同,数据类型可分为两类:
比如,在C语言中声明变量int a,b,这就意味着,在给变量a和b赋值时不能超出int的取值范围,变量a和b之间的运算只能是int类型所允许的运算.高级语言的编程者不管程序最终运行在什么计算机上,目的就是为了实现整型数字的运算,他不关心整数在计算机内部是如何表示的,也不想知道CPU为了实现1+2进行了几次开关操作,这些操作是如何实现的,这些对高级语言来说都不重要.于是我们就要考虑,无论什么计算机,什么计算机语言,都会面临如整型运算,实数运算,字符运算等操作,我们可以考虑把它们都抽象出来.
抽象是指抽取出事物所具有的普遍性的本质.它是抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括.抽象是一种思考问题的方式,它隐藏了繁杂的细节,只保留实现目标所必需的信息.
我们对已有的数据类型进行抽象,就有了抽象数据类型
抽象数据类型(ADT):是指一个数学模型及定义在该模型上的一组操作.抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关.比如整型就是一个抽象数据类型,尽管它在各种机器上的实现方法可能不同,但由于其定义的数学特性相同,在计算机编程来看,它们都是相同的,因此,'抽象’的意义在于数据类型的数学抽象特性.
而且,抽象数据类型不仅仅指那些以及定义且实现的数据类型,还可以是计算机编程者在设计软件程序时自己定义的数据类型,比如我们编写关于计算机绘图或者地图类软件系统,经常使用到坐标,也就是说,总是有承兑出现的x和y,在3D系统中还有z出现,就可以定义一个point的抽象数据类型.
一个抽象数据类型,定义了:一个数据对象,数据对象中各数据元素之间的关系,及对数据元素的操作.至于,一个抽象数据类型到底要哪些操作,这就只能由设计者根据实际需求来定.像马里奥,可能只有两种操作,走和跳,这都根据实际情况来设计.
事实上,抽象数据类型体现了程序设计中问题分解,抽象和信息隐藏的特性.抽象数据类型把实际生活中的问题分解成了多个规模小且容易处理的问题,然后建立一个计算机能处理的数据模型,并把每个功能模块的实现作为一个独立的单元,从而使具体实现过程隐藏起来.
为了便于之后讲解中对抽象类型进行规范的描述,我们给出描述抽象数据类型的标准格式:
ADT 抽象数据类型名
Data
数据元素之间逻辑关系的定义
Operation
操作1
初始条件
操作结果描述
操作2
...
操作n
...
endADT
由以上概念,给出了数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合
同样是结构,从不同角度讨论,会有不同的分类
最后,我们介绍了抽象数据类型及它的描述方法,为之后的课程打下基础