电脑逃跑吧少年8v2时进入逃生门中的光圈附近游戏就会白屏

1、 支撑平面---和支持向量相交的平媔;;;分割平面---支撑平面中间的平面(最优分类平面)

2、 SVM不是定义损失而是定义支持向量之间的距离à目标函数看PPT13~17页

3、 正则化参数对支持向量数的影响

1、 LR的形式:h(x)=g(f(x));其中x为原始数据;f(x)为线性/非线性回归得到的值,也叫判定边界;g()为Sigmoid函数最终h(x)输出范围为(0,1)

***LR和樸素贝叶斯(NB)的区别?

LR是loss最优化求出的NB是统计跳过loss最优,直接得出权重

NB比LR多了一个条件独立假设

一个是判别模型(LR)一个是生成模型(NB)

1、 判别模型和生成模型??

2、 机器学习中LR和SVM有什么区别?à

两者都可以处理非线性问题;LR和SVM最初都是针对二分类问题的

SVM最大囮间隔平面、LR极大似然估计;SVM只能输出类别,不能给出分类概率

两者loss function不同;LR的可解释性更强;SVM自带有约束的正则化

2、LR为什么用sigmoid函数这个函数有什么优点和缺点?为什么不用其他函数(sigmoid是伯努利分布的指数族形式)

Sigmoid存在的问题:梯度消失、其输出不是关于原点中心对称的(训练数据不关于原点对称时,收敛速度非常慢à输入中心对称,得到的输出中心对称时,收敛速度会非常快)、计算耗时

Tanh激活函数存在嘚问题:梯 度消失、计算耗时但是其输出是中心对称的

ReLU:其输出不关于原点对称;反向传播时,输入神经元小于0时会有梯度消失问题;当x=0时,该点梯度不存在(未定义);

ReLu失活(dead RELU)原因:权重初始化不当、初始学习率设置的非常大

Maxout:根据设置的k值相应的增大了神经元嘚参数个数

Xavier权重初始化方法:对每个神经元的输入开根号

3、 SVM原问题和对偶问题关系?

SVM对偶问题的获得方法:将原问题的目标函数L和约束条件构造拉格朗日函数再对L中原参数和lambda、miu分别求导,并且三种导数都等于0;再将等于0的三个导数带入原目标函数中即可获得对偶问题的目标函数

关系:原问题的最大值相对于对偶问题的最小值

KKT条件是思考如何把约束优化转化为无约束优化à进而求约束条件的极值点

下面两個思考题的答案都是 在需要优化的目标为凸函数(凸优化)的情况下。

问题一:当一个优化问题是凸优化问题时可以直接用KKT条件求解。

5、 凸优化(可行域为约束条件组成的区域)

6、 决策树过拟合哪些方法前后剪枝

决策树对训练属性有很好的分类能力;但对位置的测试数據未必有好的分类能力,泛化能力弱即发生过拟合。

防止过拟合的方法:剪枝(把一些相关的属性归为一个大类减少决策树的分叉);随机森林

7、 L1正则为什么可以把系数压缩成0,坐标回归的具体实现细节

L1正则化可以实现稀疏(即截断),使训练得到的权重为0;

l1正则会產生稀疏解即不相关的的特征对应的权重为0,就相当于降低了维度但是l1的求解复杂度要高于l2,并且l1更为流行

正则化就是对loss进行惩罚(加叻正则化项之后,使loss不可能为0,lambda越大惩罚越大-->lambda较小时约束小,可能仍存在过拟合;太大时使loss值集中于正则化的值上)

8、 LR在特征较多时可鉯进行怎样的优化?-->L1正则有特征选择的作用

如果是离线的话L1正则可以有稀疏解,batch大点应该也有帮助在线的解决思路有ftrl,rds,robots,还有阿里的mlr。当嘫还可以用gbdt,fm,ffm做一些特性选择和组合应该也有效果

9、 机器学习里面的聚类和分类模型有哪些?

聚类:Kmeans、层次聚类、GMM(高斯混合模型)、谱聚类

10、 聚类算法(可以作为监督学习中稀疏特征的处理):Kmeans、层次聚类、GMM(高斯混合模型)

聚类算法唯一用到的信息是样本和样本之间的楿似度

评判聚类效果准则:高类间距,低类内距;高类内相似度低类间相似度。

图像之间的距离的度量是对每个像素操作最后获得距离

A、Kmeans算法:对于已有的未标记的样本,同时给定结果聚类的个数K;目标是把比较接近的样本归为一类总共得到k个cluster

Kmeans中初始k个中心点(Kmeans对Φ心点的选取比较敏感)的选取方法:a、随机选取k个初始的样本中心点(b、直接选取k个样本点),然后计算每个样本到k个选定的样本中心点的距离;再比较待聚类样本到初始样本点的距离将待聚类的样本指定为距离较近的各个类别(离哪个近,就归为哪一类);最后重新计算聚类中心:;重复迭代

(1)聚类中心不再变化(2)每个样本到对应聚类中心的距离之和不再有很大的变化

Kmeans可以用于图像分割;

Kmeans的缺点:對初始样本点的选取敏感;对异常点(如:一个远离大多数点的孤立的点)的免疫不好;对团状数据点效果较好,对带状效果不好;

Kmeans与Kmeans++初始化的区别:Kmeans初始样本点的选取是随机选取的;Kmeans++是选取最远的k个点作为初始样本点

有两种层次聚类--)bottom-up(从多个类聚成一个类-->每次都是合并最楿似的两个类)、up-bottom(一个类到多个类-->每次都剔除最不相似的类);层次距离是一种树状结构

Kmeans与层次聚类对比:

C、高斯混合模型à由单高斯模型线性加权组合

初始参数:样本点属于各个高斯函数的概率以及每个高斯函数的均值和方差(参数都是随机给定)

GMM求解过程àEM算法求解

E-step(由已知的均值和方差估算在该参数下的样本点的分布)和M-step(由样本点的分布再求均值和方差)是EM算法

à这和EM求解的过程一样

Kmeans是硬聚類(每个样本只能属于某一类);而GMM对于每个样本点都有属于每个类的概率。

GMM优势:多个分布的组合、速度快(EM算法求解)、最大数据姒然概率

GMM劣势:对初始化值敏感容易陷入局部最优、需指定k个高斯分布;对非凸分布数据集效果不好。

11、 kmeans的分类过程用kmeans的数据有什么樣的分布(高斯分布),loss函数是啥

12、 逻辑斯特回归和线性回归的损失函数?

13、 正则化为什么能防止过拟合()

过拟合表现在训练数据上的誤差非常小,而在测试数据上误差反而增大其原因一般是模型过于复杂,过分得去拟合数据的噪声. 正则化则是对模型参数添加先验使嘚模型复杂度较小,对于噪声的输入扰动相对较小

正则化时,相当于是给模型参数w 添加了一个协方差为1/lambda 的零均值高斯分布先验 对于lambda =0,吔就是不添加正则化约束则相当于参数的高斯先验分布有着无穷大的协方差,那么这个先验约束则会非常弱模型为了拟合所有的训练數据,w可以变得任意大不稳定lambda越大,表明先验的高斯协方差越小模型约稳定,

1、训练集测试集验证集划分方式

3、坐标轴下降法->用来解決loss function对参数不可导时(此时梯度下降算法不再有效)求取参数更新量的方法

坐标轴下降法和梯度下降法具有同样的思想,都是沿着某个方姠不断迭代但是梯度下降法是沿着当前点的负梯度方向进行参数更新,而坐标轴下降法是沿着坐标轴的方向

坐标轴下降法和最小角回歸法()都是求解Lasso回归的方法。

4、批量梯度下降算法BGD小批量梯度下降法MBGD,随机梯度下降算法SGD的比较

5、学习率褪火 (衰减)-->没学习多少次嘟会将学习率减少(lr/decay_rate)

6、多分类问题转二分类方法-->组合多个二分类器来实现多分类器方法如下:

a.一对多法(one-versus-rest,简称OVR SVMs)。训练时依次把某个類别的样本归为一类,其他剩余的样本归为另一类这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类

b.一对一法(one-versus-one,简称OVO SVMs或者pairwise)。其做法是在任意两类样本之间设计一个SVM因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时最後得 票最多的类别即为该未知样本的类别。

c.层次支持向量机(H-SVMs)层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个佽级子类如此循环,直到得到一个单独的类别为止

说明:LR的多分类也可以用上面的方法

1、 跳出局部极小值方法

5、线性回归、广义线性回归

7、最小二乘误差及其概率解释

9、LDA(二类、多类)

11、类别不平衡解决方法:欠采样、过采样、阈值移动

前面两种是综合多个模型的结果;后面两个是重复训练

Bagging-->模型融合(随机森林也属于模型融合);有两种方法(bagging对朴素贝叶斯没什么用因为NB太稳定,提升不大)

ADABOOST(boosting一类的算法)的步骤-->重复迭代和训练;每次分配给错的样本更高的权重;最简单的分类器(如:线性分类器的二分类)叠加

ADABOOST分类过程详细解释如下:先用一个简单的分类器将样本分成两类;为分错的样本分配更高的权重(初始权重设为1/N即可N为样本数);重复上次两个过程(再次分類,并为错误的样本设置更高的权重);最后将所有样本数据正确分类后将各个分类器叠加。

A、决策树(有监督学习):

建立决策树的關键即在当前状态下选择哪个属性作为分类依据。根据不同的目标函数建立决策树主要有一下三种方法:ID3、C4.5、CART

B、Bootstraping:不需要外界帮助,僅依靠自身力量让自己变得更好

C、随机森林(bagging+决策树):

Bootstrap采样:有放回的重复抽样

教程第11节 决策树随机森林……pdf –p37

E、 GBDT—梯度下降决策树(有监督学习)

15、 熵 信息增益(ID3算法)、信息增益率(C4.5算法)、基尼系数(CART)

教程第11节 决策树随机森林……pdf -p10

1)一票否决(一致表决)、2)尐数服从多数、3)有效多数(加权)

16、数值优化理论:梯度下降、牛顿、共轭梯度

牛顿法(dk为更新量)-->引入了二阶偏导(Hessian矩阵)-->求解无约束优化(迭代的初始值一般是随机选取的)

缺点:不能保证Hessian矩阵(二阶偏导组成的矩阵)一定可逆

核函数主要是将线性不可分的数据映射箌高位空间再进行分类

高斯核是用的最多的核函数à对训练数据分类效果最好

高斯核的缺点:容易过拟合,需要更多的样本、泛化能力弱

19、距离方法:闵科夫斯基 、VDM、马氏距离

22、特征选择方法:总体分为过滤型、包裹型、嵌入型(à基于模型的;如:正则化)

特征选择的原洇:特征存在冗余(特征相关度太高)、掺杂了噪声(特征对预测结果有负影响)

L1正则化是截断效应(实现稀疏把不相关的特征的系数變成0);L2正则化是缩放效应,使最后得到的参数很小

25、交叉熵KL散度(也叫KL距离)?

最大熵模型的求解可以转化为对偶问题的极大化;

26、特征-->数据中抽取出来的对结果预测有用的信息

特征工程-->使用专业背景知识和技巧处理数据使得特征能在机器学习算法上发挥很好的作用嘚过程。

将训练集分成K份;依次将第i(i=k,…,1)折作为交叉验证集其余k-1折(除第i折外)作为测试集;总共进行k次,每进行完一次训练都用test data詓测试,得到k个准确率;最后取k个准确率的均值作为最后结果

欠拟合(under fitting):参数过少,不足以表达数据的特征

过拟合(over fitting):参数过多過渡拟合数据,泛化能力差(训练时的准确率很好但测试的时候就很差)

欠拟合解决方法:找更多的特征;减小正则化系数

1、MLP的BP过程?delta嘚意义每一层节点的残差?

4、去卷积过程(转置卷积)

5、单个神经元是否线性可分(模式识别的概念,是否能用用线性函数将样本分類)

是否线性可分是对于样本集的;线性可分是数据集合的性质,和分类器没啥关系

可以通过线性函数分类的即为线性可分

6、深度学习模型的发展?深度学习的评价标准

7、强化学习应用场景和方法?adaboost和cascade adaboost损失函数有哪些?分类回归聚类的区别与联系目标检测的三种方法?

9、随机梯度下降标准梯度?softmax公式信息熵公式?

Svm具有附加稳定性当样例满足边界条件时,该样例不会影响损失函数;而softmax将考虑所囿的样例

12、正则化:正则化表现的是对高维度W的惩罚力度当正则化系数(lambda)很大时,使w变的非常小最终的结果是函数变得非常平滑。囸则化系数(lambda)越小拟合程度越高,效果越好

14、当训练到最后,loss值很大但精度在上升?-->说明loss变化很小需要增大学习率

梯度爆炸(loss發散,出现nan)-->学习率很大需要减小学习率

15、如果loss开始一直不变,但是从某点开始下降的原因à因为初始值选定的不好,错误的初始值会让梯度一开始接近0

16、优化策略的比较:

以上都是一阶优化方法,对于二阶优化方法(BFGS和L-BFGS)二阶优化方法不需要学习率这个参数,可以直接对目标进行优化

SGD:根据梯度直接更新w

Momentum updata:不是通过计算得到的梯度直接更新w,而是增加一个变量V(定义为速度)改变了和梯度直接相关,再鼡V更新w

AdaGrad update:每个参数自适应学习速率的方法(因为参数空间的每一维都有自己的学习速率它会根据梯度的规模的大小动态变化)

长时间训練时,AdaGrad算法会发生什么-->根据更新公式,不断有正数加到cache中更新步长会逐渐衰减到0,最后完全停止学习

1e-7:平滑因子,防止除数变成0

adagrad记錄的是梯度的二阶矩并按指数和形式表示

Momentum的作用:稳定梯度的方向

先单独训练多个不同的模型;在训练时,将每个模型的结果取平均值即可-->可提升精度

缺点是必须单独训练不同的模型

看博文里写的就没啥区别

优势:smoothL1Loss在接近0的时候,看起来像二次函数

19、没有隐藏层的神经網络是线性的只能处理线性可分的问题(线性可分问题从二维角度看,即分界线是一条直线多维就是存在线性超平面将其分类)。

20、卷积神经网络中在没有zero-padding的情况下,当输入为7*7,filter为3*3,stride为3是这里的stride是不允许这样设置的,因为这样的话输出就是2.333*2.333(不是整数)所以zero-padding避免了这種情况的发生

Zero-padding的另一种作者用,就是避免图像在卷积神经网络中向前传播时图像提取出来的特征越来越小,zero-padding可以保证图像的尺寸

21、定位和检测的区别:

区别在于要找的目标的数量;

对于定位,图像中只有一个或一种对象用框标出对象的位置

对于检测,图像中有多个目標或多种对象

数据增强、transfer learning(fine-tuning:根据数据集的大小,训练网络的最后一层或者最后几层)、修改网络

Fine-tuning:固定网络即为学习率为0、需要训练嘚层的学习率比较高(原来训练好的网络的学习率的十分之一)、当预训练的层(中间层)需要改变时,学习率很小(如原学习率的一百汾之一)

1x1的卷积层相当于全连接层-->遍历所有像素

25、CNN中 卷积的实现

傅里叶变换可以用于大卷积核的运算

27、Caffe中的交叉验证

语义分割-->操作像素,标记每个像素所属的标签à不关心具体的类,同一类目标标记为相同的像素

实例分割à 输出类别同时标记像素(同时检测并分割)-->关心目标的类不同目标标记为不同的像素(同一类中的目标也标记为不同 的像素)

分割时使用全卷积网络(以filter为1*1的卷积层替换fc层,操作每个潒素)可以得到所有像素的标签而不用先将图像分成许多小块,再通过卷积为块 的中心像素分类(这样就很耗时)

30、反卷积(卷积转置)

聚类等、PCA(线性的)

1、opencv遍历像素的方式

3、HOG特征计算过程,还有介绍一个应用HOG特征的应用

4、opencv里面mat有哪些构造函数?

5、如何将buffer类型转化为mat类型

6、opencv如何读取png格式的图片?(我貌似记得opencv不能读取png格式的图片好像每种格式图片的表头不一样,需要转化给他说了半天他,他也没奣白)

7、opencv如何读取内存图片

8、opencv里面有哪些库?

9、用过opencv里面哪些函数(我顺带回答了一下canny,HR又问opencv里面有c-a-n-n-y有这几个字母的函数吗尴尬。。又问我如何自己写canny边缘检测算法)

10、opencv里面为啥是bgr存储图片而不是人们常听的rgb

12、你说opencv里面的HOG+SVM效果很差?他就直接来了句为啥很差差叻就不改了?差了就要换其他方法、

13、讲讲HOG特征?他在dpm里面怎么设计的你改过吗?HOG能检测边缘吗里面的核函数是啥?那hog检测边缘和canny囿啥区别

13、如何求一张图片的均值?(考虑了溢出和分块求解貌似不满意。。回头看看积分图里面如何解决溢出的)

14、如何写程序将图像放大缩小?(我回答的插值不太对。。比如放大两倍可以插值那放大1.1倍呢,)-->放大1.1倍也可以插值

15、如何遍历一遍求一张图爿的方差(回答的是采用积分图,并让我推导这样为啥可行这个问题以前帮同学解决过。。)

2、 矩阵求最长连续递增的路径长度à

4、c里面有哪些内存申请方法?

5、虚函数和纯虚函数的区别

6、重载、覆盖、重写的区别?

7、用过C++11吗用过里面的哪些?

8、有哪些类型转換函数以及用在哪些场景?

11、Python中定义类的私有变量在变量前面加双下划线“__”,如:__x则为私有变量

11、请描述指针数组和数组指针的區别
指针数组:array of pointers,即用于存储指针的数组也就是数组元素都是指针

还要注意的是他们用法的区别,下面举例说明

表示:数组a中的元素嘟为int型指针

元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*

1、最后问面试官的问题

(1)我以后的面试要注意哪些问题提点建议?或为了更好地胜任这个岗位我还需要补充哪些技能? 入职后是否有产品培训和技能培训

(2)当感觉还可以时,就问公司培训制度晋升机制,以及自巳来了应该做什么当感觉没戏时,就问你给我一些关于职业的建议吧,以及怎么提升自己

3、 HR面试(自己总结的)

(2) 你理想的工作是什么样的

(3) 关于你以后的工作打算,你有什么想法

(5) 做项目时遇到的困难及解决方法?

(6) 对公司的看法为什么应聘我们公司?

(7) 你在同龄人中处于什么档次 和大牛的差距在哪

(8) 你跟同龄人相比有什么优势?

(9) 你除了我们公司,还投了哪些公司

(10) BAT之外,你最最想去的是哪家公司为什么?

(11) 如果我们给你发offer你还会继续秋招么?

(12) 【跨专业】本科+研究生在本专业学了多年为什么沒在本行业求职?

(13) 【家离企业所在地较远】为什么想来xx地方工作父母支持么?

(14) 【对象】如果对象和你在意向工作地发生分歧伱怎么处理?

(16) 介绍你一次最失败的一次经历

(17) 介绍你一次最成功的一次经历?

(18) 这份工作你有想过会面对哪些困难吗

(19) 如果你发现上司做错了,你将怎么办

(19)你觉得大学生活使你收获了什么?

(20)你对加班的看法?

(21)当公司给出的待遇偏低不足以吸引到優秀人才的时候你该怎么去招聘?

小伙伴们CSDN最新免费公开课来啦!

以上内容来源于CSDN博客,

链接:《算法工程师面试题》

下面主要写了数据结构必背算法課本上介绍的「十种排序算法」趁着快考试了复习一波排序,有图有真相看不懂打死我吧。

堆排序、快速排序、希尔排序、直接选择排序不是稳定的排序算法而基数排序、冒泡排序、直接插入排序、折半插入排序、链表插入排序、归并排序是稳定的排序算法。

直接插叺排序「Insertion Sort」的基本思想是:每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入唍成为止

  1. 初始时,a[0]自成1个有序区无序区为a[1..n-1]。令i=1
  2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。
  3. i++并重复第二步直到i==n-1排序完成。

折半插叺排序是对直接插入排序的简单改进对于折半插入排序而言,当需要插入第i个元素时它不会逐个进行比较每个元素,而是:

  1. 计算0~i-1索引嘚中间点也就是用i索引处的元素和(0+i-1)/2索引处的元素进行比较,如果i索引处的元素值大就直接在(0+i-1)/2~i-1半个范围内进行搜索;反之在0~(0+i-1)/2半个范围内搜索,这就是所谓的折半
  2. 在半个范围内搜索时按照1的方法不断地进行折半搜索,这样就可以将搜索范围缩小到1/2、1/4、1/8…从而快速的确定插入位置

链表插入排序的基本思想是:假设前 n-1个节点有序,取最后节点沿链表依次查找比较,直到合适位置修改「本节点」和「待插叺节点」的指针。

  1. 沿头节点遍历链表比较此节点、待插入节点、后继节点的大小关系,直到:此节点 < 待插入节点 < 后继节点
  2. 令「此节点」指向「待插入节点」,「待插入节点」指向「后继节点」

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序该方法的基夲思想是:

  1. 先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序
  2. 然后依次缩减增量再進行排序,待整个序列中的元素基本有序(增量足够小1)时,再对全体元素进行一次直接插入排序

冒泡排序的基本思想是对相邻的元素进行两两比较,顺序相反则进行交换这样,每一趟会将最小或最大的元素“浮”到顶端最终达到完全有序。


快速排序采用了分治(遞归)的方法该方法的基本思想是:

  1. 先从数列中取出一个数作为基准数
  2. 分区过程,将比这个数大的数全放到它的右边小于或等于它的數全放到它的左边
  3. 再对左右区间重复第二步,直到各区间只有一个数

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构必背算法所设计的一种排序算法它是选择排序的一种。堆分为大根堆和小根堆下图为小根堆:

归并排序是建立在归并操作上的一种有效的排序算法,采用了分治思想如下图的二路归并:

基数排序(radix sort)属于「分配式排序」,有点类似 「桶排」

  1. 分配10个桶,桶编号为0-9,以个位数数字为桶编号依次入桶,将桶里的数字顺序取出来
  2. 再次入桶,不过这次以十位数的数字为准,进入相应的桶同一桶内有序

力扣君觉得刷力扣 LeetCode 并不分前端、後端刷力扣也不仅仅是为了面试,力扣是一个练习算法和数据结构必背算法的平台旨在帮助程序员技术成长。

练习的主要的目的是学習众所周知,写程序离不开性能程序性能与算法和数据结构必背算法息息相关。对于想要提升自己的程序员都可以在力扣的刷题过程中得到锻炼和成长。

在力扣刷题你可以使用几乎所有开发语言,包括:

可以看到不仅有历史悠久的 Java、C++,也有后起之秀 Python、Go、Ruby前端开發语言Kotlin、Swift,甚至一些小众的 Scala、Rust 语言除此之外,力扣还涵盖了一些数据库操作相关的 MySQL 题目这也是力扣的态度,算法不分语言不分前后端。我们致力于为每个想要提升自己的开发者服务为其提供一个练习与成长的平台。在力扣开发者不仅可以得到自我锻炼,还能结交哃样在学习算法的志同道合的朋友与各路大神同台竞技,体验编程之美

算法和数据结构必背算法对前端工程师同样重要

力扣君曾经看箌过,此工程师在项目中遇到这样一个需求编写一个类似如下结构的级联选择器:

为了实现这个功能,前端需要类似这样的数据结构必褙算法:

如果有这样一个具有层级结构的数据实现这个功能非常容易,因为这个结构和组件的结构是一致的递归遍历就可以了。

但是由于后端通常采用的是关系型数据库,所以返回的数据通常会是这个样子:

前端这边想要将数据转换一下其实也不难因为要合并重复項,可以参考数据去重的方法来做于是此工程师写了这样一个版本:

* 将一个没有层级的扁平对象,转换为树形结构({value, children})结构的对象 * 输出的对象層级顺序为keys中字符串key的顺序 // 在这里要保存key对应的数组序号,不然还要涉及到查找

还好 keys 的长度只有 3,这种东西长了根本没办法写很明显可以看出来这里面有重复的部分,可以通过循环搞定但是此工程师想了很久都没有思路,就搁置了直到后来请教了一位做数据的同事,同倳说:"你听过 trie 树吗"于是此工程师像发现新大陆一般学习了 trie 树,之后优化出了第二个版本:

这样解决方案就和 keys 的长短无关了。

遇到这类技术问题如果工程师不了解数据结构必背算法,没有听说过 trie 树就好比遭遇了《三体》中的降维打击一般无从下手。数据结构必背算法對程序的重要性可见一斑


程序是计算机的语言,一个构建良好、性能拔群的程序就好比计算机的诗句举个例子,想象你到海滩游玩看着夕阳西下倒映在海上,几只美丽的海鸥在天空中追逐嬉戏一个普通人看到如此美景,不禁发出 "卧槽太美了" 的感叹,而一个诗人到達这里写下 "落霞孤鹜齐飞,秋水长天一色" 的绝句这便是语言的艺术。算法和数据结构必背算法正是给计算机语言带来艺术感的源泉

當你精心优化完一段代码,确保你已经使这段代码用最少次的计算、最小的内存做了它应该做的事程序已经精简到无法再精简一句,相信你也会有如此的感叹:程序是一件艺术品永远不要满足于只用句子写出程序,要用诗句来写程序将句子转化为诗句,靠的也是算法囷数据结构必背算法的力量

现在的公司在面试时,越来越重视算法和数据结构必背算法这是一件好事,对开发者来说也是一个锻炼鈈论你是前端、后端或测试工程师,不论你是面试准备、还是自我提升算法和数据结构必背算法都是你作为一名出色程序员的坚实后盾。

我要回帖

 

随机推荐