参考资料
《大话数据结构》书籍下载地址
程序设计 = 数据结构+算法
(一)数据结构
1.基本概念和术语
(1)相似概念辨析
名称 | 解释 | 举例说明 |
---|---|---|
数据 | 计算机可操作的对象,能被计算机识别,并输入给计算机处理的符号集合 | 不能只把数据理解为数 |
数据对象 | 性质相似的数据元素组成的集合,是数据的子集。 | 有相同特点的数据集合人都有姓名、性别生日等相同的数据项 |
数据元素 | 组成数据的有一定意义的基本单位 | 更具体更直观的数据,eg人类中的数据元素是人 |
数据项 | 一个数据元素可以由若干数据项组成,数据项是数据不可分割的最小单元 | 可以联想到结构体与结构体中元素的关系,C++中对象和成员函数的关系,eg人这个数据元素还有眼耳鼻喉这些数据项 |
数据结构 | 相互之间存在一种或多种特定关系的数据元素的集合 | 数据结构的本质数数据与数据之间的关系 |
2.数据结构的分类
数据结构本质是刻画数据与数据的关系,所以对数据元素的分类就是按照不同的关系进行分类。
(1)逻辑结构:有连接关系(线性结构一对一、树形结构一对多、图形结构多对多),无连接关系(集合结构)
结构名称 | 概念解释 |
---|---|
集合结构 | 所有元素同属于一个集合以外,没有其他关系 |
线性结构 | 数据元素之间是一对一的关系 |
树形结构 | 数据元素之间存在一对多的层次关系 |
图形结构 | 图形结构的数据元素是多对多的关系 |
(2)物理结构:连续存放在地址连续的存储单元中(数组),存放到任意存储单元中(链表)。
逻辑结构是面向问题,针对不同的实际问题需要有不同的选择。
物理结构是面向计算机的,针对不同存储中的资源和效率问题时需要进行细致的考虑。
结构名称 | 概念解释 |
---|---|
顺序存储结构 | 把数据元素存放在地址连续的存储单元里,数据间的逻辑结构和物理关系是一致的 |
链式存储结构 | 把数据存放在任意的存储单元里,存储关系不反应逻辑关系 |
3.结合应用的理解
数据结构中常用术语从逻辑和物理两个角度理解。
(1)数组
物理角度:不直接反映元素之间相互连接的关系,是在物理上顺序存储的容器。
array和vector的使用
(2)链表
物理角度:在内存中不连续分布。
链表的使用以及常见力扣题
链表比数组能够直观一点反应元素之间的相互关系,不过这种相互关系也只是限于相邻元素之间。
(3)哈希表
a.逻辑关系:一对一(发生碰撞就是为了解决多对一的问题)
b.物理结构:是unorder_map的实现方式,map容器中既有关键字,也有关键字对应的数值
数组:数组是一张特殊的哈希表,哈希表的关键字就是索引下标。
哈希表是数组的泛化,索引不仅是具体的数值,还有可以是其他各种字符。
用哈希表解决问题是时可以用数组,set,map来解决问题。
说明逻辑关系和物理结构很多时候是交叉的,同一个逻辑关系可以用不同的物理结构表示,不同的逻辑关系也可以使用同一种物理结构表示。
哈希表是一种数据与数据之间的组织关系
(4)二叉树
a.逻辑关系:元素之间是一对多的关系
b.物理结构:链式存储方式就用指针, 顺序存储的方式就是用数组。
具体的存储规则还可以细分,具体的选择取决于应用场景,选择的重点是如何反应数据与数据之间的逻辑关系。
//链式存储的定义,节点值和左右指针
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
用数组也可以存储二叉树:双亲表示法,孩子表示法,孩子兄弟表示法。
根据不同需要存储节点以及节点之间的关系。
遍历方式是从元素访问顺序的角度来说的,不要将其与存储方式弄混,在解决遍历方式时,二叉树的节点已经用链式存储的方式存储好了。
(5)栈和队列
a.逻辑关系:只允许对端处的元素进行操作
b.物理结构:既可以用线性结构存储,又可以用链式结构存储
线性结构:两栈共享空间用一个数组存储两个栈,两个栈增加元素就是两端点向中间延伸;
链式结构:栈只是栈顶来做插入和删除操作;
【第四章 栈与队列】——《大话数据结构》
对于栈和队列,需要重点学习的就是出入栈操作,就是增加和删除的操作。
栈本身不归类为容器,但是栈是以底层容器来完成所有功能的。栈的底层实现可以是vector、deque、list,栈归类为容器适配器。