高频八股
线代的特征值,线性相关,概统的贝叶斯,中心极限定理,计网的TCP,UDP,操作系统的进程与线程等等
专业课AI
数据结构
树、图、查找、排序
>> 1.什么是数据结构?三要素?
数据结构是相互之间存在一种或多种关系的数据元素的集合(其实就是要怎么选择合适的方式表示这些数据吧)
三要素:逻辑结构(线性、非线性)、存储结构(链式、顺序)、数据的运算
>> 2.哈希表?栈和队列?
- 哈希表
是通过键🔑直接访问值得数据结构,实现 O ( 1 ) O(1) O(1)查找插入删除 - 栈
是先进后出得数据结构,像是个容器,底下是封闭的 - 队列
是先进先出得数据结构,是像消化道,头尾都敞开的,队头删除、队尾插入
>> 2.常见的排序算法
- 插入排序(e.g.整理麻将牌):
就是从前往后,每往后拿一个放到排好的里面,都要保证码好的牌顺序正确,挺麻烦的
⏱️时间复杂度: O ( n 2 ) O(n^2) O(n2)稳定 - 冒泡排序(e.g.比奇堡比高矮):
从头到尾,依次两两比较大小,大的往后挪,每一轮会下沉冒出一个最大值到最后。
⏱️时间复杂度: O ( n 2 ) O(n^2) O(n2)稳定 - 选择排序(从前往后排最小的):
每轮找出剩下里面最小的往前放
⏱️时间复杂度: O ( n 2 ) O(n^2) O(n2) - 快速排序(e.g.外国人的魔性快排舞蹈、正经快排过程):
每次都选轴点pivot,有双指针一头一尾,先从尾巴开始找,直到找到轴点的数小的,二者换位置,再从头找直到找到比轴点大的,就这么一直左右切换,直到左右指针相遇。然后在轴点的前面继续重复,后面继续重复(这里的下一轮过程记得注意一下。)
⏱️时间复杂度: 最好/平均 情况 O ( n log n ) O(n \log n) O(nlogn),最坏也是 O ( n 2 ) O(n^2) O(n2)
缺点:不稳定,坏:两边不平衡每次只能划出一个元素 - 希尔排序(e.g.希尔演示过程):
shell发明的,很简单,就是分很多组,排序总个数/2/4/…。直到1,前面排过之后,1的时候就很快了。有一个步长的概念
⏱️时间复杂度: 很不稳定 - 归并排序(两个排好的序列很好合并):
分治思想,其实就是把序列一直切分到最细,然后两两排,往上合并
⏱️时间复杂度: O ( n log n ) O(n \log n) O(nlogn)稳定
缺点:空间复杂度高 - 堆排序:
利用完全二叉树,然后每次在根节点放 − ∞ -∞ −∞,再把树的最大移上去,就是此刻最大的,依次找下去,从大到小排
>> 3.【树】如何构建哈夫曼树?二叉树?满二叉树?完全二叉树?
- 哈夫曼树
是树的带权路径最短的二叉树=最优树🎋,一个堆数可以构造成各种形式的二叉树,理论上把数值大的放在靠近根节点,带权路径长度就越短。自底向上
哈夫曼树的结构不唯一,创建会新增加n-1个节点,一共2n-1个节点,所有节点都变成了叶子节点- 树的带权路径长度WPL = 叶子节点的
值x 节点路径长度(叶子到根有几条边) - b站教程
- 树的带权路径长度WPL = 叶子节点的
- 二叉树
严格区分左右子树 - 满二叉树
除了叶子节点其他所有都是度为2,并且叶子节点全部都在同一层。(就是很规整丰满 - 完全二叉树——堆
叶子节点从左到右不间断,可以不满
>>4.树的三种遍历方式?
在DFS深度中,有3种遍历方式:前序、中序、后序。遍历的顺序如下:
- 前序: 根 → 左 → 右 根\to左\to右 根→左→右
- 中序: 左 → 根 → 右 左\to根\to右 左→根→右
- 后序: 左 → 右 → 根 左\to右\to根 左→右→根
已知前+中/中+后(中必须有),就可以唯一确定一颗二叉树
>> 4.贪心算法?动态规划?分治法?
都是分治法的思想,把大问题拆成几个子问题,用子问题的答案汇聚出大问题的。子问题之间是有交集的
- 贪心算法
是局部最优解,每一步都是当下最好的选择,做选择时不会回头修改之前的决策,直到结束。如最小生成树(prim/kruskal)。 - 动态规划
是全局最优,斐波那契数列会涉及重复计算。子问题重叠的情况,从小到大计算子问题的解,并且存起来 - 分治法
把大问题拆成独立子问题,分别求解子问题后合并得到原问题的答案。如归并排序、快速排序
>> 5.【图】最短路径算法?(Dijkstra算法?Floyd算法?)最小生成树算法?(Prim算法?Kruskal算法?)
- 最短路径算法
- Dijkstra算法 = 迪杰斯特拉
外卖员送外卖
求出有权无向图里面的某一个点到其他任意点的最短路径问题,基于贪心算法,比较并一直更新从村口到这个镇里所有人家的所有最短路径 - Floyd算法 = 弗洛伊德
求有权有向图里面任意两点的最短路径,基于动态规划。不断比较 起点-终点 和 起点-n个中转点-终点的最小
- Dijkstra算法 = 迪杰斯特拉
- 最小生成树算法:
分为Prim(普利姆)算法和Kruskal(克鲁斯卡尔)。是图里的应用,在无向图里面找出一个边权和最小的树🎋=花最小的成本来联通所有边。边权和一定唯一,但是树不唯一- Prim算法 =加点法:从一个节点出发,找边最小的下一个节点连起来,直到所有节点都点亮。适合在稠密图(边很多,因为边数不影响这个算法的效率,以找点为核心)里面找这个树
- Kruskal算法 =加边法:先把节点全部写下来,边从小到大看要不要拿来连接节点,其中不能形成回路,已经连通的两节点不用再连边了。适合在稀疏图里面找最小生成树
6.介绍B树和B+树?
7.KMP算法?
高效的字符串匹配算法,长串找子串奶茶店前队伍找嫌疑犯 next数组
传统的字符串匹配是,从头开始校队主和子,不匹配了,子串一格一格往后挪。 O ( m ∗ n ) O(m*n) O(m∗n)
next数组=部分匹配表 O ( m + n ) O(m+n) O(m+n),记
8.DFS算法?BFS算法?
迷宫起点怎么到终点
- DFS = depth first search
深度优先搜素算法, - BFS
广度优先搜索算法,
9.常见的二叉查找树?
提高数据的查找、输入、删除的速度
-
普通二叉查找树BST=binary search tree
-
平衡二叉查找树(AVL树)
-
红黑树
ML机器学习
>> 1、常见的ML算法有哪些?
机器学习算法包括:监督学习、无监督学习、强化学习RL
- 监督学习:回归分析、SVM(support vector machine支持向量机,分类 问题)、决策树(decision tree)
- 无监督学习:K-Means聚类、主成分分析PCA
- 强化学习:Q-learning、Policy Learning
SVM的核心思想:在特征空间找一个超平面,尽可能隔开不同类别的数据点
决策树的核心思想:用“是/否”划分数据成树状
>> 2、简要介绍KNN算法 vs K-Means
-
KNN=K近邻算法=k-nearest neighbors
推理用的分类器, 可用于分类和回归。是基于距离的监督学习方法- 核心思想:没训练,直接推理时基于样本数据的类别,决定测试样本要分到哪一类
- 具体做法:先计算样本和训练集中其他样本的距离,选出最近的k个,然后多数投票(classification)和平均值(regression)预测样本
- 优点:直观、不用训、适合多分类
- 缺点:开销大、对高维数据(难算)和噪声(特殊数据)敏感
- k一般选奇数,距离的计算有多种方式,如欧式距离、曼哈顿距离、余弦相似度等
-
K-Means=k均值聚类算法
是无监督聚类算法,- 具体做法:定k,随机选k个质心,把样本分给最近的质心,每一簇内重新计算质心(簇内所有点均值),然后重复,最终分出k类,每类里的样本相似
- 用这个方法迭代出一个”分类器“吧(不算训练,就是推理的时候你放样本,就可以分出类了)
>> 3、激活函数是什么?常见有哪些?作用?
- 激活函数=activation function,是引入非线性的关键(NN神经网络的每一层都是线性+非线性)
- 常用的激活函数:
- Sigmoid:倒S,0-1,概率,适合二分类,容易梯度消失
- ReLU:简单,保留正值,负的为0。用于CNN/MLP,可能会梯度消失,因为直接左边负的神经元死亡了
- Softmax:像指数,用于最后一层多分类,把输出转成概率分布
- Tanh:输出(-1,1),用于传统RNN
作用:引入非线性,否则无论多少层都是线性组合,无法拟合复杂数据。让模型更复杂,影响梯度传播和收敛速度
>> 4、Sigmoid 和 Tanh 两个激活函数存在什么问题?
两人都容易造成梯度消失,因为靠近两边导数0了,
可用ReLU缓解,但是他也存在死神经元,只激活部分神经元。
进一步,可用Leaky ReLU、GELU改进的激活函数
>> 5、线性回归 ?逻辑回归?softmax回归?
- 线性回归=Linear Regression:
解决回归问题(预测连续值)
e.g.:房价预测,更根据面积、位置等特征,输出具体的房价数值多少💴- 损失函数:最小二乘法(均方误差MSE
- 输出范围:实数 ( − ∞ , ∞ ) (-∞,∞) (−∞

208

被折叠的 条评论
为什么被折叠?



