大话数据结构01-数据结构序论
1.开场白
数据结构 是 相互之间存在一种或多种特定关系的数据元素的集合。
早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的, 所以计算机解决问题,应该是先从具体间题中抽象出一个适当的数据模型,设计出一 个解此数据模型的算法,然后再编写程序,得到一个实际的软件。
如下图:
可现实中, 我们更多的不是解决数值计算的问题,而是需要一些更科学有效的手段(比如表、树和图等数据结构)的帮助,才能更好地处理问题。 所以数据结构是一 门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
比方说实时的排队系统,通常用数据结构中的"队列结构n 是 比较好的,用数组虽然也可以,但是又要考虑溢出。因此我们得出:
程序设计 = 鼓据结构+算法
2.数据的基本概念和术语
2.1.数据的基本概念和术语
数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 数据不仅仅包括整型、实型等数值类型,还包 括字符及声音、图像、视频等非数值类型。
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。 也被称为记录。比如,在人类中,什么是数据元素呀? 当然是人了。
禽类呢?哈, 牛、马、羊、鸡、猪、 狗等动物当然就是禽类的数据元素。
数据项:一个数据元素可以自若干个数据项组成,数据项是数据不可分割的最小单位。比如人这样的数据元素,可以有眼、耳、鼻、嘴、 手、脚这些数据项,也可以有 姓名、年龄、性别、出生地址、联系电话等数据项,具体有哪些数据项,要视你做的 系统来决定。
数据项是数据不可分割的最小单位。在数据结构这门课程中,我们把数据项定义 为最小单位,是有助于我们更好地解决问题。所以,记住了,数据项是数据的最小单 位。但真正讨论问题时,数据元素才是数据结构中建立数据模型的着眼点。就像我们 讨论一部电影时,是讨论这部电影角色这样的"数据元素",而不是针对这个角色的姓名或者年龄这样的"数据项"去研究分析。
数据对象:是性质相同的数据元素的集合,是数据的子集。
什么叫性质相同呢,是指数据元素具有相同数量和类型的数据项,比如,还是刚 才的例子,人都有姓名、生日、性别等相同的数据项。既然数据对象是数据的子集,在实际应用中,处理的数据元素通常具有相同性 质 , 在不产生混淆的情况下,我们都将数据对象简称为数据。
结构,简单的理解就是关系,比如分子结构,就是说组成分子的原子之间的排列 方式。严格点说, 结构是指各个组成部分相互搭配和排列的方式,在现实世界中,不 同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构。 而这种关系就是我们程序设计的关键点,你可以理解为人为的设定。
因此,数据结构:是相互之间存在一种或多种特定关系的数据元蠢的集舍。为编写出一个好"的程序,必须分析待处理对象的特性及各处理对象之间存在的关系。这也就是研究数据结构的意义所在。而这种特定的关系,就是逻辑结构和物理结构
2.2.逻辑结构与物理结构
逻辑结构:是指数据对象中数据元素之间的相互关系。分为四种:
- 集合结构(list):集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关 系。 各个数据元素是"平等'的,它们的共同属性是"同属于一个集合"。数据结构中 的集合关系就类似于数学中的集合。
例如公共汽车上的所有乘客,存放在仓库中的产品。集合结构的主要操作有查找和排序。集合结构的元素间没有固有的关系,不需要存储关系,依赖线性表和树。唯一专用于集合类型的数据结构是哈希表
- 线性结构(link list)线性结构中的数据元素之间是一对一的关系
线性结构是一个有序数据元素的集合,常用的线性结构有:线性表,栈,队列,双队列,串。关于广义表、数组,是一种非线性的数据结构。常见的非线性结构有:二维数组,多维数组,广义表,树(二叉树等),图。
1.集合中必存在唯一的一个"第一个元素";
2.集合中必存在唯一的一个"最后的元素";
3.除最后元素之外,其它数据元素均有唯一的"后继";
4.除第一元素之外,其它数据元素均有唯一的"前驱"。
数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构。如(a0,a1,a2,.....,an),a0为第一个元素,an为最后一个元素,此集合即为一个线性结构的集合。相对应于线性结构,非线性结构的逻辑特征是一个结点元素可能对应多个直接前驱和多个后继。因此数据结构又分为线性结构和非线性结构(集合结构和,树性结构,图形结构)
- 树形结构(tree):简单的说树形结构中数据元素之间存在一种一对多的层次关系。往深里面说树形结构是一种层次的嵌套结构。 在树形结构中,树根结点没有前驱结点,其余每个结点有且只有一个前驱结点。叶子结点没有后续结点,其余每个结点的后续节点数可以是一个也可以是多个。一个树形结构的外层和内层有相似的结构, 所以这种结构多可以递归的表示。经典数据结构中的各种树状图是一种典型的树形结构:一颗树可以简单的表示为根, 左子树, 右子树。 左子树和右子树又有自己的子树。
- 图形结构(graph)::图形结构的数据元素是多对多的关系 。逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限制,即仅含一种任意的关系,则称这种数据结构为图形结构。图形的最重要的运算方法是(一)深度优先遍历算法和(二)广度优先遍历算法
• 将每一个数据元素看做一个结点,用圈圈表示。
• 元素之闯的逻辑关系用结点之间的连线表示.如果这个关系是有方向的,那么用
带箭头的连续表
物理结构(也叫做存储结构):是指数据的逻辑结构在计算机中的存储形式,数据的存储结构应正确反映数据元素之间的逻辑关系,这才是最为关键的,如何 存储数据元素之间的逻辑关系,是实现物理结构的重点和难点。
数据是数据元素的集合,那么根据物理结构的定义,实际上就是如何把数据元素存储到计算机的存储器中。存储器主要是针对内存而言的,像硬盘、软盘、光盘等外 部存俯器的数据组织通常用文件结构来描述
数据元素的存储结构形式有两种:顺序存储和链式存储
- 顺序存储结构(queue):是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的 。
当你告诉计算机,你要建立一个有 9 个整型数据的数组时,计算机就在 内存中找了片空地, 按照一个整型所占位置的大小乘以 9 ,开辟一段连续的空间,于是第一个数组数据就放在第-个位置,第二个数据放在第二个,这样依次摆放。
- 链式存储(stack)
实际上 ,总会有人插队,也会有 人要上厕所、有人会放弃排队。所以这个队伍当中会添加新成员,也有可能会去掉老 元素,整个结构时刻都处于变化中。显然,面对这样时常要变化的结构,顺序存储是 不科学的。
现在如银行、医院等地方,设置了排队系统,也就是每个人丢了,先领一个号, 等着叫号,叫到时去办理业务或者病。在等待的时候,你爱在哪在哪,可以坐着、站 着或者走动,甚至出去逛一圈,只要及时回来就行。 你关注的是前一个号有没有被叫 到,叫到了,下一个就轮到了。链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连 续的,也可以是不连续的。 数据元素的存储关系并不能反映其逻辑关系,因此需要用 一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置 。
因此:逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标就是将数 据及其逻辑关系存储到计算机的内存中。
3.抽象数据类型
数据类型是指一组性质相同的值得结合以及定义在此集合上的一些操作(也就是指定好类型)的名称。数据类型是按照值的不同进行划分的。在高级语言中,每个变盘、常量和表达式 都有各自的取值范围。类型就用来说明变量或表达式的取值范围和所能进行的操作。
在计算机中,内存也不是无限大的 ,你要计算一个如 1+1=2、 3+5=8 这样 的整型数字的加减乘除运算,显然不需要开辟很大的适合小数甚至字符运算的内存空 间。于是计算机的研究者们就考虑,要对数据进行分类,分出来多种数据类型。
在 C 语言中,按照取值的不同,数据类型可以分为两类;
• 原子类型:是不可以再分解的基本类型,包括整型、实型、字符型等。
• 结构类型:自若干个类型组合而戚,是可以再分解的。例如,整型数组是由若干整型数据组成。
抽象是指抽取出事物具有的普遍性的本质。它是抽出问题的特征而忽略非本质的 细节,是对具体事物的一个概括。抽象是一种思考问题的方式,它隐藏了繁杂的细 节,只保留实现目标所必需的信息。抽象数据类型 (Abstract Dataη肘, ADT) : 是指一个数学模型及定义在该模型 上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内 部如何表示和实现无关。"抽象'的 意义在于数据类型的数学抽象特性。比如我们编写关于计算机绘图或者地 图类的软件系统,经常都会用到坐标。也就是说,总是有成对出现的 x 和 Y. 在 31D 系统中还有 z 出现,既然这三个整型数字是始终在一起出现,我们就定义一个叫 point 的抽象数据类型,包有 x、 y、 z 三个整型变量,这样我们很方便地操作一个 point 数 据变量就能知道这一点的坐标了。事实上, 抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性。为了便于在之后的讲解中对抽象数据类型进行规范的描述,我们给出了描述抽象数据类型的标准格式:
4.总结:
数据结构的相关概念,数据结构是相互之间存在一种或多种特定 关系的数据元素的集合。 同样是结构,从不同的角度来讨论,会有不同的分类。