本章重点:数据结构相关名词术语的含义。难点:时间复杂度的估算。
数据:是客观事物的符号表示。能被输入到计算机中被程序处理的符号的总称。 数据元素:也称顶点,结点或记录。数据的基本单位。 数据项:最小单位。 数据对象:性质相同的数据元素集合。 数据结构:带结构的相同性质数据元素集合。结构是一种或多种关系。
以上不知道怎么背,随便过过吧。
逻辑结构=数据元素+关系。 四类基本结构:
线性结构:一对一,如线性表,栈和队列,字符串,数组,广义表树结构:一对多图/网状结构:多对多集合结构。后三个是非线性结构。(即四类中除了线性结构的)
两种存储结构:顺序存储(数组),链式存储(结构体和指针)。 差别: 顺序存储:相邻位置表示元素逻辑关系。 链式存储:指针信息表示元素逻辑关系。
算法: 五特性:有穷,确定,可行,输入,输出。 优劣标准:正确性,可读性,健壮性,高效性。
时间复杂度:一般是最深层循环内的语句频度。
两个没什么用的表:(?)
重难点:顺序表和链表。
概念:非空的线性表或线性结构是一个有限数据元素的有序集合。 特点:存在唯一一个第一个,最后一个数据元素;每个数据元素只有一个前驱(除第一个)和后继(除最后一个)。 存储:连续地址。是随机存储结构。
线性表 线性表的一些操作: GetElem: i是位置。注意特判范围。第1个存在0号位,故取值要i-1;
if(i=L.length) return ERROR;e=L.elem[i-1];LocateElem:存在就返回位序,不存在就返回0; 地址从0开始,位序从1开始。故return i+1;
for(int i=0;i左->右![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f62cb4c59ea6d61fd138975f3b46b8dd.png)
中序遍历:左->根->右 树上的结点都掉下来了
后序遍历:左->右->根
重要结论 若二叉树中的各结点的值均不同,则任意一颗二叉树的先、中、后序序列是唯一的。 先+中 或 后+中 可以唯一确定二叉树。
哈夫曼树 最优树,一类带权路径长度的最短树。
从这里学习WPL的计算方法:权值*路径长度(或者说这一层的层数) 之和。 易得:大的要近,小的要远,这样WPL就会最小。 一个哈夫曼树的生成: W={5,6,2,7,9}; 先排序:W={2,5,6,7,9}; W={6,7,7,9}; W={7,13,9};
编码的两种形式 等长:易于译码。但长度长。 不等长:不易于译码,但长度短。
哈夫曼树是不等长的二进制编码,也是最优前缀编码。
如: W={43,14,29,14}; 左0右1: 哈夫曼编码树中,若叶子结点个数为n,则总结点为2n-1。
重点:图的两种存储结构和构造算法,不同存储结构的特点和使用场合。 图的两种遍历算法:DFS,BFS。
图分为有向图和无向图。 有向完全图:n(n-1) 无向完全图:n(n-1)/2 稀疏图:边的个数小于nlog2n; 度:出度+入度(有向图); 简单路径:序列中顶点不重复出现的路径。 简单回路:除第一个和最后一个相同,其他不重复。 连通图:任意两个顶点之间联通。
强连通图:有向图中任意两个顶点之间都存在一条有向路径。 否则,它的各个极大强连通子图称为它的强连通分量。
邻接矩阵 无向图的邻接矩阵为对称矩阵; 其实就是在有边的地方放1:
特点:
有向图的邻接矩阵:也是有边的地方1 特点:
网的邻接矩阵 有边就放权值,否则为无穷大。
邻接矩阵的缺点
不便于增删结点不便于统计边的数目,要扫描整个矩阵,时间复杂度为O(n^2)对稀疏图很浪费空间邻接表 连接的是出度,一般(地址)从小到大。
无向图: 特点:
有向图: 特点:
逆邻接表 连的是入度。 画网络
邻接表特点
图的遍历:DFS和BFS
DFS: 访问顶点,若它的邻接点未被访问,则从它出发进行深搜:
求DFS: 别拉太下,答案要出来啦!
效率分析: 邻接矩阵O(n^2);适合稠密图。 邻接表O(n+e);稀疏图。
BFS: 用队列实现的一层层的,广度优先搜索。 从V0出发,依次访问V0的所有未被访问的邻接点,之后按它们被访问的先后次序访问它们的邻接点。 例题:
注意这里67都是3后的!
14325
效率分析: 邻接矩阵O(n^2); 邻接表O(n+e);
DFS VS BFS
空间复杂度相同,O(n);时间复杂度与存储结构(邻接矩阵/邻接表)有关,与路径无关。最小生成树
prim算法: 取图中任意一个顶点作为生成树的根,之后往生成树上添加新顶点w。在添加的顶点w和已经在生成树上的顶点v之间必定存在一条边,且该边的权值在所有连通vw的边中最小。 称为加点法。
克鲁斯卡尔算法: 为了使生成树上的边的权值之和达到最小,则应使生成树中的每一条边的权值尽可能地小。 从最小的边开始。给边排序,从小到大,找每一个没放入的点存在的最短边放入即可。 如:
两种算法的比较:
记法:克鲁斯卡尔是后学的,所以肯定时间更快…
最短路径:迪杰斯特拉 按照各条最短路径长度递增的次序产生最短路径。
图解 所以一开始的点是随便选的(源点),算出的路径是目标点到源点的距离 时间复杂度是O(n^2);
第七章 查找重难点:
顺序表或有序表表示静态查找表时的查找方法、二叉排序树的查找方法。二叉排序树的查找方法、散列表的查找方法各种表示方法的适用点和适用场合。查找表:由同一类型的记录构成的集合。
静态查找表:查询或检索动态查找表:查询、检索、插入或删除关键字:用以标识一个记录。可识别唯一记录的是主关键字。 如身份证号是主关键字,姓名是次关键字。
线性表的查找
顺序查找折半查找顺序查找:从头找
int Search(int a[],int e){for(int i=1;i