绪论
数据结构的定义
相互之间具有一种或多种特定关系的数据元素的集合
逻辑结构
数据元素之间的逻辑关系。
- 线性结构(顺序表)
- 非线性结构(树,图,集合)
物理结构
数据结构在计算机中的表示。
- 线性存储
- 链式存储
- 索引存储
- 散列存储
线性表
线性表的定义
具有相同数据类型的n个数据元素的有限序列
线性表的种类
- 数组
- 链表
- 栈
- 队列
数组与链表的区别
- 存储结构
- 存取方式
- 增删改查
- 内存分配
给一个链表,如何确定有环
遍历链表,看尾指针是否指向头节点
链表逆置
头插法
单链表快速找到中间节点
双指针,一个一次2个节点,一个一次1个节点
头节点与头指针
- 头指针:指向链表第一个节点的指针
- 头节点:第一个元素节点之前的节点,便于各种操作
栈和队列
循环队列的栈满和栈空
- 牺牲一个节点
- 设置length
- 设置tag,表示上一次操作是插入还是删除
栈与队列的区别
- 栈只能从一端插入和删除
- 队列只能从一端插入,从另一端删除
为什么需要循环队列
利用循环数组,可以避免假溢出的情况。
假溢出:随着元素插入,指针到达被分配空间的最后一个节点,随着元素删除,头节点之前有空的空间。
树与二叉树
二叉树的定义
每个节点最多有两个子树,且两个子树之间有左右之分
二叉树的遍历
先序遍历:如果根节点不为空,输出根节点,先序遍历左子树,先序遍历右子树
树的存储结构
双亲表示法:链式存储 孩子表示法:邻接表 孩子兄弟表示法:链式存储
满二叉树
除了最后一层无任何节点外,其余层的所有节点都有两个子树
最小生成树
连通图的极小连通子图。可以使用Prim或者Kruskal算法
二叉树和节点只有两个孩子的树的区别
- 二叉树可以是空树,每个节点最多有两个子树,且子树有左右之分
- 只有两个孩子的树,子树没有顺序之分。
如何对树进行层序遍历
二叉排序树、平衡二叉树
- 二叉排序树,对于任意一个节点,满足该节点左子树的所有节点小于该节点,该节点右子树的所有节点大于该节点,且该节点的左右子树也为排序二叉树。
- 平衡二叉树,左右子树高度之差不超过1
二叉平衡树调整
一般有四种调整方法:
- LL:左节点的左子树插上新的节点,进行一次右旋
- RR:右节点的右子树插上新的节点,进行一次左旋
- LR:左节点的右子树插上新的节点,一次左旋,一次右旋
- RL:右节点的左子树插上新的节点,一次右旋,一次左旋
哈夫曼树及其作用
- 由n个带权叶子节点构成的所有二叉树中带权路径长度最短的二叉树。
- 哈夫曼编码
最优二叉树
哈夫曼树
构造huffman编码
- 统计字符出现频率
- 构造哈夫曼树
- 对哈夫曼树进行编码
二叉排序树如何增删
- 插入:若当前结点不为空,若要插入的值小于当前结点的值,则向左子树遍历,否则向右子树遍历。若当前结点为空,则将该值置于当前结点
- 删除:若删除的是叶子结点,直接删除。若删除的是非叶子结点,则用右子树的最左下角的结点 或者 左子树的最右下角的结点进行替换。
树和堆的区别
树是不包含回路的无向连通图。 堆是一种特殊的二叉树,双亲结点的关键字大于等于(或者小于等于)孩子结点。
图
图的定义
图是由边集和点集组成。
图的存储结构
邻接表、邻接矩阵、十字链表、邻接多重表
邻接矩阵如何存储
假设有N个结点,用NxN的矩阵表示图,第i行第j列的元素表示从第i个结点到第j个结点是否有边
图的遍历和树的遍历
图的遍历和树的遍历都是对其本身所有结点进行一次访问。 图的遍历:深度优先遍历,广度优先遍历 树的遍历:先序遍历,中序遍历,后续遍历
BFS和DFS的时间复杂度
用邻接矩阵都是,用邻接表都是
BFS和DFS的区别
BFS:队列,在开始其他节点之前,必须充分探究当前节点 DFS:栈,一旦发现为探索节点就会继续深入
N个节点的二叉树的最小生成树有几条边
N-1
最小生成树的两种算法
- prim,,适合稠密图,每次选取与当前生成树连接的最短的边
- kruskal,,适合稀疏图,每次选择一条最短且不成环的边
dijkstra算法
每次从还未选择的节点中选择路径最短的节点,根据新加入的节点迭代到剩余节点的距离
Floyd算法
遍历每对节点,如果以某个节点作为中间节点能获得更短的最短路径,则更新该对节点的最短路径长度
Dijkstra和Floyd算法的不同
- Dijkstra算法:求解单源最短路径算法,贪心算法
- Floyd算法:求解每对顶点之间的最短路径问题,动态规划
强连通图和连通图的定义。非连通图怎么遍历
- 强连通图:有向图的任意两个顶点都连通
- 连通图:无向图的任意两个顶点都连通
- 非连通图的遍历:用遍历算法遍历所有的连通分量
什么图可以使用拓扑排序
有向无环图
n个节点的无向连通图最多和最少边数
最少n-1,最多(n-1)*n/2
什么是AOE网,什么是关键路径,什么是关键活动
- AOE网:Activity On Edge,用有向图的边表示活动的图
- 关键路径:从原点到汇点,具有最短路径长度的路径
- 关键活动:关键路径上的活动
- 关键路径存在条件:有向无环图
查找
二分查找
要求表中的元素升序排列,每次将待查找关键字与表中间位置的关键字进行比对。
- 如果相等,则中间位置就是待查找关键字的位置
- 如果小于中间位置的关键字,则在左边的子表中继续二分查找
- 否则在右边的子表中继续查找。
- 直到字表不存在
折半插入的高效方式
二叉平衡排序树
哈希表
- 定义:根据关键字而直接访问的数据结构。
- 特点:速度快,会产生冲突
- 构造哈希函数的方法:直接定址法,平方取中法,除留余数法
- 冲突:相同关键字被映射到同一个位置
- 解决冲突:开放定址法(二次聚集),链地址法(占用存储空间),再哈希法(提高计算量)
什么数据结构能够快速通过学号查找信息
哈希表
开放定址法删除元素
只能标记,不能真的删除,否则会引起查找错误
排序
快排
- 原理:每次选择一个枢轴变量,比枢轴变量小的放在左边,比枢轴变量大的放在右边,然后对左右子表也进行快速排序
- 时间复杂度:当成二叉树计算
怎么选择排序算法
- n小:插入排序
- n大:堆排序
- 基本有序:冒泡
- 快速排序
稳定排序
元素的大小相对位置不会因为排序而改变,在一些原本按照某些关键字排序的情况下有优势,比如在原本是按时间排序的基础上进行价格排序,不会出现价格相等而时间乱序的情况。
冒泡排序什么时候比较的次数最大
逆序
排序算法
选择排序
插入排序
冒泡排序
希尔排序:按照一定的下标增量分组,分组内使用插入排序
快速排序
堆排序