数据结构绪论
1.1、数据结构起源
“早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。
可现实中,我们更多的不是解决数值计算的问题,而是需要一些更科学有效的手段(比如表、树和图等数据结构)的帮助,才能更好地处理问题。所以数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
1968年,美国的高德纳(Donald E. Knuth)教授在其所写的《计算机程序设计艺术》第一卷《基本算法》中,较系统地阐述了数据的逻辑结构和存储结构及其操作,开创了数据结构的课程体系。同年,数据结构作为一门独立的课程,在计算机科学的学位课程中开始出现[…]”
摘录来自: 程杰. “大话数据结构。”
1.2、基本概念和术语
说到数据结构是什么,我们得先来谈谈什么叫数据。
正所谓“巧妇难为无米之炊”,再强大的计算机,也是要有“米”下锅才可以干活的,否则就是一堆破铜烂铁。这个“米”就是数据。
1.2.1、数据
数据:是描述客观事物的符号,是计算机中可以操作的对象,是能够被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包含整型、实型等数值类型,还包含图片、文字、声音、视频等非数值的类型。
比如我们常用的搜索引擎,“一般会有网页、MP3、图片、视频等分类。MP3就是声音数据,图片当然是图像数据,视频就不用说了,而网页其实指的就是全部数据的集合,包括最重要的数字和字符等文字数据。”
也就是说,我们这里说的数据,其实就是符号,而且这些符号必须具备两个前提:
- 可以输入到计算机中。
- 能被计算机程序处理。
对于整型、实型等数值类型,可以进行数值计算。
对于字符数据类型,就需要进行非数值的处理。而声音、图像、视频等其实是可以通过编码的手段变成字符数据来处理的。
1.2.2、数据对象
数据对象:数据对象是性质相同数据元素的集合,是数据的子集。
何为性质相同?
性质相同是指数据元素具有相同数量和类型的数据项,比如,人都有姓名、生日、性别等相同的数据项。
1.2.3、数据元素
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
比如,在人类中,什么是数据元素呀?当然是人了。
畜类呢?哈,牛、马、羊、鸡、猪、狗等动物当然就是禽类的数据元素。
1.2.4、数据项
数据项:一个数据元素可以由若干个数据项组成。
比如人这样的数据元素,可以有眼、耳、鼻、嘴、手、脚这些数据项,也可以有姓名、年龄、性别、出生地址、联系电话等数据项,具体有哪些数据项,要视你做的系统来决定。
数据项是数据不可分割的最小单位。在数据结构中,我们把数据项定义为最小单位,是有助于我们更好地解决问题。所以,记住了,数据项是数据的最小单位。但真正讨论问题时,数据元素才是数据结构中建立数据模型的着眼点。就像我们讨论一部电影时,是讨论这部电影角色这样的“数据元素”,而不是针对这个角色的姓名或者年龄这样的“数据项”去研究分析。
1.2.5、总结
通过上述几点的讲解,我们可以把数据的组成部分归结成下面这幅图。
若干个数据项组成一个数据元素,具有相同数量和类型的数据项的数据元素组成一个数据对象,若干个数据对象组成了数据。
代码示例:
/*
数据: 程序的操作对象,用于描述客观事物。
数据的特点:
1、可以输入到计算机。
2、可以被计算机处理。
数据项: 一个数据元素由若干数据项组成
数据元素: 组成数据的对象的基本单位
数据对象: 性质相同的数据元素的集合(类似于数组)
结构: 数据元素之间不是独立的,存在特定的关系.这些关系即是结构;
数据结构:指的数据对象中的数据元素之间的关系
*/
#include <stdio.h>
//声明一个结构体类型
struct Person{ //一种数据结构
char *name; //数据项--名字
char *sex; //数据项--性别
int age; //数据项--年龄
};
int main(int argc, const char * argv[]) {
struct Person p1; //数据元素;
struct Person pArray[10]; //数据对象;
p1.age = 18; //数据项
p1.name = "Joker"; //数据项
p1.sex = "男"; //数据项
return 0;
}
2、逻辑结构与物理结构
按照视点的不同,我们把数据结构分为逻辑结构和物理结构
2.1、逻辑结构
逻辑结构:是指数据对象中数据元素之间的相互关系。其实这也是我们今后最需要关注的问题。逻辑结构分为以下四种
2.1.1、集合结构
集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。各个数据元素是“平等”的,它们的共同属性是“同属于一个集合”。数据结构中的集合关系就类似于数学中的集合。如下图所示:
2.1.2、线性结构
线性结构:线性结构中的数据元素之间是一对一的关系。如下图所示:
2.1.3、树形结构
树形结构:树形结构中的数据元素之间存在一种一对多的层次关系。如下图所示:
2.1.4、图形结构
图形结构:图形结构的数据元素是多对多的关系。如下图所示:
我们在用示意图表示数据的逻辑结构时,要注意两点:
- 将每一个数据元素看做一个结点,用圆圈表示。
- 元素之间的逻辑关系用结点之间的连线表示,如果这个关系是有方向的,那么用带箭头的连线表示。
2.2、物理结构
物理结构:是指数据的逻辑结构在计算机中的存储形式。
数据是数据元素的集合,那么根据物理结构的定义,实际上就是如何把数据元素存储到计算机的存储器中。存储器主要是针对内存而言的,像硬盘、软盘、光盘等外部存储器的数据组织通常用文件结构来描述。
数据元素的存储结构形式有两种:顺序存储和链式存储。
2.2.1、顺序存储结构
顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。如下图所示:
这种存储结构其实很简单,说白了,就是排队占位。大家都按顺序排好,每个人占一小段空间,大家谁也别插谁的队。我们之前学计算机语言时,数组就是这样的顺序存储结构。当你告诉计算机,你要建立一个有9个整型数据的数组时,计算机就在内存中找了片空地,按照一个整型所占位置的大小乘以9,开辟一段连续的空间,于是第一个数组数据就放在第一个位置,第二个数据放在第二个,这样依次摆放。
2.2.2、链式存储结构
现在如银行、医院等地方,设置了排队系统,也就是每个人去了,先领一个号,等着叫号,叫到时去办理业务或看病。在等待的时候,你爱在哪在哪,可以坐着、站着或者走动,甚至出去逛一圈,只要及时回来就行。你关注的是前一个号有没有被叫到,叫到了,下一个就轮到了。
链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。数据元素的存储关系并不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。如下图所示:
2.3、总结
逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中。