最近算法岗笔试题整理

目录

1. 子串和子序列的区别?

2. 给一个featuremap 矩阵,行列都代表机器翻译用到的不同的单词的依赖程度,判断这个矩阵是哪个模型生成的?

3. 判断递归函数的时间复杂度

4. K-means 组关键数,选一个K得到SSE,利用elbow选取最佳的K为多少(给了个图,判断最佳K)

5. 直接插入排序的比较次数?交换排序的交换次数?(对各个排序的时间复杂度和次数的分析)

6.Tanh的期望为0吗?哪几个激活函数是不饱和的?

7. 朴素贝叶斯是什么?朴素贝叶斯假设变量之间相互独立吗?

8. Gini指数是什么 越大是代表选择还是不选(在决策树中

9. 最长公共子序列指的是连续的还是不连续的?给两个字符串判断最长公共子序列

10. 给一个混淆矩阵,计算召回率

11. 给一堆分类结果,计算AUC ?(没有图

12. 给多分类任务的结果,计算macro-F1-score

13. 给10个数,每次有放回地取出一个数,假设取了10次后,有x个数没有被抽到,计算x的数学期望是多少

14. 给输入图像224*224*3通道,输出224*224*64通道,已知3×3的卷积层,计算这个卷积层的参数数量 

15 用动态规划求最大递增子序列,求dp数组的值,以及该如何初始化

16. {∞.a, ∞.b, ∞.c}取n长的字符串,a出现偶数次的字符串的个数是多少?(选项是三的多少次方)

17. 高斯朴素贝叶斯?是什么,是生成式模型吗?

18. 牛顿法和梯度下降法哪个更快,牛顿法具体怎么做的

19. func(void){。。。。} 给func(2),分别用c/c++编译正确还是错误 

20。1-x+2分之x平方-3分之x三次方+...+(-1)*n分之x的n次方有无实根?

34. Seq2Seq模型、GRU、RNN、LSTM在nlp上的 应用

38. 对C++的了解,C++和Python当中多线程有什么区别?

39.Python当中的线程和进程有什么区别?

40. self attention 除以根号下dk的作用是?

41. 多头self-attention


1. 子串和子序列的区别?

子序列是在一个给定的序列中删除若干元素后得到的序列;子串是字符串中任意个连续的字符组成的子序列

子串连续,子序列不连续

2. 给一个featuremap 矩阵,行列都代表机器翻译用到的不同的单词的依赖程度,判断这个矩阵是哪个模型生成的?

LSTM、GRU、带attention的RNN、CNN

我觉得应该是带attention的RNN,因为attention会通过输入的词语判断,而且根据图,一个词大多只与它周围窗口内几个词有关,说明是一个局部的特征(?)

3. 判断递归函数的时间复杂度

f(n) return 2f(n-1) + 3f(n-2)

用master方法判断递归函数的时间复杂度

其中fn是当前递归函数本体的时间复杂度,T是下一层的n

但是没办法求斐波那契数列的递归函数,可以用递归树的方法求:

每个递归函数都分裂成两个,相当于深度为n的子树,时间复杂度是O (2^n)

4. K-means 组关键数,选一个K得到SSE,利用elbow选取最佳的K为多少(给了个图,判断最佳K)

肘部法则:通过误差平方和曲线(SSE)来确定最佳K值的方法。思想是根据不同的K值来聚类,并计算误差平方和,随着K值的 增加,平方和会减少,找到下降速度极具减缓的点,到达那个点的K值就是最佳K值(肘部)

------其他初始点选择方法:

kmeans++:

   - 选择一个随机点作为第一个初始点。

   - 对于每个数据点,计算其与已选择的初始点之间的距离,并选择距离最大的点作为新的初始点。

   - 重复上述步骤,直到选择了K个初始点。

5. 直接插入排序的比较次数?交换排序的交换次数?(对各个排序的时间复杂度和次数的分析)

在排序过程中,若整个表都是放在内存中处理,排序时不涉及数据的内、外存交换,则称之为内排序;反之,若排序过程中要进行数据的内、外存交换,则称之为外排序。 

主要要了解的有:

插入排序:把序列划分成排序的和没排序的,每次从没排序的第一个插入到前面已经排序的正确位置

冒泡排序:依次对相邻两个元素的值进行两两比较,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就如果水底下的气泡一样逐渐向上冒。

直接选择排序:把序列划分成排序的和没排序的,每次从没排序的选择一个最小的插入到前面的最后。

希尔排序:插入排序的改进。迭代,第一次把数据分成n/2组,每组两个数,排序,第二次把数据分成四组,再排序,直到每个组只有一个数的时候。

分组的方式是把第0个数和第n/2个数分为一组。

快速排序:每次选一个分割点,首位开始迭代,交换,遍历一轮后保证分割点左边的数都小于他,右边的数都大于他。

堆排序:升序大根堆。降序小根堆。

归并排序:就是每次将数组分成两组,每组再继续迭代,排序。两组排序好后再合并两个有序数列。

6.Tanh的期望为0吗?哪几个激活函数是不饱和的?

(1)tanh(x)是奇函数,即tanh(-x) = -tanh(x),当x服从标准正态分布时,tanh(x)的期望值就为0。

(2)判断激活函数是否饱和是根据导数。导数在整个输入区间都接近于0就是饱和。例如sigmoid和tanh,在饱和区域对于输入变化不敏感,会导致梯度消失。

不饱和的有relu,线性,整个输入范围都有敏感性。能解决梯度消失的问题。但是有死亡神经元。

7. 朴素贝叶斯是什么?朴素贝叶斯假设变量之间相互独立吗?

是的,朴素贝叶斯的理论就是每个特征独立且相等(具有相同的重要性)。

朴素贝叶斯分类器的公式:

分类器就是考虑每个分类label的概率,输出概率最大的y作为结果。

8. Gini指数是什么 越大是代表选择还是不选(在决策树中

刚好与CART决策树一起看

节点越不纯,基尼指数越大,熵越大,效果越差。(不纯指的是分类数据包含多个类别,如果是只有一个类别就是最纯的)

9. 最长公共子序列指的是连续的还是不连续的?给两个字符串判断最长公共子序列

子序列是不连续,子串是连续

这个是多维dp,等明天做leetcode看

10. 给一个混淆矩阵,计算召回率

混淆矩阵难记,就记住:

准确率是所有样本预测为正的当中,真实为正的概率

召回率是所有真实样本为正的中,预测为正的概率

11. 给一堆分类结果,计算AUC ?(没有图

奇了怪了,根本没法算AUC啊,这不是曲线下面积吗

可能是因为都是0??我也不懂

反正先算一下TPR-FPR,再算ROC TPR-FPR TPR就是召回率

FPR是所有真实样本为负的中,预测为正的概率

两者相加不等于1,因为分母不一样。

如何算出多个TPR、FPR,画出曲线?这是根据阈值来算的,比如每个数据会输出0-1之间的数,阈值设为0.5就代表大于0.5为正,小于0.5为负。

12. 给多分类任务的结果,计算macro-F1-score

macro就是F1的多个分类均值。把多分类分成多个二分类问题。

13. 给10个数,每次有放回地取出一个数,假设取了10次后,有x个数没有被抽到,计算x的数学期望是多少

14. 给输入图像224*224*3通道,输出224*224*64通道,已知3×3的卷积层,计算这个卷积层的参数数量 

要计算3×3卷积层的参数数量,需要考虑卷积核的大小、输入通道数以及输出通道数。

给定:卷积核大小:3×3,输入通道数:3,输出通道数:64

计算参数数量:每个卷积核的参数数量:3×3×3=27,每个输出通道有一个卷积核:64个卷积核

总参数数量:27×64=172827×64=1728

此外,卷积层通常还有一个偏置参数 per output channel:偏置参数数量:64

总参数数量:
1728+64=17921728+64=1792

15 用动态规划求最大递增子序列,求dp数组的值,以及该如何初始化

16. {∞.a, ∞.b, ∞.c}取n长的字符串,a出现偶数次的字符串的个数是多少?(选项是三的多少次方)

不知道是什么东西,搜都搜不到

17. 高斯朴素贝叶斯?是什么,是生成式模型吗?

不是,是分类模型。

据对“似然度”计算方法的不同,将朴素贝叶斯大致分为三种:多项式朴素贝叶斯(MultinomialNB)、伯努利分布朴素贝叶斯(BernoulliNB)、高斯朴素贝叶斯(GaussianNB)

(1)高斯朴素贝叶斯适用于特征呈正态分布的,多项式贝叶斯适用于特征是多项式分布的,伯努利贝叶斯适用于二项分布。一般连续特征会遵从正太分布

(2)多项式朴素贝叶斯适用于特征值为离散的情况,特别是特征值表示频率或计数时。它常用于文本分类任务,例如垃圾邮件过滤

(3)伯努利朴素贝叶斯假设特征是二值的,即每个特征要么出现,要么不出现。这种模型更适合于只有两种状态的特征(如是否出现某个单词)。它计算每个类别下特征是否出现的概率,伯努利朴素贝叶斯适用于二元特征的分类任务,特别是在文本分类中,当我们只关心单词是否出现而不是出现的频率时。例如,垃圾邮件过滤器可以使用伯努利模型来考虑邮件中是否出现某些关键字。

假设我们有一组邮件,其中的特征是邮件中某些特定单词是否出现(如“免费”、“优惠”等),我们可以使用伯努利朴素贝叶斯来预测邮件是否是垃圾邮件。

18. 牛顿法和梯度下降法哪个更快,牛顿法具体怎么做的

(1)梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。梯度下降法很快

梯度下降法的缺点:

  (1)靠近极小值时收敛速度减慢,如下图所示;

  (2)直线搜索时可能会产生一些问题;

  (3)可能会“之字形”地下降。

包括批量梯度下降随机梯度下降法。批量梯度下降是对所有的样本批量求梯度并更新,随机梯度下降是随机选取一些样本计算梯度(贪心一样,不是整体最优,但是能代表近似估计

(2)牛顿方法使用函数(x)的泰勒级数的前面几项来寻找方程(x) = 0的根。牛顿法最大的特点就在于它的收敛速度很快。牛顿法是基于当前位置的切线来确定下一次的位置。

从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)

但是,牛顿法的缺点是需要Hessian矩阵的逆矩阵,计算比较复杂。

19. func(void){。。。。} 给func(2),分别用c/c++编译正确还是错误 

都是编译错误

20。1-x+2分之x平方-3分之x三次方+...+(-1)*n分之x的n次方有无实根?

21. A52,C52怎么算来着(全排列公式

22. python dict.fromkeys(['k1','k2'],[]) 什么意思

23. 程序调用图是啥,是二分图吗

24 度为4的数,分别给出度为4,3,2,1的节点的数量,求度为0的节点的数量

25 隐马尔可夫链、前向、后向、混合高斯算法

26. RCNN、Fast RCNN、Faster RCNN的区别特点

27. 语音合成的方向有哪些 统计参数语音合成

28. int array[] = {10,20,30} cout<<-2[array-1] 是多少

29. python 定义 @class method 直接对类修改变量值和建立对象后通过对象修改变量值,最后的结果是多少

30. 分页存储

31. 设计模式里和单一职责原则冲突的是?

---------------------------------------

32. 分词器?有哪些 中英文 现在输入到神经网络里还需要用到分词器吗

33. Greedy Search贪婪搜索解码流程(用于机器翻译预测, transformer的预测过程)Transformer系列:Greedy Search贪婪搜索解码流程原理解析 - 简书

NLP实验3——基于Transformer的机器翻译_nlptransformer翻译-CSDN博客

34. Seq2Seq模型、GRU、RNN、LSTM在nlp上的 应用

35. bleu评价指标

36. 最大似然函数

37. 逻辑回归是什么?

38. 对C++的了解,C++和Python当中多线程有什么区别?

c++通过thread库来创建和管理线程,适合CPU密集型任务,没有全局解释器锁(GIL)

python通过threading模块管理线程,由于GIL的存在,主要用于IO密集型任务,例如网络请求、文件读取。不适合CPU密集型任务。 对于CPU密集型使用multiprocessing


39.Python当中的线程和进程有什么区别?

线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位

进程是资源分配的基本单位。一个进程包括多个线程。

  • 单个CPU在任一时刻只能执行单个线程,只有多核CPU还能真正做到多个线程同时运行
  • 一个进程包含多个线程,这些线程可以分布在多个CPU上
  • 多核CPU同时运行的线程可以属于单个进程或不同进程
  • 所以,在大多数编程语言中因为切换消耗的资源更少,多线程比多进程效率更高

GIL规定,在一个进程中每次只能有一个线程在运行。这个GIL锁相当于是线程运行的资格证,某个线程想要运行,首先要获得GIL锁,然后遇到IO或者超时的时候释放GIL锁,给其余的线程去竞争,竞争成功的线程获得GIL锁得到下一次运行的机会。

正是因为有GIL的存在,python的多线程其实是假的,所以才有人说python的多线程非常鸡肋。但是虽然每个进程有一个GIL锁,进程和进程之前还是不受影响的。

由于GIL的存在,很多人认为Python多进程编程更快,针对多核CPU,理论上来说也是采用多进程更能有效利用资源。但这不是说明多线程就没意义了,还是得根据实际场景来看。

对CPU密集型代码(比如循环计算),多进程效率更高。
对IO密集型代码(比如文件操作、网络爬虫),多线程效率更高。

对于IO密集型操作,大部分消耗时间其实是等待时间,在等待中CPU是不需要工作的,那么在此期间提供多个CPU资源也是利用不上的,python碰到等待会释放GIL供新的线程使用,实现了线程间的切换。相反对于CPU密集型代码,多个CPU干活肯定比一个CPU快很多。

 最长递增子序列,可不可以不用动态规划

flash attention 了解吗? 怎么做的计算?

40. self attention 除以根号下dk的作用是?

是为了防止点积变得太大。如果这些值变得太大,之后使用的 softmax 函数会将梯度推入它们太小的区域,从而导致有效学习的问题。通过缩放点积,可以使值保持在 softmax 函数的更稳定范围内。

41. 多头self-attention

其实是相当于每个VKQ都做了多次Linear变换,得到多个selfattention的结果,再用concat拼接起来,经过线性层得到一个结果。

Feedforward的作用:它增强了模型的表达能力并允许模型学习更复杂的特征表示。

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值