线性表
1、顺序表和链表的比较
-
存取(读写)方式:链表只能从表头顺序存取元素
-
逻辑结构与物理结构:链表中,逻辑上相邻的元素,物理存储位置则不一定相邻,对应的逻辑关系是通过指针链接来表示的。
-
空间分配:链式存储的结点只在需要时申请分配,只要内存有空间就可分配。
-
查找、插入、删除操作:
查找:按值查找,顺序表无序时,两者的时间复杂度均为O(n).当顺序表有序时,顺序表可以才用折半查找,为O(log2n).
插入、删除:顺序表需要移动半个表长的元素。链表只需相关结点的指针域即可。
2、头指针和头节点的区别
3、堆的特点
堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
- 堆中某个结点的值总是不大于或不小于其父结点的值;
- 堆总是一棵完全二叉树。
将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。
堆是非线性数据结构,相当于一维数组,有两个直接后继。
4、逻辑结构与物理结构的区别
-
逻辑结构 :数据元素之间的关系(集合、线性结构、树形结构、图形结构)
-
物理结构:数据的逻辑结构在计算机中的存储形式(顺序存储、链式存储、索引存储、散列存储)
5、算法的五大特性:
- 有穷性、确定性、可行性、可无输入、必有输出
6、时间复杂度和空间复杂度
7、简述KMP算法
KMP算法是在简单模式匹配的基础上对串的模式匹配进行优化。
主要的思路是每趟比较过程中让子串先滑动到一个合适的位置。
当发生不匹配时,不同于简单模式匹配的右移一位,而是移动到适合的位置。
这里所移动的位置依靠与NEXT[]数组,求next[]数组的方法是比较前后缀相同元素。
8、栈和队列的区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S2wytus8-1651479649740)(C:\Users\东哥的电脑\AppData\Roaming\Typora\typora-user-images\image-20220323192610367.png)]
9、二叉树和度为2的树的区别
- 度为2的树不可为空树,结点数最低为3,至少有一个结点的度为2.
10、树的遍历
- 先跟遍历:先访问根结点,再从左到右先根遍历树的每一颗子树。
- 后根遍历:先依次后根遍历每颗子树,再访问根节点。
B树和B+树的区别,以一个m阶数为例
-
关键词的数量不同:
B+树中具有n个关键字的结点只含有n棵子树。每个结点关键字个数的范围是|m/2| <= n <= m
B树中具有n个关键字的结点含有n+1棵子树。每个结点关键字个数的范围是|m/2| -1<= n <= m-1 -
存储的位置不同:B+树中数据都存储在叶子结点上,也就是其所有叶子结点的数据组合起来就是完整的数据,但是B树的数据存储在每一个结点中。
-
分支结点的结构不同:B+树的分支结点仅仅存储着关键字信息和儿子的指针,也就是说内部结点仅仅包含着索引信息
-
查询不同:B树在找到具体的数值以后,则结束,而B+树则需要通过索引找到叶子结点中的数据才结束。
————————————————
图的存储结构
邻接表:(链式存储结构)由单链表的表头形成的顶点表,和单链表其余结点形成的边表两部分组成;一般顶点表存放顶点信息和指向第一个边结点的指针
邻接矩阵:(顺序存储结构)
有向图的十字链表法
无向图的多重链表法
生成树与最小生成树:
- 生成树:连通图的生成树是包含图中全部顶点的一个极小联通子图。
- 最小生成树:对于带权联通无向图,边的权值之和最小的生成树称为最小生成树。
Prim算法:
- 将V0到其他顶点的所有边当作侯选边,从侯选边中选择最小的边输出,并把该边的另一个顶点也并入树中
- 再以这个树,找到与这个树相接的边中最短的边。
kruskal算法:
- 每次选择权值最小的边,使得这两条边的两头连通,原本已经联通的就不选,直到所有顶点都联通。
11、拓扑排序
找到做事的先后顺序
- AOV网:有向无环图表示工程,顶点表示活动,有向边表示活动的先后顺序。
- 求拓扑排序步骤:从AOV网中找一个入度为0的顶点并输出,从网中删除该顶点和所有以它为起点的有向边。重复1、2步骤。
12、关键路径
具有最大路径长度的路径,其上的活动称为关键活动
- AOE网:有向无环图中,顶点表示事件,边表示活动,权值表示开销。
- 仅有一个入度为0的顶点,也仅有一个出度为0的顶点。
- 求关键路径步骤:求顶点事件的最早发生时间和最迟发生时间,求活动的最早和最迟开始时间,求所有的活动的差额,为0的为关键路径。
Dijkstra算法和Floyd算法的区别之处:
Dijkstra不能处理负权图,Flyod能处理负权图;
Dijkstra处理单源最短路径
Flyod是处理多源最短路径
Dijkstra时间复杂度为O(n^2)
Flyod时间复杂度为O(n^3) 空间复杂度为O(n ^ 2);
4.Floyd算法是一个经典的动态规划算法。Dijkstra是基于贪心策略的。
分块查找:
- 块内无序,块间有序。
- 建立一个索引表,索引表中包含每块的最大关键字和各块中第一个元素的地址。关键字有序排列。
折半查找:
- 只适用于有序的顺序表。
- 将给的key值与表中间元素比较,若大于中间元素,则在中间元素的后半部分继续比较。
13、哈希函数的构造方法:
将关键码的值通过哈希函数映射到表中的一个位置以加快查找速度。
- 直接定址法:取关键字的某个线性函数值作为散列地址。
- 除留余数法:对某个不大于表长但最接近或者等于表长的质数取余
- 数字分析法:选取数码分配均匀的若干位作为散列地址。
- 平方取中法:对关键字求平方,再取结果的中间几位。
14、哈希冲突的解决方法:
- 开放定址法:线性探测法、平方探测法、伪随机序列、再散列法
- 拉链法: 把所有同义词存储在一个线性链表中。
15、排序算法
内部排序包括:插入排序、选择排序、交换排序、归并排序、基数排序。其中插入排序包括:直接插入排序、折半插入排序、希尔排序;选择排序包括:简单选择排序,堆排序;交换排序包括:冒泡排序、快速排序。
(1)直接插入排序(稳定):基本思想为:将序列分为有序部分和无序部分,从无序部分依次选择元素与有序部分比较找到合适的位置,将原来的元素往后移,将元素插入到相应位置上。时间复杂度为:O(n^2),空间复杂度为O(1)
(2)折半插入排序(稳定):基本思想为:设置三个变量low high mid,令mid=(low+high)/2,若a[mid]>key,则令high=mid-1,否则令low=mid+1,直到low>high时停止循环,对序列中的每个元素做以上处理,找到合适位置将其他元素后移进行插入。比较次数为O(nlog2n),但是因为要后移,因此时间复杂度为O(n^2),空间复杂度为O(1)。 优点是:比较次数大大减少。
(3)希尔排序(不稳定):基本思想为:先将序列分为若干个子序列,对各子序列进行直接插入排序,等到序列基本有序时再对整个序列进行一次直接插入排序。优点是:让关键字值小的元素能够很快移动到前面,且序列基本有序时进行直接插入排序时间效率会提升很多,空间复杂度为O(1)。
(4)简单选择排序(不稳定):基本思想为:将序列分为2部分,每经过一趟就在无序部分找到一个最小值然后与无序部分的第一个元素交换位置。优点是:实现简单,缺点是:每一趟只能确定一个元素的位置,时间效率低。时间复杂度为O(n^2),空间复杂度为O(1)。
(5)堆排序(不稳定):设有一个任意序列,k1,k2,…,kn,当满足下面特点时称之为堆:让此序列排列成完全二叉树,该树具有以下特点,该树中任意节点均大于或小于其左右孩子,此树的根节点为最大值或者最小值。优点是:对大文件效率明显提高,但对小文件效率不明显。时间复杂度为O(nlog2n),空间复杂度为O(1)。
(6)冒泡排序(稳定):基本思路为:每一趟都将元素进行两两比较,并且按照“前小后大”的规则进行交换。优点是:每一趟不仅能找到一个最大的元素放到序列后面,而且还把其他元素理顺,如果下一趟排序没有发生交换则可以提前结束排序。时间复杂度为O(n^2),空间复杂度为O(1)。
(7)快速排序(不稳定):基本思路为:**在序列中任意选择一个元素作为中心,比它大的元素一律向后移动,比它小的元素一律向前移动,形成左右两个子序列,再把子序列按上述操作进行调整,直到所有的子序列中都只有一个元素时序列即为有序。**优点是:每一趟不仅能确定一个元素,时间效率较高。时间复杂度为O(nlog2n),空间复杂度为O(log2n).
(8)归并排序(稳定):基本思想为:把两个或者两个以上的有序表合并成一个新的有序表。时间复杂度为O(nlogn),空间复杂度和待排序的元素个数相同。
(9)基数排序:时间复杂度为:对于n个记录进行链式基数排序的时间复杂度为O(d(n+rd)),其中每一趟分配的时间复杂度为O(n),回收的时间复杂度为O(rd)。