上午 10’ 下午15‘
数据结构
数组与矩阵(★★)
数组
主要考察数组地址的计算
- 一维数组 a[n] :a[i]的地址为 a+i*Lenth
- 二维数组 a[m][n] : 储存方式分为 按行优先 和 按列优先
稀疏矩阵
考察将上下三角矩阵有效元素存储进一维数组,求元素统一通式
- 上三角矩阵
- 下三角矩阵
线性表(★★★★★)
顺序表 - 数组
链表 - 单/双/循环链表
链表的基本操作 - 插入 & 删除
顺序存储与链式存储的比较
空间 :顺序更优,节省空间
操作 :链式更优增删,数组更优改查
队列与栈
队列是先进先出,栈是先进后出
eg.元素a、b、c按次序入栈,求所有可能的出栈顺序?(没有规定出栈顺序,所以前面的元素可以在后面的元素进去之前出去)
cba,bca,bac,abc,acb 六种
广义表(★★)
- 广义表是n个元素组成的有限序列,是线性表的推广
- 通常用递归的形式进行定义,记作LS. 其中LS是表名,ai是元素,它可以是表,也可以是数据元素,n是广义表的长度,而递归定义的就是广义表的深度,直观的说就是定义括弧的重数。
- 表头 :首元素; 表尾 : 除表头外剩余的元素部分。
- 基本运算 : 取表头head(Ls)和表尾tail(Ls)eg. LS1 = (a, (b, c), (d, e)); head(LS1) = a, tail(LS1) = ((b, c), (d, e));
eg1. 有广义表LS1 = (a, (b, c), (d, e)), 则其长度和深度分别为 ? 3 & 2 三个子表,两层括弧
eg2. 有广义表LS1 = (a, (b, c), (d, e)), 要将其中b字母取出,操作步骤为? head(head(tail(LS1)))
tail(LS1) -> ((b, c), (d, e)) -> head -> (b, c) -> head -> b
树与二叉树(★★★★★)
二叉树(binary tree):是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树
关键词解
- 节点的度 :节点的分叉数
- 树的度 :指树中所以结点的度数的最大值。如图为 3
- 叶子节点 :没有子节点的节点
- 分支节点 :有入度和出度的节点
- 内部节点 :非叶子节点
- 父节点 :有子节点的节点
- 子节点 :没有子节点的节点
- 兄弟节点 :同一个父节点的所有子节点
- 树的层次or深度 :如图,3 层
重要特性
- 满二叉树 :所有节点的度都是 2。
- 完全二叉树 :从左到右,有右节点一定有左节点;而有左节点不一定有右节点
- 非完全二叉树 :不连续,或者有右节点没有左节点。
二叉树遍历
- 前序遍历 :根左右 12457836
- 中序遍历 :左根右 42758136
- 后序遍历 :左右根 48752361
- 层次遍历 :从上往下,从左到右 12345678
反向构造二叉树 - 必须知道中序遍历
eg.有前序遍历 ABHFDECG, 有中序遍历HBEDFAGC,求二叉树。
树转二叉树
将一普通的结构树转化成二叉树
孩子节点 - 划分到左子树
兄弟节点 - 划分到右子树节点
查找二叉树
二叉排序树, 左孩子小于根,右孩子大于根
- 节点插入 :
a. 若插入的数据已经存在,则不允许插入
b. 若查找二叉树为空树,则以新的节点为查找二叉树
c. 将要插入的值与插入后父节点的键值作比较,就能确定左右 - 节点删除 :
a. 若节点是叶子节点,则直接删除
b. 若待删除节点只有一个子节点,则将这个节点替换成该子节点
c. 若待删除节点p有两个子节点,则在其左子树中寻找最大的节点s,用s的值代替p的值,若节点s也有子节点,则规则循环。
最优二叉树 - 哈夫曼树
考查 带权路径长度 哈夫曼树的构造
权 :编码。 权值越高,访问频率越高
树的路径长度 :在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
带权路径长度 :节点权值*路径长度
树的带权路径长度 :树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL
编码规则 :左路径为0, 右路径为1
哈夫曼树的构造规则 : 假设有n个权值,则构造出的哈夫曼树有n个叶子结点, 哈夫曼树并不唯一,但带权路径长度一定是相同的
参考一篇别人的总结哈夫曼树的构造
线索二叉树
概念 :在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。即在每个节点里面加入连接的前后节点信息
平衡二叉树
任意节点的左右子树深度差不超过 1
图(★★)
- 完全图 :在无向图中,每一个顶点之间都有一条边相连,称为完全图; 在有向图中,每一个顶点之间都有二条有向边相连,称为完全图
- 邻接矩阵 :。。。
- 邻接表 :。。。
- 图的遍历 :深度优先 / 广度优先
- 拓扑排序
- 图的最小生成树
算法
-
分治法 :分解 -> 解决 -> 合并 一般用遞歸的方式解決
經典問題 :斐波那契數列 歸并排序 快速排序 矩陣乘法 二分查找 大整數乘法 漢諾塔 -
回溯法 :试探 (迷宫问题) 系統的搜索一個問題的所有解或任意解
經典問題 :N皇后問題 迷宮 背包問題 -
贪心法 :在当前总是最优选择,一般可以快速得到一个部分最优的解,但不是全局最优解
經典問題 :背包問題 多機調度 找零錢問題 -
动态规划法 :分解 -> 找到全局最优解 劃分子問題,將子問題的結果用數組存儲,利用查詢子問題結果構造最終問題結果。
經典問題 :斐波那契數列 矩陣乘法 背包問題 LCS最長公共子序列問題
排序与查找(★★★★★)
補。。。。
时间复杂度与空间复杂度(★★★★★)
O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n)
- O(1) : 常數級
- O(log2n) :樹型
- O(n) :一重循環
- O(nlog2n) :重構堆
- O(n2) :雙重循環
- O(n3) :三重循環
- O(2n) :
算法基础以及常见算法(★★★★★)
補。。。。(每年考題都不一樣)
算法时间复杂度比较 :
具体实现各不相同
a.快速排序 :不稳定,相等值会对排序产生波动
选择无序数组中的任意一个位置值作为key,分别从左右端点位置开始,将小等于key的值放在key左边,将大等于key的值放在key右边,采用递归,直到所有的区间数都比较完毕。
b.冒泡排序 :
可以自己选择升序或者降序,逐一比较, 每一轮遍历都产生一个最大值或者最小值
c.插入排序 : 适用元素较少的序列,最好是有序数列
从第一个基数开始,将当前元素与已经遍历过的元素数组进行比较插入,直到所有元素遍历完成。
d.归并排序
将相邻两元素两两组成数组,组内排序,再将两两数组进行排序。
e.选择排序
将当前元素和剩余待排序元素组内的最小/大元素进行交换。
f.希尔排序
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
g.堆排序