为什么学习数据结构?
- 高级计算机程序设计的理论指导
数据结构可以采用不同的语言来描述和实现
写项目遇到复杂的情况时,应该采取哪种数据结构来组织我们的数据 - 提升编程能力
- 面试中经常问到
有哪些数据结构?
- 线性表
- 栈
- 队列
- (字符)串
- 数组
- 广义表
- 树
- 二叉树
- 图
学习数据结构的四种境界:
- 听懂理论、听懂算法思路
- 完成主要数据结构基本算法的实现
- 完成更多数据结构更多算法的实现
- 融会贯通、举一反三,在后续开发中总和应用数据结构知识
数据
- 数据(data)是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合
- 数据的含义非常广泛,除了通常的数值数据、字符、字符串是数据以外,声音、图像等一切可以输入计算机并能被处理的都是数据
- 例如除了表示人的名字、身高、体重等的字符、数字是数据,人的照片、指纹、三维模型、语音指令等也都是数据
数据项
- 数据项(data item)具有原子性,是不可分割的最小数据单位
- 如描述学生相关信息的姓名、性别、学号等都是数据项
- 三维坐标中的每一维坐标值也是数据项
数据元素
- 数据元素(data element)是数据的基本单位,是数据集合的个体,通常由若干个数据项组成,在计算机程序中通常作为一个整体来进行处理
- 例如一条描述一位学生的完整信息的数据就是一个数据元素;空间中一点的三维坐标也可以是一个数据元素
数据对象
- 数据对象(data object)是性质相同的数据元素的集合,是数据的子集
- 例如一个学校的所有学生的集合就是数据对象,空间中所有点的集合也是数据对象
eg. 红色:数据项 蓝色:数据元素 黄色:数据对象
数据结构
- 数据结构(data structure)是指相互之间存在一种或多种特定关系的数据元素的集合
- 是组织并存储数据以便能够有效使用的一种专门格式,它用来反映一个数据的内部构成,即一个数据由哪些成分数据构成,以什么方式构成,呈什么结构
- 由于信息可以存在于逻辑思维领域,也可以存在于计算机世界,因此作为信息载体的数据同样存在于两个世界中。
- 表示一组数据元素及其相互关系的数据结构同样也有两种不同的表现形式:
- 一种是数据结构的逻辑层面,即数据的逻辑结构
- 一种是存在于计算机世界的物理层面,即数据的存储结构
数据结构=逻辑结构+存储结构
数据结构=逻辑结构+存储结构+(在存储结构上的)运算/操作
数据的逻辑结构
数据的逻辑结构指数据元素之间的逻辑关系(和实现无关)
-
分类1:线性结构和非线性结构
线性结构:有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。
线性表就是一个典型的线性结构,它有四个基本特征:- 集合中必存在唯一的一个“第一个元素”
- 集合中必存在唯一的一个“最后的元素”
- 除最后元素之外,其它数据元素均有唯一的“后继”
- 除第一元素之外,其它数据元素均有唯一的“前驱”
生活案例:冰糖葫芦、排队上地铁
相对应于线性结构,非线性结构的逻辑特征是一个结点元素可能对应多个直接前驱和多个直接后继。
常见的非线性结构有:树(二叉树等),图(网等)
-
分类2: 集合结构、线性结构、树状结构、网状结构
逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网络结构
表和树是最常用的两种高效数据结构,许多高效的算法能够用这两种数据结构来设计实现- 集合结构:就是数学中所学习的集合。集合中的元素有三个特征:
1)确定性(集合中的元素必须是确定的)
2)唯一性(集合中的元素互不相同)
3)无序性(集合中的元素没有先后之分)
该结构的数据元素间的关系是“属于同一个集合”,别无其他关系
因为集合中元素关系很弱,数据结构中不对该结构进行研究 - 线性结构
数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构 - 树状结构
除了一个数据元素(元素01)以外每个数据元素有且仅有一个直接前驱元素,但是可以有多个直接后续元素。特点是数据元素之间是一对多的联系 - 网状结构
每个数据元素可以有多个直接前驱元素,也可以有多个直接后续元素。特点是数据元素之间是多对多的联系
- 集合结构:就是数学中所学习的集合。集合中的元素有三个特征:
数据的存储结构
数据的存储结构主要包括数据元素本身的存储以及数据元素之间关系表示,是数据的逻辑结构在计算机中的表示。
常见的存储结构有顺序存储、链式存储、索引存储以及散列存储
-
顺序存储结构
把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储结构为顺序存储结构,通常顺序存储结构是借助于计算机程序设计语言(例如C/C++)的数组来描述的。
(数据元素的存储对应于一块连续的存储空间,数据元素之间的前驱和后续关系通过数据元素在存储器中的相对位置来反映)
优点:节省存储空间,因为分配给数据的存储单元全用来存放结点的数据(不考虑C/C++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。
采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。
缺点:插入和删除操作需要移动元素,效率低 -
链式存储结构
数据元素的存储对应的是不连续的存储空间,每个存储结点对应一个需要存储的数据元素。
每个结点是由数据域和指针域组成。元素之间的逻辑关系通过存储结点之间的链接关系反映出来。
特点:
(1)比顺序存储结构的存储密度小(每个结点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)
(2)逻辑上相邻的结点物理上不必相邻
(3)插入、删除灵活(不必移动结点,只要改变结点中的指针)
(4)查找结点时链式存储需要比顺序存储慢
-
索引存储结构
除建立存储结点信息外,还建立附加的索引表来标识结点的地址,比如图书、字典的目录
-
散列存储结构
根据结点的关键字直接计算出该结点的存储地址
一种神奇的结构,添加、查询速度快
eg. 线性逻辑结构可以用顺序存储结构和链式存储结构来存储