算法是比较复杂又基础的学科,每个学编程的人都会学习大量的算法。而根据统计,以下这28个问题是面试中最容易遇到的,本文给出了一些基本答案,供算法方向工程师或对此感兴趣的程序员参考。
除了文章提到的这些题目之外我还整理了很多LeetCode上面的算法题以及刷题笔记
感兴趣的小伙伴可以私信我即可百分百获取!
LSTM原理
LSTM是循环神经网络RNN的变种,包含三个门,分别是输入门,遗忘门和输出门。
LSTM 与 GRU区别
(1)LSTM和GRU的性能在很多任务上不分伯仲;
(2)GRU参数更少,因此更容易收敛,但是在大数据集的情况下,LSTM性能表现更好;
(3)GRU 只有两个门(update和reset),LSTM 有三个门(forget,input,output),GRU 直接将hidden state 传给下一个单元,而 LSTM 用memory cell 把hidden state 包装起来。
Transformer的原理
Transformer本身是一个典型的encoder-decoder模型,Encoder端和Decoder端均有6个Block,Encoder端的Block包括两个模块,多头self-attention模块以及一个前馈神经网络模块;Decoder端的Block包括三个模块,多头self-attention模块,多头Encoder-Decoder attention交互模块,以及一个前馈神经网络模块;需要注意:Encoder端和Decoder端中的每个模块都有残差层和Layer Normalization层。
Transformer的计算公式,K,Q,V怎么算
\text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V
Q、K、V分别是输入X线性变换得到的。
Transformer为什么要用多头
多次attention综合的结果至少能够起到增强模型的作用,也可以类比CNN中同时使用多个卷积核的作用,直观上讲,多头的注意力有助于网络捕捉到更丰富的特征/信息。
Transformer里的残差连接在CV哪里用到了(resnet),resnet的思想
在transformer的encoder和decoder中,各用到了6层的attention模块,每一个attention模块又和一个FeedForward层(简称FFN)相接。对每一层的attention和FFN,都采用了一次残差连接,即把每一个位置的输入数据和输出数据相加,使得Transformer能够有效训练更深的网络。在残差连接过后,再采取Layer Nomalization的方式。
resnet的思想:残差模块能让训练变得更加简单,如果输入值和输出值的差值过小,那么可能梯度会过小,导致出现梯度小时的情况,残差网络的好处在于当残差为0时,改成神经元只是对前层进行一次线性堆叠,使得网络梯度不容易消失,性能不会下降。
relu的公式,relu在0的位置可导吗,不可导怎么处理
\operatorname{relu}(x)=\max (x, 0)
针对这种类型的激活函数,可以使用次梯度来解决。
次梯度方法(subgradient method)是传统的梯度下降方法的拓展,用来处理不可导的凸函数。它的优势是比传统方法处理问题范围大,劣势是算法收敛速度慢。但是,由于它对不可导函数有很好的处理方法,所以学习它还是很有必要的。
c<=\frac{f(x)-f\left(x_{0}\right)}{x-x_{0}}
对于relu函数,当x>0时,导数为1,当x<0时导数为0。因此relu函数在x=0的次梯度c ∈ [ 0 , 1 ],c可以取[0,1]之间的任意值。
神经网络都有哪些正则化操作?BN和LN分别用在哪?
最常用的正则化技术是dropout,随机的丢掉一些神经元。还有数据增强,早停,L1正则化,L2正则化等。
Batch Normalization 是对这批样本的同一维度特征做归一化, Layer Normalization 是对这单个样本的所有维度特征做归一化。
BN用在图像较多,LN用在文本较多。
Attention和全连接的区别是啥?
Attention的最终输出可以看成是一个“在关注部分权重更大的全连接层”。但是它与全连接层的区别在于,注意力机制可以利用输入的特征信息来确定哪些部分更重要。
全连接的作用的是对一个实体进行从一个特征空间到另一个特征空间的映射,而注意力机制是要对来自同一个特征空间的多个实体进行整合。全连接的权重对应的是一个实体上的每个特征的重要性,而注意力机制的输出结果是各个实体的重要性。比如说,一个单词“love”在从200维的特征空间转换到100维的特征空间时,使用的是全连接,不需要注意力机制,因为特征空间每一维的意义是固定的。而如果我们面对的是词组“I love you”,需要对三个200维的实体特征进行整合,整合为一个200维的实体,此时就要考虑到实体间的位置可能发生变化,我们下次收到的句子可能是“love you I”,从而需要一个与位置无关的方案。
Leetcode11. 盛水最多的容器
思路:
从两端往中间走,谁小谁动,一样的情况下谁动都行;
记录每一步 min(X, Y) * distance;
在头尾相遇时结束,也就是 O(n) 时间复杂度与 O(1) 空间复杂度。
注意:两端往中间走,移动高度小的数,每走一步计算一下。
代码:
class Solution:def maxArea(self, height: List[int]) -> int:l,r = 0,len(height)-1curMax = 0while l != r:curMax = max(curMax, min(height[l],height[r]) * (r - l))if height[l] < height[r]:l += 1else:r -= 1return curMax
Leetcode1884.鸡蛋掉落-两枚鸡蛋
思路很简单,从n开始往下递推
比如题解中给的n=100,从100,99,97,94..楼分别往下丢,可以发现这些楼层的间隔是从1,2,3,4不断增加的,直到34,22,9,间隔为12,13,9(最后的间隔是因为不够了,可以看成是14,也就是需要输出的答案)
所以直接开始推,设置cur为间隔,total为总楼层,每次total += cur + 1(+1是因为要算上自己本身所在的楼层)
最后的间隔就是我们需要的答案了
class Solution:def twoEggDrop(self, n: int) -> int:cur, total = 1, 1while total < n:total += cur + 1cur += 1return cur
请简单解释算法是什么?
算法是一个定义良好的计算过程,它将一些值作为输入并产生相应的输出值。简单来说,它是将输入转换为输出的一系列计算步骤。
解释什么是快速排序算法?
快速排序算法能够快速排序列表或查询。它基于分割交换排序的原则,这种类型的算法占用空间较小,它将待排序列表分为三个主要部分:
小于Pivot的元素
枢轴元素Pivot(选定的比较值)
大于Pivot的元素
解释算法的时间复杂度?
算法的时间复杂度表示程序运行完成所需的总时间,它通常用大O表示法来表示。
请问用于时间复杂度的符号类型是什么?
用于时间复杂度的符号类型包括:
Big Oh:它表示小于或等于目标多项式
Big Omega:它表示大于或等于目标多项式
Big Theta:它表示与目标多项式相等
Little Oh:它表示小于目标多项式
Little Omega:它表示大于目标多项式
解释二分法检索如何工作?
在二分法检索中,我们先确定数组的中间位置,然后将要查找的值与数组中间位置的值进行比较,若小于数组中间值,则要查找的值应位于该中间值之前,依此类推,不断缩小查找范围,直至得到最终结果。
解释是否可以使用二分法检索链表?
由于随机访问在链表中是不可接受的,所以不可能到达O(1)时间的中间元素。因此,对于链表来说,二分法检索是不可以的(对顺序链表或排序后的链表是可以用的)。
解释什么是堆排序?
堆排序可以看成是选择排序的改进,它可以定义为基于比较的排序算法。它将其输入划分为未排序和排序的区域,通过不断消除最小元素并将其移动到排序区域来收缩未排序区域。
说明什么是Skip list?
Skip list数据结构化的方法,它允许算法在符号表或字典中搜索、删除和插入元素。在Skip list中,每个元素由一个节点表示。搜索函数返回与key相关的值的内容。插入操作将指定的键与新值相关联,删除操作可删除指定的键。
解释插入排序算法的空间复杂度是多少?
插入排序是一种就地排序算法,这意味着它不需要额外的或仅需要少量的存储空间。对于插入排序,它只需要将单个列表元素存储在初始数据的外侧,从而使空间复杂度为O(1)。
解释什么是“哈希算法”,它们用于什么?
“哈希算法”是一个哈希函数,它使用任意长度的字符串,并将其减少为唯一的固定长度字符串。它用于密码有效性、消息和数据完整性以及许多其他加密系统。
解释如何查找链表是否有循环?
要知道链表是否有循环,我们将采用两个指针的方法。如果保留两个指针,并且在处理两个节点之后增加一个指针,并且在处理每个节点之后,遇到指针指向同一个节点的情况,这只有在链表有循环时才会发生。
解释加密算法的工作原理?
加密是将明文转换为称为“密文”的密码格式的过程。要转换文本,算法使用一系列被称为“键”的位来进行计算。密钥越大,创建密文的潜在模式数越多。大多数加密算法使用长度约为64到128位的固定输入块,而有些则使用流方法。
列出一些常用的加密算法?
一些常用的加密算法是:
3-way
Blowfish
CAST
CMEA
GOST
DES 和Triple DES
IDEA
LOKI等等
解释一个算法的最佳情况和最坏情况之间有什么区别?
·最佳情况:算法的最佳情况解释为算法执行最佳的数据排列。例如,我们进行二分法检索,如果目标值位于正在搜索的数据中心,则这就是最佳情况,最佳情况时间复杂度为0。
·最差情况:给定算法的最差输入参考。例如快速排序,如果选择关键值的子列表的最大或最小元素,则会导致最差情况出现,这将导致时间复杂度快速退化到O(n2)。
解释什么是基数排序算法?
基数排序又称“桶子法”,是通过比较数字将其分配到不同的“桶里”来排序元素的。它是线性排序算法之一。
解释什么是递归算法?
递归算法是一个解决复杂问题的方法,将问题分解成较小的子问题,直到分解的足够小,可以轻松解决问题为止。通常,它涉及一个调用自身的函数。
提到递归算法的三个定律是什么?
所有递归算法必须遵循三个规律
递归算法必须有一个基点
递归算法必须有一个趋向基点的状态变化过程
递归算法必须自我调用
解释什么是冒泡排序算法?
冒泡排序算法也称为下沉排序。在这种类型的排序中,要排序的列表的相邻元素之间互相比较。如果它们按顺序排列错误,将交换值并以正确的顺序排列,直到最终结果“浮”出水面。
end
除了以上提到的这些之外我还整理了很多LeetCode上面的算法题以及刷题笔记,众所周知,算法岗是最卷的,堪称腥风血雨,多刷一些题总是没错的,面试时也能多一些底气。
转发本文+关注+私信【309】即可获取以下两份我呕心沥血整理的文档,祝兄弟们都能拿到心仪的offer