原文请戳2022年中科院信工所二室考研杂记__Melody~的博客-优快云博客
1,常见的数据结构有哪些
从逻辑角度看有
1)线性结构:线性表、栈、队列、数组(是线性表的推广)
2)非线性结构:树、图、集合
2,数组(顺序表)和链表的区别
1)存取方式:顺序表可以随机存取也可顺序存取;链表只能顺序存取(最重要)
2)空间分配:顺序表可以静态分配和动态分配;链式存储随意分配
3)逻辑结构和物理结构:顺序表逻辑上相邻物理上也相邻;链式分配逻辑相邻物理上不一定相邻
3,常用链表有哪些
1)单链表
2)双链表:设置一头一尾两个指针
3)循环列表:有循环单链表和循环双链表
4)静态链表:用下标表示下一个结点(要分配连续的空间)
4,什么是平衡二叉树
二叉树上任意结点的左子树和右子树高度之差不超过1
5,简述KMP算法
在主串和模式串匹配时,主串指针一直往前不回溯,模式串指针回溯,回溯的位置保存在next数组中,可以避免无效的比较。
模式串、主串长度分别为m和n,时间复杂度为O(m+n)
若不使用KMP算法,时间复杂度是 O(m*n)
KMP的改进:若这个不匹配的字符是g 对应的next也指向g,则可以直接跳到最终指向的位置。引入了nextval数组
6,贪心算法、动态规划和分治法的区别
1)贪心算法:在每一步都按照一定策略选择当前的最优解,最后得到的结果不一定是最优解。
2)分治法:将一个大的问题划分为多个相互独立的子问题,来各个求解。
3)动态规划:相当于将分治法中重复的子问题的结果保存起来,再次出现时,直接使用。是一种用空间换时间的算法。
7,快速排序的改进
快速排序是典型的分治法,对于一个序列,选择一个元素作为基准元素,比他小的移到左边,比他大的移到右边,每轮确定一个元素的位置,然后对子序列进行相同操作。
时间复杂度O(nlogn)
最坏情况是原序列有序 回到O(n^2)
优化方法:因为每次选序列第一个元素作为基准,可能导致比较次数过多,所以用“三数取中”的方法,取一个序列的第一个,中间的,最后一个元素中中间值作为基准。
8,循环比递归效率高吗
一般情况下,循环的效率更高,因为递归要用到栈,开辟新的空间,且会有很多的重复计算。
9,图的遍历和树的遍历有什么区别
树是一种特殊的图
树中的层次遍历就是BFS
树中的先中后序遍历就是DFS
10,数据的逻辑结构有哪些?物理结构有哪些
逻辑结构见上
物理结构有顺序结构和链式结构
11,算法的五个特征
答:
有穷性:算法必须在执行有限的步骤后结束
确定性:对于相同的输入,结果必须是确定的
可行性:算法由基本操作执行有限次实习
输入:一个算法必须有0个或者多个输入
输出:一个算法必须有0个或者多个输出
12,头指针和头结点的区别?
头指针表明了链表存储空间的起始位置,是必须有的;头结点是为了方便编程而定义的一个不带信息的结点,对有带头指针的链表,头指针指向头结点,对不带头指针的非空链表,头指针指向第一个元素。
13,最小生成树是什么?
生成树:包含图的所有顶点,含尽可能少的边的连通图
最小生成树(MST)是带权路径之和最小的那颗生成树
求MST的算法有Prim算法(每次选择一个和当前集合最近的结点加入)和Kruskal算法(使用并查集)
14,深度优先搜索和广度优先搜索
BFS:从某一结点出发,访问此结点未被访问过的所有邻接结点,再用同样规则访问这些结点,直到遍历完成(使用队列实现)
DFS:从某一结点出发,访问与其邻接的任一结点,再从这一结点开始访问,若不能继续向下访问,则退回上一个结点。(使用栈实现)
15,什么是并查集
分为并和查两个操作,用一个数组保存每个元素的父节点,初始为-1
并:是将此结点的父节点该为目标根节点
查:找到这个结点的根节点
应用:kruskal算法,先将所有边的权值递增排序,然后依次看这个边的结点在不在当前并查集中,若不在的话,则选中此边并且加入并查集。