非科班如何快速的转行算法工程师及经验分享

非科班如何快速的转行算法工程师及经验分享

本文采样了目前网络中的文章管用的手法-夸大吸引人的手法,正如标题所说快速转行。因而你看到这里我会向你道歉,因为如果你不努力仅仅靠看一篇文章也完成不了转行,没有任何成功或者成果是一蹴而就的,但是我敢保证这篇长文对于准备想转行算法或者求职的你绝对会有帮助。快速是相对而言的,只要方法对,大方向没错,你走的就会比别人稍微快一些,同样是一年多的准备时间,有的人方法正确他在这一年内的时间里可以获得很好的offer,有的人一年以后才发现自己的方法是错的,这时再改正已经是为时以晚了。所以这里的快速有一个前提就是努力刻苦,付出一般人没有的努力以及正确的方法。如果你想不付出任何努力,想看完这篇文章就想转行算法岗的话,还是建议你去看看其他帖子吧,这篇文章还没有这么大的作用和效果,自己在秋招和春招中也是收到了很多人的帮助,所以在自己收到满意的offer 之后还是希望能够给学弟学妹们带来一丝帮助。这篇文章仅仅针对于非科班或者基础较为薄弱的人,其他各路大神也请绕路。

首先介绍一下本人情况,本人渣硕非科班一枚,非计算机专业,非自动化类,非控制类,非通讯类。之所以说这么多主要是增强你们的信心,如果你是通讯类或者控制类专业在算法岗求职中已经超越一部分人了,如果是自动化专业那么你已经超越很大一部分人了,如果你是计算机非人工智能专业那么你已经超越很大很大一部分人了,如果你是计算机人工智能专业那么你已经占据非常大的优势了,当然这是针对2020年之前的情况,如果过几年人工智能专业的学生毕业以后应该会有大批对口专业进入这个行业,竞争将是更加激烈。当然任何情况都会有例外,一些非人工智能专业的人中也有非常多的大神存在,这部分人是我们不能忽视的存在。我来自传说中9所top5高校中的一所(必然是非清北,大家都心知肚明),经过整整一年的准备在秋招提前批及秋招中获得了多个算法岗offer(含多个ssp和sp offer,包括CV四小龙独角兽企业,安防第一公司海康威视研究院,手机及5G通讯类公司,金融科技巨头中国平安,指纹识别巨头汇顶科技,银行类浦发银行等),具体的方向是2020届求职竞争最惨烈的也是最劝退的方向计算机视觉算法。当然未获得bat中的offer,当时求职时已战略放弃。下面我会以一个非科班的角度切身讲一些自己在过去准备和求职中的一点经验,因而对于非科班而言会非常友好,而对于一些科班而言可能会显得非常弱智,请大神选择忽视,并尊重每一个有梦想,并敢于选择自己喜欢的职业的人。对于每一个环节我会总结出一个关键句,如果你时间有限可以只看总结,在决定再看是否看下面的解释。

一. 心态

总结:心态很重要-保持急迫的心态不放弃任何一个机会。
在过去的一年中,为了求职我看了很多面经以及各种帖子,关于心态方面,大家几乎都会说一个观点就是:不要急,放平心态,最后大家都会有一个属于自己的工作。然后在秋招以及与各种朋友的交谈我却发现这个观点既对又不对,这也是我特别想跟我们这些转行的人说的一点,就是千万不要抱着一种一切放平心态,最后肯定会有一个工作的心态。如果真是一直抱着这种心态我想最后有可能真的连个工作都没有。因为我们的时间非常紧迫,即使你再聪明,相比于那些对口专业的学生而言,我们已经在起跑线上输了很远的距离了。我们必须拥有一个紧迫心态,时刻比别人付出更多的努力才能获得和别人一样的结果。只有时刻保持着压力,我们才能时刻保持着努力以及学习的心态,争取到每一个机会,不放弃每一个可以把握的机会。如果我们没有这种紧迫的心态或许很多小的机会我们会轻易的放弃掉。存在即合理,我们必须摆正自己的心态,只要是机会,绝对不轻视,先争取到了再说是否选择。事实上,即使我最后获得了很多算法岗offer并且签订了三方,我也没有放弃学习,一直保持着一种紧迫的心态,因为只有这样才能让我保持学习,保持前进。所以心态很重要。

二. 方向选择

总结:不轻易做方向选择,但是该做出决定的时候绝不犹豫;不在开始时定最终方向,在进展中确定方向。
很多师弟和师妹问我该从哪个方向进行准备,是做算法,还是开发还是测试。我一直给的建议是不要现在做决定,先行动起来,在机会到来的时候在做决定,因为刚开始还没到你做决定的时候,也不要轻易做决定。因为无论是算法,开发还是测试,你首先都必须是一个工程师,有很多东西相通的,比如数据结构与算法,编程语言,Linux系统知识,所以我总会告诉学弟学妹们,先做起来,学起来,搞定这些基础知识,然后在后面有机会的时候再做决定。那么这个到时候再决定到底是什么意思呢?首先我们尽可能学习多的基础知识,比如C,C++语言基础,数据结构与算法,Linux系统,操作系统,系统的学习一些知识后,按照网上的教程做几个简单的小项目,不必非常复杂,然后把握住实习的机会,无论公司大小,因为只要实习,你就能接触很多工业界的东西,在实习中领导也会安排一些具体的任务,在这些具体任务的学习中你就会有侧重,这是你的侧重是什么就把自己的方向确定什么,一点点做起,如果做着开发,然后又开始做一些算法的项目所以后面也有可能做算法,但是很多人并不是一开始就确定要做算法方向,而且算法又分为很多方向,所以从来都是在学习和机会中确定的。另外我十分不建议非科班一开始学习就是从刷题开始,因为我们非科班与科班人员的最大的知识就是系统知识的差距,如果我们一开始就把时间浪费在刷题上只会与别人的差距越来越大。刷题我建议是求职前的2个月再开始进行。
虽然大家现在一提算法就是算法太过火爆不太建议,但是我觉得没有必要一开始就过渡排斥什么东西,任何东西只要你能够付出比别人多的多的努力,就有希望,当然有时候我们可能还是和大神有很多差距,但是我们已经站在了起点,只要你时刻比别人多走一点,在职业发展的这场马拉松中,你总会赶上别人的步伐。对于本科生的学习我们都心知肚明,很多情况大家都不怎么听老师讲课,有时候看老师的PPT的学习效果比听老师讲的效果对一个知识点了解的更加透彻,所以即使专业对口也只是这本科4年的时间里多学习了一点系统的知识。我们必须清醒的意识到自己与科班的差距,并且弥补自己的差距才能让自己赶上科班人员的步伐。所以这个差距到底是什么?我觉得就是学习的时间以及对于知识的系统学习。科班人员对于求职的工作付出了大量的时间,而且学习的知识也比较系统,所以如果是转行人员必须系统的学习知识并且付出更多的学习时间。再回到方向选择上来,从总体求职难度而讲,算法>开发>测试,从薪资待遇来讲,也是算法>开发>测试,但是这两年开发的待遇水平有所上涨,与算法岗差距已经不像原来那么明显,从职业发展而言,适合自己的就是最好的,这简直是一句废话,开发和算法偏好,测试一般,仅一家之言,算法属于锦上添花之物,开发是很多公司实际收益所需要的,但是对于AI独角兽企业算法的职业发展还是稍微好于开发,毕竟AI独角兽企业的算法岗在跳槽时其他企业还是比较看重的也是一个优势所在。

三. 学习及求职路线

总结:点到面到线。
什么意思?点就是基础知识点,我们首先要尽可能多多学习基础知识,包括数据结构算法,语言以及操作系统类知识,从这些点构建起我们的知识面并且把这个知识面逐渐扩展开,扩大我们的知识面才能把握住更多的机会,在确定好大方向后在线上无限延展,这条线也决定了我们在求职中获得什么样的offer以及什么样的薪资,因为这是你的level,这条线的长度也就是我们的技术水平。
具体而言,我的学习路线仅供参考,下面将会是重点:


首先就是数据结构和算法的学习,我学习的参考是MOOC上的公开课,浙大的课程,关键字是陈越姥姥,讲的非常清晰,认真学习每一堂课程并且就像自己在大学上课一样,做好每一道习题。为了模拟大学的专业课程以及学习模式,我也会一个月同时学习几门课程,让自己的大脑适应IT的思维以及知识。学习数据结构和算法的同时我会同时看孙钟秀先生主编的《操作系统教程(第四版)孙钟秀》,在这段时间里数据结构与算法是学习重心,操作系统是额外学习的附加点,对于操作系统我们初学者不需要弄懂每一个知识点,只需要大致的了解,大致的过一遍,对操作系统有一个整体的认知。这时距离求职还有一年多一点的时间。学习数据结构和算法以及操作系统大概花了一个月的时间,需要注意的是,数据结构与算法非常重要,因而我看了两遍,第一遍是看了一遍视频同时做笔记,第二遍是看自己的笔记,回忆相关重要的知识点,对于自己不懂的地方再回去看视频了解清楚。
我十分不推荐现在做笔记还停留纸质的笔记上,原因主要有两点:不方便跨设备共享,另外不方便额外加东西以及搜索之前记录的知识点。纸质笔记在我看来仅限于face to face 的交流工具,这会使得交流更加方便。所以这里我给大家推荐一款记笔记的软件,这也是我充分调研后的结果,我强烈推荐大家使用印象笔记,之前只有Mac支持mark down 输入,对于程序也比较友好,现在Windows系统也支持了,十分方便,而且可以跨设备共享,且免费,上传量多了才收费,但是目前我的免费上传量完全够用,可以说十分方便了。
学习完数据结构与算法,操作系统以后,我的学习来到了李航的《统计学习方法》这是一本算法领域必看的一本入门书,书虽然很薄,但是知识却非常重要,有很多数学推导,我会跟着默默推导一遍。学习统计学习方法的同时开始啃那本非常厚的《C++ Primer》这本书来学习C++编程语言,在编程语言的选择上我首先确定了C++的学习,主要有2方面原因,一方面:本科学习过C语言,另外方面C是很多语言的基础,也十分重要而且C++其实和Java非常像,于是就开始了C++的学习,对于此编程语言的学习我主要是通过C++ primer这本书开始的,这本书非常厚,知识点非常多,是C++的经典著作,我看了很久才看完,同样笔记很重要,因为很多东西你会很快忘记,笔记可以帮助我们更快的帮助大脑回忆起重要知识点,重构当时的学习场景。在这段时间统计学习方法是前半部的学习重点,C++ primer是后半部分的重点。这一部分我记得学了比较长的时间,也是花了很大的力气才学习完,感觉学完了也是脱了一层皮。
在统计学习方法以及C++ primer学习完之后我的学习来到了周志华的《西瓜书》和深度的经典著作的翻译版本《深度学习》这本书被称为人工智能界圣经般的存在,这两本书帮助我打开了人工智能的大门,这两本书确定搞算法的同学必看的重点,《深度学习》这本书的前几章更多的讲的是机器学习,由于我之前看了统计学习方法和西瓜书,所以为了节省时间可以从第六章开始看,因为我们其实已经对前面章节的知识比较熟悉了,大家也可以看动手学深度学习来学习人工智能相关的一些知识,吴恩达的课程也是经典。
接着是python编程语言的系统性学习,首先我在MOOC上看了北京理工大学的python公开课,然后接下来看了书:《python编程从入门到实践》,《python机器学习基础教程》,《Deep learning with python》有了C++的编程语言的基础,python的学习就会变的非常容易,python目前已经成为了一个程序员必会的编程语言,也是搞算法必须的基础,python的每一本书我没有像C++ primer那样细啃,而是大致的过一遍,python的每一本书大概15天就可以搞定的样子,当然如果细读并且搞懂每一个语法知识点的话还是要花费很长时间的,由于我没有那么多的时间所以在python的学习上还是比较快的,为了给自己的实习争取更多的时间。学了python的同时我也开始学习Linux系统相关知识,看了《鸟哥的linux私房菜》,帮助自己建立Linux的知识体系。
由于自己的数学基础比较好,对数学比较感兴趣,然后在接下里的一段时间内,我就开始看算法领域的一些论文,既有cv也有nlp,我没有给自己设限,然后在GitHub上下载一些开源的项目跑了跑,学习一些算法知识,并且选一个深度学习框架进行学习,我当时选的是TensorFlow,通过官方教程和一些博客对TensorFlow进行一些系统的学习,然后开始准备找实习,具体的接触一些项目,这个时候我连开发的岗位也是在看的,只要是IT相关的实习岗位我都是渴望尝试的,因为无论任何机会对我来说都是具有学习价值的。在找实习的时候就要面对面试了,当然这里就少不了资源以及面经了。这里着重推荐《牛客》,因为自己的面经以及求职信息基本上都是从牛客上获取的。对于面试我们当然要准备一些东西,也要有一些技巧,当时在牛客上看到一个学长分享了自己的面经以及自己的资源,我当时花了150块买了学长整理的资料以及心得体会。这些资源就有cv也有nlp的,我当时就是看着这些资源一点点准备的,以为了应付面试。虽然花了不少钱,但是目前来看还是挺值的,因为那些整理,为我节省了很多时间也帮助我更系统的整理了知识,非常有帮助。
当你看到这里你会蒙住,可能会说,我靠,需要看这么多书吗?那我肯定完了,千万要稳住,不要慌,这些书虽然突然一下子给你说,会发现非常多但是只要每天都坚持看,坚持做好自己的计划,8个月的时间绝对能够搞定,当然如果你自己的科研任务比较重的话可能时间会稍微长一些,因为我自己的科研完成的比较早,基本研一除了上课就在研一下做完了自己的大部分科研任务,所以从研二我就基本全身心转到人工智能的学习上了。按我说的把前面说的那些说一步步看完,然后后面就会非常的容易,后面可以花一个月的时间看看博客和别人整理的资源,一定得记住,一定得站在前人的肩膀上,只有这样你才能比别人走的更快,也能节省更多的时间,博客是一个很好的东西,有很多可以借鉴的东西。这一个月准备各个方向需要面试的知识点,同时看一些面经,可以刷一下《剑指offer》和LeetCode,不必刷太长时间因为我觉得实习的面试题不是特别难,还是比较看重基础,找到实习后要尽可能的学习,在实习中确定自己的方向,并逐渐深入,对于算法岗多看一些目前领域内的一些经典模型以及最新算法模型,经典模型是必会,因为这是面试的重点。这个时候就是伸长自己的知识线的时候了,逐渐的深入,只有深入了才能在正是找工作的时候得到企业的青睐。4-5月份的时候就要开始逐渐刷题了,LeetCode网站可以按类型刷也可以由易到难刷,剑指offer是面试频率比较高的题,但是我发现这两年好像很多公司的题有意避开剑指offer了,开始出一些与实际比较贴合的题,比如我在面试时遇到的问题:编程实现非极大值抑制,计算IOU等等。实习期间要着重积累自己的项目经验,年轻的时候多干点活不怕,只要领导交给的,是不是自己的任务都可以积极尝试去做,多干点脏活累活没啥坏处,尤其是对于非科班同学。在正是找工作的时候项目是一项重点。

四. 面经及资源

很多面试都是非几个模块来考察求职者的,因而我也据此将一些面经分为几个模块,列举出一些常见的面试题:

4.1 数学基础

回答是我自己整理的仅供参考
1.求矩阵逆的几种方法?
(1)待定系数法,把矩阵的逆中的每一个元素设为待定系数然后与矩阵相乘得到的方程组求解(2)伴随矩阵法,矩阵A的逆等于A的伴随矩阵除以A的行列式(3)初等变换求逆矩阵
2.偏微分方程的求解方法?
有分离变量法,拉氏变换法,格林函数法,傅里叶变换
3.插值和拟合的联系和区别?

  • 他们的共同点都是通过已知一些离散点集M上的约束,求取一个定义在连续集合S(M包含于S)的未知连续函数,从而达到获取整体规律的目的,即通过"窥几斑"来达到"知全豹"。
    (1)拟合是指已知某函数的若干离散函数值{f1,f2,…,fn},通过调整该函数中若干待定系数f(λ1, λ2,…,λ3), 使得该函数与已知点集的差别(最小二乘意义)最小。如果待定函数是线性,就叫线性拟合或者线性回归(主要在统计中),否则叫作非线性拟合或者非线性回归。表达式也可以是分段函数,这种情况下叫作样条拟合。
    (2)插值是指已知某函数的在若干离散点上的函数值或者导数信息,通过求解该函数中待定形式的插值函数以及待定系数,使得该函数在给定离散点上满足约束。插值函数又叫作基函数,如果该基函数定义在整个定义域上,叫作全域基,否则叫作分域基。如果约束条件中只有函数值的约束,叫作Lagrange插值,否则叫作Hermite插值。
  • 从几何意义上将,拟合是给定了空间中的一些点,找到一个已知形式未知参数的连续曲面来最大限度地逼近这些点;而插值是找到一个(或几个分片光滑的)连续曲面来穿过这些点。

4.常用的插值方法?
多项式插值,牛顿插值,埃尔米特插值,分段插值,拉格朗日插值

  • 常用的三次样条插值,简而言之,就是依然对每一个小区间进行插值,但是我们不需要依赖于导数的已知;由于我们要做的就是使得端点出满足某种条件的光滑(一般来说,三次样条插值就是要满足二阶导数连续),根据这个要求,我们就可以在未知导数的情况下推导出样条函数。具体方法看下面。

5.最小二乘法的数学描述?
找一个或一组估计值使得实际值和估计值的距离最小,最小二乘法的核心是权衡,即从很多条线中选择出一条距离所有点之和最小的线。
比如我们利用最小二乘法去拟合一条直线,我们需要不断的调整和计算w,b使得所有的点到这条直线的距离最短。
最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小
6.交叉熵?
交叉熵在信息论中表示两个概率分布的差异性信息
经机器学习中经常被用作损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。
在语言模型中(NLP)中,由于真实的分布p是未知的,在语言模型中,模型是通过训练集得到的,交叉熵就是衡量这个模型在测试集上的正确率。
7.L1不可导的时候该怎么办?
对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归),L1不可导时可以采用坐标下降法,还可以采用proximal operator。
8.梯度:方向导数的最大值
梯度的几何含义是沿着向量所在直线的发向的变化率最大。
9.L1正则化和L2正则化的区别
对于⽬目标函数Obj(F)来说,实际上是要在正则项的等值线与损失函数的等值线中寻找⼀个交点,使得二者的和最⼩小。
对于L1正则项来说,因为L1正则项是一组菱形,这些交点容易易落在坐标轴上。因此,另⼀个参数的值在这个交点上就是0,从⽽而实现了了稀疏化。
对于 L2正则项来说,因为 L2正则项的等值线是一组圆形。所以,这些交点可能落在整个平面的任意位置。所以它不能实现「稀疏化」。但是,另⼀一⽅面,由于 (w1, w2) 落在圆上,所以它 们的值会⽐比较接近。这就是为什么L2正则项可以使得参数在零附近稠密而平滑。
10. 其他数学类问题如下
优化方法有哪些?SGD,momentum,Adagard等已经是你必须知道的了;sigmoid函数特性;切比雪夫不等式;最大似然估计和最大后验概率的区别;频率学派和贝叶斯学派;PCA中第一主成分是第一的原因,实习面试百度问过,拟牛顿法原理,编辑距离,LR公式,交叉熵公式,LR推导这是基础题必会,SVM推导必会,SVM什么时候用线性核什么时候用高斯核;SVM和LR的区别,必会;监督学习和无监督学习的区别;生成模型和判别模型的区别以及有哪些

4.2 数据结构

1.AVL树和红黑树的区别
2.建立一个堆的复杂度是?将一个元素插入堆的时间复杂度是?
3.最容易合并的堆是什么堆?
4.堆的种类:二叉堆,二项堆,斜堆,等
5.迪杰斯特拉Dijkstra算法和Floyd算法
路径算法参考
6.运筹优化理论
运筹优化参考
7.调表是一种由链表和多级索引构成的结构,跳表这个动态数据结构,不仅支持查找操作,还支持动态的插入、删除操作,而且插入删除操作的时间复杂度也是 O(logn)。
另外调表是通过随机函数来维护前面提到的平衡性。空间复杂度是O(n),这个空间复杂度当相比于对象来说还是比较可取的,原始链表中存储的有可能是很大的对象,而索引结点只需要存储关键值和几个指针。
8.B树和B+树的区别

4.3 编程基础

面试官经常首先问平时用什么语言,对什么语言比较熟悉,然后有可能还会问一些与其他语言的区别。
1.常用的Linux命令
2.如何实现hashmap,以及多线程的hashmap?
3. 在并行多线程操作时可能会导致陷入循环链表。
4. 多进程多线程同步的几种方式?
4.1 什么是线程? 如何解决
5.new和malloc的区别?
(1)属性不同,new属于c++关键字需要编译器支持,而malloc属于库函数需要头文件支持
(2)new根据类型分配内存空间需要指定大小而malloc需要指定所需内存的大小。
(3)返回类型不同。new根据所指对象自动进行类型的匹配因而是类型安全的,而malloc返回的是void*
(4)new允许重载而malloc不允许重载
(5)分配失败时:new返回bad_alloc,而malloc返回的是null
6.虚函数的概念及作用
多态:是对于不同对象接收相同消息时产生不同的动作。或者调用同名函数却会因上下文的不同而有不同的实现。具体的是通过virtual关键字来实现,调用同名函数却会因上下文的不同而有不同的实现
7.析构函数是否可以为虚函数,构造函数是否可以是虚函数
当析构函数不是虚函数时,在类的继承红如果基类指针指向派生类那么用基类指针delete时,派生类中派生的那一部分无法析构,造成内存的泄漏。
构造函数不能是虚函数,因为构造一个对象时必须知道对象的实际类型,而虚函数行为实在运行期间确定实际类型的,而在构造一个对象时由于对象还未构造成功编译器无法知道对象的实际类型,另一方面,虚函数的执行时依赖于虚函数表的,而在构造对象期间虚函数表还没有被初始化。
8.构造函数和析构函数是否可以抛出异常
(1)构造函数可以抛出异常
(2)C++标准指明析构函数不能也不应该抛出异常。
9.编译和链接的区别
10. 静态库和动态库:
静态库和动态库从字面意思来看,区别就是静态和动态。而这里的静态和动态指的是库的链接阶段。可以看如下的编译过程。
静态库:在链接阶段库将会与目标汇编后的目标文件.o一起打包生成可执行文件。成为可执行文件的一部分,后续此库就可以消失了。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。
动态库:而动态库在编译阶段都不会有什么动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。
11.C++调试技巧
(1)首先修改编译期错误,双击output窗口的错误,然后会定位到错误语句进行修改。
可以源文件分别编译有助于我们发现和调试错误
(2)程序执行时期的错误调试方法如下:
a.单步执行跟踪程序,包括逐语句(F10),和逐过程(F11),区别就是逐语句会进入调用函数内部
b.执行到鼠标所在行的命令,对应的快捷键是Ctrl+F10
c.设置断点命令快捷键,在需要设置断点的地方按F9,设置断点完毕,按F5可以一次性进行到第一个设置断点的地方。
d.观察程序执行过程中变量和表达式值的变化
12.Debug和Release的区别
Debug:调试版本,包含调试信息,所以容量比Release大很多,并且不进行任何优化(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂),便于程序员调试。Debug模式下生成两个文件,除了.exe或.dll文件外,还有一个.pdb文件,该文件记录了代码中断点等调试信息
Release:发布版本,不对源代码进行调试,编译时对应用程序的速度进行优化,使得程序在代码大小和运行速度上都是最优的。(调试信息可在单独的PDB文件中生成)。Release模式下生成一个文件.exe或.dll文件
13.python是值传递还是引用传递
python统一采用引用传递,在对可以改变元素的对象中比如list,set,dict等可以通过修改参数值来修改原对象,而number,string或者tuple这种不可改变的对象,虽然传递的是引用,但是对象内元素不可修改所以实际类似于C++中的值引用。
14.Python中模块(Module)和包(Package)的区别
(1)为了便于维护编写的代码,当函数很多时我们经常把不同的函数放在不同的文件中,这样管理代码的方式在很多编程语言中也都很常见,这个文件以.py文件格式命名,称为module也即模块,模块是一组代码的集合,可以引用其他模块也可以被其他模块所引用。
(2)但是当模块较多时与别人的模块冲突了怎么办这时python提供了一种叫做package的东西,也即包。方法是选择一个顶层包名,并把这几个模块放在这个包名下,注意这个包下需要有一个init.py的文件,这是必须的,否则所在的文件夹就会被当成一个普通的文件夹,inti.py可以是空文件也可以有代码。
15.线程和进程的区别?
进程:是一个执行中的程序,一旦程序进入内存并且准备执行那么它就是一个进程,它是表示资源分配的基本概念,又是调度的基本单位。
线程:是进程中的一个任务,线程是进程执行计算的最小单位。
一个进程包含多个线程,一个线程是可以看做轻量级的进程。
16.static的了解
static可以用作函数和变量的前缀,对于函数而言,static的作用仅限于隐藏。
static的作用:1是隐藏。当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。如果加了static,就会对其它源文件隐藏。2.保持变量内容的持久。如果作为static局部变量在函数内定义,它的生存期为整个源程序,
14.set底层实现方式为RB树(即红黑树)
关于set有两种说法,第一个是STL中的set,用的是红黑树;第二个是hash_set,底层用得是hash table。红黑树与hash table最大的不同是,红黑树是有序结构,而hash table不是。但不是说set就不能用hash,如果只是判断set中的元素是否存在,那么hash显然更合适,因为set 的访问操作时间复杂度是log(N)的,而使用hash底层实现的hash_set是近似O(1)的。然而,set应该更加被强调理解为“集合”,而集合所涉及的操作并、交、差等,即STL提供的如交集set_intersection()、并集set_union()、差集set_difference()和对称差集set_symmetric_difference(),都需要进行大量的比较工作,那么使用底层是有序结构的红黑树就十分恰当了,这也是其相对hash结构的优势所在。
15.C++STL中map,set的底层实现全是用的红黑树,java,C#等语言同样如此。
map,set底层都提供了排序功能,且查找速度快。红黑树实际上是AVL的一种变形,但是其比AVL(平衡二叉搜索树)具有更高的插入效率,当然查找效率会平衡二叉树稍微低一点点,毕竟平衡二叉树太完美了。但是这种查找效率的损失是非常值得的。它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目
16. static的作用
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量
作用1:隐藏
未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问,全局变量名或者函数名前加static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
static全局变量只初始化一次,防止在其他文件中被引用。
作用2:改变生命周期
局部变量改为静态变量后是改变了它的存储方式(唯一的一次初始化),即改变了它的生存周期。
作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与局部变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
17.什么是全局解释器锁GIL
还有很多C++面试的经典问题,这些问题网上已经有很多的资料,只要百度搜索C++面试经典问题就可以出来,比如深拷贝和浅拷贝到区别

4.4 机器学习相关问题

对SVM了解多少;GMM+HMM;precision和recall的定义和公式;不平衡数据集的评估指标有哪些;接受者操作特征曲线(ROC);决策树是如何做到回归的;LR与线性回归的区别与联系;SVM如何避免过拟合;决策树为什么会产生过拟合;介绍一下EM算法;LR为什么用sigmoid函数, 为什么不用其他函数;LR和SVM有什么区别;LR和SVM在实际应用的区别;核函数和核技巧;SVM在哪个地方引入的核函数;什么是贝叶斯估计;减少Bias的几大原则;从方差偏差分解的思路来看交叉验证;分类模型和回归模型的区别;fisher准则函数;GBDT和XGboost的区别和联系;随机森林和GDBT的区别;GBDT,RF和XGboost在实际表现中很好的原因;GBDT的应用场景;XGBoost如何寻找最优特征?是又放回还是无放回的呢?XGboost的介绍以及是如何避免过拟合的

4.5深度学习相关问题

CNN相比传统的全连接的优点;RNN和LSTM对比;LSTM里面具体的结构;LSTM的变体;LSTM结构推导,为什么比RNN好;社区发现算法Louvain优化点在哪?难点?主要的工作是什么;L0,L1,L2正则化区别及解释;L1和L2正则先验分别服从什么分布;你有哪些深度学习调参的经验;如何选取batch size;解释一下梯度下降以及还有那些优化算法;深度学习中解决过拟合问题的方法;为什么drop-out可以正则化;BN的作用和详细介绍;介绍Alexnet,VGG,gooLenet(inception),Resnet,Densenet;为什么引入Inception网络呢;深度学习和传统方法的区别;1* 1卷积核的作用;小卷积核代替大卷积核的好处;卷积层与全连接层的区别;什么样的资料不适合用深度学习;何为共线性, 跟过拟合有啥关联;特征工程;pooling池化操作的反向传播;Fatser rcnn中,如何处理背景候选框和含有目标的候选框不平衡问题;ROI pooling总结;为什么不直接回归坐标;Fatser rcnn与rcnn的不同;全连接层的作用;SPP pooling是什么,了解吗; group convolution

4.6项目及深度学习框架相关

做了哪些调参?相比原始网络做了哪些改变?卷积网络中参数量及计算量?卷积层的尺寸如何计算?caffe和tensorflow是如何加载数据的?TensorFlow中的数据处理-tf.data.dataset API的用法;迁移学习是怎么做的?如何进行数据前处理?


以上是我自己的求职及转行体会,同时也跟师弟师妹分享了一下自己的面经和部分整理的内容,最后我想再一次强调,面经只是面经,必须得建立在自己的基础知识上,这也是为什么我建议大家一开始的精力都尽量放在基础知识的积累之上,后期在考虑面试问题,基础打牢以后后面的面试就变的轻而易举了,由于自己也养成了比较好的记笔记习惯,所以在过去一年里写了很多笔记,同时整理了很多求职资料包括面试的一些问题以及参考解答,比较重要的部分面试问题我已经在上面分享出来了,更详细的笔记内容以及整理的资料也可以有偿分享给大家,有需要的可以加我微信LoveOfXia,加微信请备注牛客-笔记资料最后祝师弟师妹能够经过自己的努力在2021年如愿找到自己心仪的工作。

#面经##算法工程师##转行#
全部评论
少了一个重要变量,自始至终都没有说学校。 不谈学历的转行都没有含金量。
3 回复
分享
发布于 2019-12-19 13:08
劝人算法,____
1 回复
分享
发布于 2019-12-19 13:54
淘天集团
校招火热招聘中
官网直投
tql 按照大佬的面筋再好好复习一遍
点赞 回复
分享
发布于 2019-12-18 22:27
tql,膜大佬
点赞 回复
分享
发布于 2019-12-19 09:31
学习到了,多谢楼主大佬的分享,受益匪浅,祝你工作顺利
点赞 回复
分享
发布于 2019-12-19 10:39
感谢,非常有用。笔记资料也很全,跟着大佬在好好准备
点赞 回复
分享
发布于 2019-12-19 21:36
大佬!!!
点赞 回复
分享
发布于 2019-12-20 17:00
谢谢分享!
点赞 回复
分享
发布于 2019-12-21 09:27
自闭少年,看到大佬的面经和学习经历哭了
点赞 回复
分享
发布于 2019-12-21 10:39
有人买了么,资料质量咋么样
点赞 回复
分享
发布于 2019-12-22 18:53
感谢,很有用。另外我想问本科学过运筹学,对转算法有帮助吗
点赞 回复
分享
发布于 2019-12-29 19:58
学长非常优秀,资料也整理的很好用
点赞 回复
分享
发布于 2019-12-30 22:51
m
点赞 回复
分享
发布于 2019-12-31 21:46
膜拜大佬
点赞 回复
分享
发布于 2019-12-31 21:46
大佬,中九土木研究生有没有戏啊,研究生课题该怎么准备呢。
点赞 回复
分享
发布于 2021-09-16 14:08
Lz也是交大的吗!?都是一个学校的,发现跟大佬的差距依然不是一般的大😂😂anyway!大佬可以加下微信嘛!我也想转!有点闭门造车,越学越没自信了…想快点找到实习工作。想加您的微信!(我的微信是sing_jang)!!谢谢大佬!
点赞 回复
分享
发布于 2021-10-11 17:29

相关推荐

科工2院 25所 总包25,给北京户口
点赞 评论 收藏
转发
48 368 评论
分享
牛客网
牛客企业服务