在刚开始学习数据结构,我推荐一定要搞懂三个问题,这将对我们学习数据结构的帮助很大,能让我们对数据结构有一个清晰的认识,问题如下
1.学习数据结构是干嘛用的?
2.什么是数据结构?
3.数据结构要学习什么?
明白了这两个问题,我们就知道了数据结构的作用是什么,如果对我们有用,那么我们应该怎样学习使用用它。
********************************************************************************************
以下是我对这两个问题的个人看法
早期,计算机主要用于数值计算,那时候数据元素间的关系简单,计算复杂,软件设计者主要精力用于程序设计的技巧上,而对如何在计算机组织数据并不需要花费太多的时间更精力。但是随着计算机应用领域的扩展,计算机被越来越多地用于非数值计算,不再是单纯的数值数据。无法用数学公式或者数学方程来解决。这时我们就必须去考虑组织这些数据,而这些数据并不是杂乱无章的,它们一定有内在的联系,只要弄清楚它们之间本质的联系,就能使用计算机对大量的数据进行有效的处理。这就我们的数据结构所要研究的内容。
在举个例子:计算机在解决一个现实问题通常要进行以下几个步骤,见下图
而第一步将具体问题抽象为数学模型的实质是:
问题(机外表示、处理要求)->数学模型(逻辑结构、基本操作)->编程实现(存储结构、实现算法)
也就是将问题(机外表示、处理要求)->数学模型(逻辑结构、基本操作)
而这一步正是我们数据结构所干的事。
终上所述,我们大概知道了数据结构是将现实(非数值数据)问题转化为计算机语言的表示,让计算机去处理它。我们学习数据结构其实就是在学习这种思想,需要我们一定的逻辑思维跟抽象能力。
书上的定义
数据结构是指按照一定的逻辑结构构成的一组数据,使用某种存储结构将这批数据存储于计算机中,并在这些数据上定义一个运算集合。
而作为专业课,数据结构是一门研究非数值的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。
通过前两个问题,我们大概了解到
数据结构讨论的是数据的逻辑结构,存储方式以及相关的操作。
所以我们之后的学习的方向就是围绕着这三面进行的
但是在学习这三面之前,我们对数据有个清楚的概念
细分为以下这五个方面
数据:
数据是信息的载体,是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整形、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。
数据项:
构成数据元素不可分割的最小单位
数据元素:
1.是数据的基本单位,在计算机程序中通常作为一个整体考虑而处理
2.也被称为元素,或称为记录,结点或顶点。
3.一个数据元素可由若干个数据项组成
数据对象:
是性质相同的数据元素的集合,是数据的一个子集。
列如:
整数数据对象是集合N={-1,0,1,23,4..}
人员表也可看做一个数据结构
它们四个之间的关系 数据>=数据对象>数据元素>=数据项
数据、数据元素、数据项、数据对象的实例介绍
下面是举个实例给大家:
假设有两张表,A表为人员表,B表为课程表, 表的格式如下:
姓名 | 性别 | 身高 | 课程代号 |
---|---|---|---|
小明 | 男 | 180 | A |
小红 | 女 | 180 | A |
小绿 | 男 | 180 | B |
课程代号 | 课程名 |
---|---|
A | 语文 |
B | 数学 |
重点:
这两张表就是数据
而单独的一张表就称为数据对象,即人员表是一个数据对象,课程表也是一个数据对象
而每张表中的每一行就称为数据元素
而姓名,性别,身高,课程代号,课程名就称为数据项
数据类型
数据类型是一个值的集合和定义在此集合上的一组操作的总称
分类
原子类型:其值不可再分的数据类型
结构类型:其值可以再分解为若干成分(分量)的数据类型
抽象数据类型:抽象数据组织及相关的操作,能将数据的逻辑结构及运算在计算机上具体实现。
了解完数据的基本概念,我们便可以开始进入正题
数据结构讨论的是数据的逻辑结构,存储方式以及相关操作。
我们就可以从数据结构的这基本三要素下手
逻辑结构
描述数据元素之间的逻辑关系
与数据的存储无关,独立于计算机
是从具体问题抽象出来的数学模型
存储结构(物理结构)
数据元素及其在计算机存储器中的存储方式(结构)又称映像,也称物理结构
是数据元素和关系的表示
存储结构是用于计算机语言实现的逻辑结构,它依赖于计算机语言
有序地组织计算机进行存储
逻辑结构与存储结构的关系
存储结构是逻辑关系的映像与元素本身的映身。
逻辑结构是物理结构的抽象,存储结构是数据结构的实现
两者综合起来建立了数据元素之间的关系
逻辑结构的两种分类划分方式:
划分一:
有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直前趋和一个直接后继。
例如:线性表、栈(特殊线性表)、队列(特殊线性表)、字符串,数组,广义表
2.非线性结构
一个结点可能有多个直接前趋和直接后继
例如:树,图
划分二:
集合结构:集合中的元素除了同属于一个集合之外,没有其他关系
线性结构:线性结构中的数据元素之间是一对一的关系
树形结构:树形结构中的数据元素之间是一对多的层次关系
图形结构:图形结构中的数据元素之间是多对多的关系
1.顺序存储结构
用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置
来表示。
c语言中用数组来实现顺序存储结构
2.链式存储结构
用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。
C语言中用指针来实现链式存储结构
3、索引存储
索引存储方式是采用附加的索引表的方式来存储节点信息的一种存储方式。索引表由若干索引项组成。索引存储方式中索引项的一般形式为(关键字、地址)。其中,关键字是能够唯一标识一个节点的数据项。索引存储方式还可以细分为稠密索引:这种方式中每个节点在索引表中都有一个索引项,其中索引项的地址知识节点所在的存储位置。稀疏索引:这种方式中一组节点在索引表中只对应一个索引项。其中,索引项的地址指示一组节点的起始存储位置。
4、散列存储
散列存储方式是根据节点的关键字直接计算出该节点的存储地址的一种存储方式。在实际应用中,往往需要根据具体的数据结构来决定采用哪种存储方式。同一逻辑结构采用不同的存储方法,可以得到不同的存储结构。而且者4中基本存储方法,既可以单独使用,也可以组合起来对数据结构进行存储描述。
数据的运算
施加在数据上的运算包括运算的定义和实现
运算的定义是针对逻辑结构的,指出运算的功能
运算的实现是针对存储结构的,指出运算的具体操作步骤
包括:检索,排序、插入、删除、修改