数据结构
线性表
1.一般线性表-逻辑结构相邻
顺序表-逻辑物理结构均相邻
静态顺序表
动态顺序表
链表-逻辑结构相邻但物理结构不相邻、指针
单链表
双链表
循环链表:循环单链表、循环双链表
静态链表
应用-OS的FAT
动态链表
2.带有特别要求的增删改查的线性表
除操作不同与一般线性表一样,可顺可链
1.队列-FIFO先进必先出
应用:
1.树的层次遍历
2.图的广度优先遍历
3.OS的进程先来先服务FCFS;打印机啊,等等
分类:
1.一般队列
2.循环队列
3.双端队列
2.栈-LIFO后进可选择先出
我觉得吧,LICFO更适合,后进可选择(前提在栈顶)先出。
应用:
1.括号匹配
2.表达式求值运算;阶乘、斐波那契数列等等
3.函数调用的递归栈
分类:
1.顺序栈
2.共享栈
3.链式栈
3.矩阵---一般顺序存储---逻辑上也非线性
存储先后寻址问题
行优先:地址=loc+(i*N+j)*size
列优先:地址=loc+(j*M+i)*size
可压缩:
1.一般稀疏矩阵的压缩
三元组:行值、列值、值
十字链表法
2.一维数组存储
2.1对称矩阵---每行个数呈递增数列
2.2泛上||下三角矩阵,泛就是常数c-每行个数呈递增数列
2.3三(带状)对角矩阵---i、j差值小于1
4.串
一维数组存储
1.模式匹配算法(暴力)
2.KMP-j
辅助:
一个一维数组
模式串对应位置的数组值为模式串的j指针
不匹配时候赋值,j=next[j]
3.KMP进一步优化算法---前提是模式串有重复的字符常量
j的进一步优化
失配时,j=next[j],且两个序号对应字母相同,它们的val值连坐。
辅助:
两个一维数组
应用:
搜索文件、模糊搜索
非线性表
5.树、森林
1.一般情况用链式存储
2.点表+邻接表或者邻接矩阵
二叉树:
按完全二叉树的层次编号可用顺序表存储
一般情况用链式存储
1.树的分类、存储及性质
考点
2.树的操作
由1决定下列操作特征
2.1二叉树不同遍历搜索
先、中、后、层、深
2.2二叉树不同遍历序列、及由遍历序列还原(构造)二叉树
先、中、后、层、深;任何一个(先、后、层)+中还原唯一二叉树
2.3线索二叉树的遍历、及二叉树的线索化
不断找前驱直到null开始遍历;根据选择的遍历方法按左前驱右后继原则线索化。
2.4树和森林的转化、树和森林的遍历比较
森林、树转化为二叉树原则:左孩子右兄弟
2.5二叉排序树的遍历搜索、构造二叉排序树
左<根<右,先序遍历有序
2.6平衡二叉树的构造、平衡二叉树的平衡操作(可以与二叉排序树结合为平衡二叉排序树分类)
2.7哈夫曼树的特征、哈夫曼树的构造
根据其特征可以:使用最小堆构造哈夫曼树
根的值=其左子树叶子结点的和值+右子树的;
因此其到达叶子结点的路径不可能存在值相等的结点
2.8堆(完全二叉树)的特征、堆的构造
小根堆(根<=左,且<=右)
大根堆(根>=左,且>=右)
=是因为有相同的关键值情形,不过我们需要保证一直偏左或者偏右保证其稳定性不会改变
顺序表存储,然后从叶子开始比较交换排序思路
有重复的关键值怎么办?在此停留让他们交换完毕
因为其是二叉树树:删除某个结点,则将整个树的最右叶子结点补过去,之后矫正。
3.树的应用:
1.树形目录
2.图的最小生成树
遍历、构造结合了:
栈、队列、递归
6.图
1.点表+邻接表(不唯一)或者邻接矩阵(唯一)
2.十字链表
3.邻接多重表
点集不可空,边集可空
1.图的相关概念
有向图
无向图(环)
子图
连通问题:会考边数,即组合数问题
连通图(环):连接的各个点均可从任一点开始到达其他点。
连通分量(环):极大连通子图(有向图不一定有连通分量);多少个连通分量就是多少棵生成树。
强连通分量:有向图中的极大强连通子图
生成树:极小连通子图(无回路,区别回路和环)
完全图(环):线条数为两两组合(排列-有向)的组合数(排列数)。
有向无环图DAG
度:入度、出度
简单回路(除却起点终点,其他顶点不重复)对应简单路径
回路对应路径。
2.图与树的关系
1.生成树
生成树也是图,是子图,因此树是图的一种有向无环图
3.图的操作
1.BFS与DFS生成树、森林
2.最小生成树
3.最短路径算法
4.有向无环图---三类应用
可以把树看作图的中有向图中的一类。
生成树的要求不需要无环;
有向无环图之拓扑排序---要求无环,矩阵存储类上三角或下三角;
7.查找---增删改查重点工程
1.一般查找
2.B树查找与B+树查找
B+树叶子结点间有指针连接;
m阶的意义也不一样,与结点内的关键字个数限制不同,相同计算有向上取整;
3.散列查找
多个不同的散列函数,重复切换散列直至不冲突
Hi=RHi(key), i=1,2,…,k. RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间;
8.排序-内部与外部排序
内部排序:
对N个记录进行归并排序,归并趟数的数量级是O(NlogN)。
r代表纵向深度
绝对有序是对最终结果而言,相对是对本身而言
动态规划:弗洛伊德算法(多点最最短路径)
分治思想:二叉树的中序遍历
外部排序:原理同归并排序(n个有序数组的归并)
进入的归并段的数量(k路)决定趟数,而归并内、间最开始都是两两元素归并,输入缓冲区与输出缓冲区(决定读写次数)有限制,所以意味着有最优方案:败者树,优化选择最小值
败者树就是一开始(构造堆)时间长,后面的短且一样,类似指令流水。
时间分析:内部排序时间相对较小忽略了
哈夫曼树:磁盘读取总次数=WPL*2;
归并趟数=log(k,r)上取整;k路归并、r个归并段;
(这个趟数是对N个记录,不是对缓冲区而言)
败者树深度=log(2,k)上取整;
归并段数量r=N/L上取整,N代表总记录大小,L代表工作区大小
败者树用于输出选择、与置换算法相结合进一步优化
因为工作区的限制,所以不能随意定归并段大小不能随意:
构造哈夫曼树有补0操作:补的个数为%(k-1)