3. 数据结构与算法
数据结构(数据结构是计算机存储、组织数据的方式)是指数据元素的集合及元素间的相互关系和构造方法,结构就是元素之间的关系。在数据结构中,元素之间的相互关系是数据的逻辑结构,按照逻辑关系的不同将数据结构分为线性结构和非线性结构。
3.1 本章考点与知识点图谱
3.2 线性结构
3.2.1 线性表
- 线性表的定义
一个线性表是n个有限序列(n≥0),通常表示为 ( a 1 , a 2 , … , a n ) (a_1,a_2,…,a_n) (a1,a2,…,an),其特点是在非空的线性表中:
(1)存在唯一的一个称作“第一个”的元素;
(2)存在唯一的一个称作“最后一个”的元素;
(3)除第一个元素外,序列中的,每个元素均只有一个直接前驱;
(4)除最后一个元素外,序列中的每个元素均只有一个直接后继。
- 线性表的存储结构
(1)线性表的顺序存储:指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。这种存储方式下,元素间的逻辑关系无须占用额外的空间来存储。
优点:可以随机存取表中的元素,按序号查找元素的速度很快;
缺点:插入和删除操作需要移动元素。
(2)线性表的链式存储(链表)
线性表的链式存储用节点来存储数据元素,元素的节点地址可以连续,也可以不连续,因此,存储数据元素的同时必须存储元素之间的逻辑关系。另外,节点空间只有在需要的时候才申请,无须实现分配,基本的节点结构:
数据域存储数据元素的值,指针域存储当前元素的直接前驱或直接后继元素的位置信息,指针域中所存储的信息称为指针或链,单链表节点中只有一个指针域。
Head指针不存储实际的数据元素,用于辅助数据元素的定位,方便插入和删除操作。
优点:链式存储结构下进行插入和删除,实质是对相关指针的修改,不需要移动元素;
缺点:只能顺序地访问元素,而不能对元素进行随机存储。
3.链表的类别
根据节点中指针信息的实现方式,有:
(1)单链表:包含两个域,一个信息域和一个指针域,这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值。
(2)双向链表:每个节点包含两个指针,分别指明当前元素的直接前驱和直接后继信息,可在两个方向上遍历链表中的元素。
(3)循环链表:表尾节点的指针指向表中的第一个节点,可从表中任意节点开始遍历整个链表。
(4)静态链表:借助数组来描述线性表的链式存储结构。
3.2.2 栈和队列
栈和队列与线性表逻辑结构相同,栈按“后进先出”规则进行操作(类似杯子喝水),队列“先进先出”规则进行操作(类似沙漏)。
1.栈:只能通过访问它的一端来实现数据存储和检索操作,按先进后出(FILO:First In Last Out)或后进先出(LIFO)规则进行插入删除操作。在栈中进行插入和删除操作的一端成为栈顶(Top),另一端成为栈底(Bottom)。
2.队列:是一种先进先出(FIFO:First In First Out)线性表,只允许在标的一段插入元素,而在标的另一端删除元素。允许插入元素的一端称为队尾,允许删除元素的一端称为对队头。
3.2.3 串
串是仅有字符构成的有限序列,是取值范围受限的线性表。
PS:2020年11月08日上午题选择题就考了线性表、栈、队列和串的概念题。
3.3 数组和矩阵
数组可看作是线性表的推广,其特点是多维数组的数据元素仍然是一个表。
从历年真题来看,本节考点为0,印象里有1道选择题是判断矩阵元素位置的有涉及到,应试来说可放弃本节内容,当然最好学一学,毕竟技多不压身。
3.4 树和图
3.4.1 树和二叉树
3.4.1.1 树
树是n(n≥0)个节点的有限集合,当n=0时称为空树,在任一非空树(n>0)中,有且仅有一个称为根的节点,其余节点可分为m(m≥0)个互不相交的有限集 T 1 , T 2 , … , T m T_1,T_2,…,T_m T1,T2,…,Tm,其中每个集合又是一棵树,并且称为根节点的子树。
树相关术语:
- 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点,如上图中B节点是E、F节点的双亲节点;
- 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点,如上图中B、C、D是A的子节点;
- 兄弟节点:具有相同双亲节点的节点互称为兄弟节点,B、C、D和E、F互为兄弟节点;
- 节点的度:一个节点含有的子树的个数称为该节点的度;
- 叶子节点或终端节点:度为0的节点称为叶子节点,如上图C、E、F、G;
- 非终端节点或分支节点:度不为0的节点;
- 树的度:一棵树中,最大的节点的度称为树的度;
- 节点的层次:从根开始定义,根为第1层,根的子节点为第2层,以此类推;
- 树的高度或深度:树中节点的最大层次,上图中树的深度为2;
- 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
- 有序(无序)树:若将树中节点的各子树看成是从左到右具有次序的,即不能交换,则称该树为有序树,否则称为无序树。
- 森林:m(m>=0)棵互不相交的树的集合;
3.4.1.2 二叉树
二叉树是n(n≥0)个节点的有限集合,它或者是空树(n=0),或者是由一个根节点及两颗不相交的、分别称为左子树和右子树的二叉树所组成,简单来说,就是度不超过2的树(节点最多有两个叉)。
树和二叉树的区别:
- 二叉树中节点的子树要区分左子树和右子树,即使在节点只有一颗子树的情况下也要明确指出该子树是左子树还是右子树,树种则不区分;
- 二叉树中节点的最大度为2,而树中不限制节点的度数。
二叉树的性质: - 二叉树第 i i i层( i ≥ 1 i≥1 i≥1)上至多有 2 i − 1 2^{i-1} 2i−1个节点;
- 深度为k的二叉树至多有 2 k − 1 2^k-1 2k−1个节点 ( k ≥ 1 ) (k≥1) (k≥1);
- 对任何一棵二叉树,若其终端节点数为 n 0 n_0 n0,度为2的节点数为 n 2 n_2 n2,则 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1;
- 具有n个节点的完全二叉树的深度为 ⌊ l o g 2 n + 1 ⌋ ⌊log_2^n+1⌋ ⌊log2n+1⌋&#x