绪论
掌握算法复杂度分析,包括时间和空间
分析递归算法复杂度
一、线性表
(一)线性表的定义和基本操作
插入 删除 查找
(二)线性表的实现
1.顺序存储
2.链式存储
各类操作的时间复杂度(尤其是单链表,双链表,循环链表…)
3.线性表的应用
其他操作受限的线性表:各类双端队列
输入受限或输出受限
会判断有某一输入序列,经过某种双端队列,能否得到某一输出序列(手动模拟)
二、栈、队列和数组
尝试数组和链表实现栈,队列,写出基本算法。
(一)栈和队列的基本概念
(二)栈和队列的顺序存储结构
(三)栈和队列的链式存储结构
(四)栈和队列的应用
队列:
各类缓冲区
需要先进先出地暂存数据的各类算法
栈:
递归系统栈:
中缀表达式转化为后缀表达式
按运算优先次序为中缀表达式的每一层添加括号
把每个右括号替换为该层相应的运算符,删去原运算符
删除左括号
后缀表达式求值
(五)特殊矩阵的压缩存储
三角矩阵 对称矩阵的顺序存储,熟练转换行列号和数组下标
稀疏矩阵的存储:三元组或十字链表
三、树与二叉树
(一)树的概念
树的表示方法
孩子表示法,双亲表示法(结构体数组)
二叉链表:可用于二叉树或一般树的孩子兄弟表示法
由同一二叉链表对应的二叉树和一般树(森林)的相互转化
数的相关术语和数学性质
度,深度,高度,路径长度……
n0=n2+1 第n层最多2^(n-1)个节点等
(二)二叉树
1.二叉树的定义及其主要特征
完全二叉树和满二叉树的定义和顺序存储
2.二叉树的顺序存储结构和链式存储结构
3.二叉树的遍历
前中后序遍历算法,包括递归版本和非递归版本
层次遍历算法
由中序遍历和其他任意一种遍历序列确定二叉树:前序/后序/层次确定根。中序确定左右子树。
4.线索二叉树的基本概念和构造
包括前序/中序/后序线索,给定二叉树能将其线索化
前序/中序线索二叉树可以不用栈实现非递归遍历,后续不能
(三)树、森林
1.树的存储结构
2.森林与二叉树的转换
3.树和森林的遍历
(四)树与二叉树的应用
1.二叉排序树
熟记定义:左子树任一节点< 根节点 <=右子树任一节点。等号位置/不等号方向可以改变
二叉排序数不一定能加速搜索:单支二叉排序树退化为顺序表
掌握插入,删除节点过程
给定一个输入序列,能构建二叉排序树
2.平衡二叉树
熟记定义:任一节点平衡因子绝对值不大于1
建立平衡二叉树过程中的平衡操作:R,L,RL,LR
3.哈夫曼(Huffman)树和 哈夫曼编码
掌握带权路径长度和的定义
给定一堆节点,能手动构造Huffman树
给定一颗Huffman树,能写出对应的Huffman编码
Huffman编码是一种前缀码,掌握前缀码的一般定义
四、图
(一)图的基本概念
有向图,无向图,边,弧,入度,出度(强)连通分量,路径……
(二)图的存储及基本操作
1.邻接矩阵法
2.邻接表法 逆邻接表法
3.邻接多重表(无向图)、十字链表(有向图)
给定图和给定邻接矩阵,邻接表的相互转化
(三)图的遍历
1.深度优先搜索
2.广度优先搜索
(四)图的基本应用
1.最小(代价)生成树
prim算法和kruskal算法
复杂度:O(n^2) vs O(ElogE)
2.最短路径
Dijkstra算法(单源) Floyd算法
复杂度 O(n^2)vs O(n^3)
Dijkstra 不允许负权边,Floyd允许负边权但不允许负权环
3.拓扑排序
画出路径树(森林)遇见多个选择的情况分叉
路径树从根到叶子的一条路径就是一个拓扑排序序列,叶子树就是拓扑排序序列数。
4.关键路径
五、查找
(一)查找的基本概念
平均成功查找长度,平均失败查找长度
对任何查找算法,用ASL的定义计算
(二)顺序查找法
适用于线性表
(三)分块查找法
(四)折半查找法
要求顺序结构
画出查找树
判断折半查找判定树
(五)B树及其基本操作、B+树的基本概念
熟记定义:B-树每个节点都包含数据项,B+树节点只是索引
熟悉B-树和B+数的查找过程
B-树的插入。删除过程
常见问题:高度为h的n阶B-树/B+树,最多/最少几个节点?
(六)散列(Hash)表
相关术语:散列表,冲突,堆积,装填因子……
常见冲突处理方法:开放定址(二次哈希)包括线性,平方……;拉链法
给定数据集和表长,能构造哈希表(按给定的散列函数和冲突处理方法),计算平均查找长度。
(七)字符串模式匹配 (KMP算法)
求next数组,包括优化版本
(八)查找算法的分析及应用
六、排序
(一)排序的基本概念
所有内部排序算法:
掌握排序过程,时间/空间复杂度,稳定性,使用情况。
选择第n大的数可以用修改版的快速排序
选出前n大的数可以用堆排序
(二)插入排序
1.直接插入排序
2.折半插入排序
(三)气泡排序(bubblesort)
(四)简单选择排序
(五)希尔排序(shellsort)
(六)快速排序
掌握轴枢划分算法
(七)堆排序
掌握建堆过程和删除堆顶后的调整过程
(八)二路归并排序(mergesort)
(九)基数排序
(十)外部排序
掌握多路归并,选择-置换算法,摆着树的思想