数据结构与算法
1. 线性结构
考点分析:线性表,顺序存储和链式存储,栈和队列原理,环形队列
1.1 线性表
线性表按存储方式分为顺序表和链表
- 顺序表:需要一段连续的内存空间来存放所有元素,这些元素在物理地址上是相邻的
- 链表:所有元素逻辑上是相邻的,在实际物理存储时处于不同的空闲块中,通过指针连接
1.2 顺序存储和链式存储
顺序存储和链式存储的对比:
- 空间方面,链表需要存储指针,因此有空间浪费存在
- 时间方面,当需要对元素进行破坏性操作(插入、删除)时,链表效率高;当需要对元素进行不改变结构操作(读取、查找)时,顺序表效率高
1.3 队列和栈
- 队列:先进先出,分队头和队尾
- 栈:先进后出,只有栈顶能进出
1.4 环形队列
环形队列时一个首尾相连的先进先出数据结构,采用数组存储,到达尾部时将转回到0位置,该转回是通过取模操作实现的(数组下标%MAXN),因此环形队列逻辑上是将数组元素q[0]与q[MAX-1]连接,形成一个存放队列的环形空间。为了方便读写还要用数组下标来指明队列的读写位置,其中head指向可以读的位置,tail指向可以写的位置
设环形队列数据结构定义如下:
typedef struct ringq
{
int head; //头部,出队列方向
int tail; //尾部,入队列方向
int tag; //标志位,队列空(head追上tail)置0;队列满(tail追上head)置1
int size; //队列总尺寸
int space[RINGQ_MAX];//队列空间
}
入队操作时,若队列不满,则写入如下语句:
q->tail = (q->tail+1) % q->size;
出队操作时,若队列不空,则从head处读出,下一个可读的位置在如下语句处:
q->head = (q->head+1) % q->size;
2. 树与二叉树
考点分析:树,二叉树的特点,二叉树的存储,二叉树的遍历
2.1 树
树结构是一种非线性结构,树中的每一个数据元素可以有两个或两个以上的直接后继元素,用来描述层次结构关系
2.2 二叉树
二叉树是n个结点的有限集合,它或者是空树,或者是由一个根结点及两棵互不相交的且分别称为左、右子树的二叉树所组成,与树的区别在于每个根结点最多只有两个孩子结点
三种特殊的二叉树:
- 满二叉树:每层都是满的
- 完全二叉树:k-1层是满的,且第k层结点从左到右是满的
- 非完全二叉树:除以上两种外
2.3 二叉树的存储结构
- 顺序存储:就是用一组连续的存储单元存储二叉树中的结点,按照从上到下,从左到右的顺序依次存储每个结点
- 链式存储:一般用二叉链表来存储二叉树结点,二叉链表中除了该结点本身的数据外,还存储有左孩子结点的指针、右孩子结点的指针,即一个数据 + 两个指针
2.4 二叉树的遍历
一颗非空的二叉树由根结点、左子树、右子树三部分组成,遍历这三部分也就遍历了整棵二叉树。这三部分遍历的基本顺序是先左子树后右子树,但根结点顺序可变,以根结点访问的顺序为准有三种遍历方式:
- 先序(前序)遍历:根左右
- 中序遍历:左根右
- 后序遍历:左右根
3. 图
考点分析:图的基本概念,图的存储,图的遍历
3.1 图的基本概念
图也是一种非线性结构,图中任意两个结点间都可能有直接关系。相关定义如下
- 无向图:图的结点之间连接线是没有箭头的,不分方向
- 有向图:图的结点之间连接线是箭头,区分A到B和B到A是两条线
- 完全图:无向完全图中,结点两两之间都有连线;有向完全图中,结点两两之间都有互通的两个箭头
- 度、出度和入度:顶点的度是关联与该顶点的边的数目。在有向图中,顶点的度为出度和入度之和。出度是以该顶点为起点的有向边的数目。入度是以该顶点为终点的有向边的数目
- 路径:存在一条通路,可以从一个顶点到达另一个顶点,有向图的路径也是有方向的
3.2 图的存储
- 紧邻矩阵:假设一个图中有n个结点,则使用n阶矩阵来存储这个图中个结点的关系,规则是若结点i到结点j有连线,则矩阵Rij=1,否则为0
- 邻接链表:用到两个数据结构,先用一个一维数组将图中所有顶点存储起来,而后对此一维数组的每个顶点元素,使用链表挂上和其有关系的结点的编号和权值
3.3 图的遍历
- 深度优先遍历:从任一顶点出发,遍历到底,直至返回,再选取任一其他结点出发,重复这个过程直至遍历完整个图
- 广度优先遍历:先访问完一个顶点的所有邻接顶点,而后再依次访问其邻接顶点的所有邻接顶点,类似于层次遍历
4. 算法的复杂度
考点分析:算法的时间和空间复杂度计算
算法复杂度分为时间复杂度和空间复杂度
- 时间复杂度:是指执行算法所需要的计算工作量
- 空间复杂度:是指执行算法所需要的内存空间
5. 算法分析方法
考点分析:递推和递归,分治法,回溯法,贪心法,动态规划法
算法是为解决某个问题而设计的步骤和方法,有了算法就可以据此编写程序。常用算法主要有迭代法、穷举搜索法、递推法、递归法、贪婪法、回溯法等
- 递推和递归:递推法是利用所解问题本身所具有的递推关系来求得问题解的一种算法。递推与递归法的关系是,任何可以用递推法解决的问题,可以很方便地用递归法写出程序解决;反之许多用递归法解决的问题不能用递推法解决
- 分治法:对于规模为n的问题,若不能很容易地解决,则可将其分解为k个规模较小的子问题,递归地解决这些子问题,最后将各子问题的解合并得到原问题的解
- 回溯法:系统地搜索一个问题的所有解或任一解,在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。搜索至任一结点时,总是先判断该结点是否肯定不包含问题的解,若不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯
- 贪心法:它所做的每一步选择只是当前步骤的局部最优选择,但从整体来说不一定是最优的选择
- 动态规划法:在求解问题中,对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃哪些不能得到最优解的局部解,每一步都经过筛选,以每一步都是最优解来保证全局是最优解
本文深入探讨数据结构包括线性结构、树与二叉树、图及其算法,解析算法复杂度与分析方法,覆盖栈、队列、遍历、图的存储与遍历等核心知识点。
9万+

被折叠的 条评论
为什么被折叠?



