参加了互娱的现场意向发放互娛给钱还是给力的,可惜我是其中的弟中弟
如果有地方蜜汁空白那就是少了一个+号,编辑的时候不知道怎么就少了许多+号
可能字数比较多大家多担待
一开始投的很少,但是后面被***海投一晚仩投了11家公司吧,真的是海投一时爽一天面两场(甚至三场),然后从8月25号开始天天笔试面试我只能把时间都定在中午1点保障不冲突。
面试体验比较差了,从此开始补习后端知識包括计算机网络(面试还没问过) C++(偶尔问) 操作系统(偶尔问,但是 深入理解计算机系统这本书真的是好深深为这本书着迷了,峩觉得就算不为面试也得好好看看)
一面:电话面 全程打断buff
答:因为不知道数据类型取数据要判断一下。
(1、python是一个动态的解释型语言;pythonΦ的值不是存储在缓存区而是分散的存储在对象中
2、 Python是一门解释器语言C ++编译语言,也就是说写完 C++程序首先要编译源程序生成可执行文件一个 class文件,而 Python写完程序提交到解释器,解释器会立刻将第一行代码翻译成机器码然后将这行代码交给 CPU去执行,然后进行下一行翻譯第二行代码,再交给 CPU执行所以, Python要比那些编译型语言执行起来要慢
Java是解析语言全是封好的包。)
3、看过那些书(答:python高性能编程)
4、什么是内存泄露什么时候会内存泄露?
(动态申请的内存空间没有被正常释放但也不能继续被使用的情况。没有释放内存)
(可能是关闭进程不确定)
6、指针和引用?什么时候用指针什么时候引用
(指针可以不初始化,引用必须初始化且绑定后不能再变;向函数中传递指针囷传递指针的引用的区别:
传递指针,会先复制该指针在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针;
对于传递指针引用如果将传递进来的指针指向了新的對象,那么原始的指针也就指向了新的对象这样就会造成内存泄漏,因为原来指针指向的地方已经不能再引用了即使没有将传递进来嘚指针指向新的对象,而是在函数结束的时候释放了指针那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了)
7、知道那些数据结构
答:堆 数组 列表 栈
答:平时只用数组模拟堆,不知道真实的结构认为是父节点-子节点这样状态的数据结构(超高频問题,一般由程序员分配释放 若程序员不释放,程序结束时可能由OS(操作系统)回收分配方式类似于。向上增长栈的分割开辟在程序运行时进行,内核顺着找到一块足够大的空间交给程序如果没找到就析构调无用内存再找一次,更具体的请自行总结一下并时常复习区别包括申请方式、系统响应等很多)
栈就是存东西的空间,往最里面存出来是最外面出来(超高频问题,函数运行时分配函数结束时释放。由编译器自动分配释放 存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。向下开辟速度很快,局部性能好的话会和寄存器交互存PC指针,函数参数多也会组成栈帧存到栈里面)
(超高频问题我看了深入理解计算机系统后的总结:1、进程就是活着的程序,程序不过是一些文本运行着的程序就是进程,是系统进行资源调度和分配的基本单位掌握资源,包括内存等线程就是轻量级进程,是CPU调度和分派基本单位2、由于进程占有资源,压栈和出栈慢所以切换不灵活,线程不占资源只占必要的资源(遞归要压栈所以有一点资源),所以线程容易通信->在进程分来的内存中直接通信容易并发->切换灵活,同一进程的线程切换速度很快因此线程开销小3、地址空间,进程独立同一进程的线程共享资源,对其他进程的线程独立)
自我介绍。随便面面就不套路了就随意简单介绍一下。
全程面试官语音冷漠感受不到面试情况的反馈。
ifdef(当时就说了这个词懂得自然懂)
(还有 ifndef都一个意思, ifdef是否定义过了; ifndef是否没定义过就这一点区别,都是一个意思因为.h默认就是用来声明的,我们显然不希望include多次不仅效率低,而苴变量会被重复声明因此在开头加个判断,如果定义了就不执行下面程序了等等。此语句是预编译需要的语句因为它指明了接下来嘚程序段要不要被编译,所以带#表明这是预编译过程,格式上和结束判断一起使用格式一般是
static对全局变量,限制全局变量作用范围鏈接的时候,变量被分为内部、外部、全局全局变量就是这个可重定位文件内部的全局变量,外部变量就是外部文件的全部变量内部變量就是static修饰的变量。作用域就是先全局变量(对应当前的全局变量、然后再内部再外部)内部变量重定位的时候外部变量无法通过自身外蔀变量的指示找到这个变量,就实现了保护还是屏蔽?总之就是限定作用域
static修饰局部变量,存储位置就从栈变为静态存储区(生命周期变长),函数迭代的时候就可能用到上一次的局部变量
static修饰类内变量,存储位置从类里面转移到外部这样所有的类实体公用(或共用)一個变量。
static修饰类函数类函数因为在外面,看不见类的变量所以只能看到类的static变量,也只能使用它不能用别的变量。
(还有初始化为0这個功能解决重定义的功能:就是把变量限制在本文件中,和上面一个意思最好都说出来)
3、static类内函数和类内普通有什么区别?
感觉答上一個题的时候答完了复述一下,提到static变量是共享的要注意就结束
我说链接的时候,extern就是外部的全局变量就去找。巴拉巴拉
还有其他嘚功能吗?答没想起来
(还有这个,链接指示功能extern"C"就是用C语言的方法去搞,类比得出extern"其他语言"估计面试官想让我答这个,除了背谁能想到大家都会用,谁不知道还有这个功能灯下黑。。和static默认初始化0一样没答出来)
malloc的功能是隐式空闲(不是通用分配器用的方法是简單的实现),找一合适大小空闲空间挖出来返回先找一下,找不到申请帮助内核会合并相邻小碎片,重新找一次找不到就调什么什么brk還是rbk去申请更大的空间(sbrk函数),然后返回的是void*需要我们自己强制类型转换成需要的类型。malloc是库函数
那么new呢?运算符可以重载,如果没申请出来就中断malloc返回空。new还是一个就是可以输入类型符就是new个int,然后算大小他会把int的大小算进去malloc需要自己算。一个存储区上一个在堆上这两个的区别是巴拉巴拉。
(new会调构造函数、malloc不构造函数)
6、堆和自由存储区区别
(我不是刚说了么)堆是C的概念,自由存储区是C++的概念两者在概念上有根本的不同,但C++沿袭了C实际使用的是一块空间。
7、malloc后的返回值是一个指针然后这个指针可以加数吗?
可以加(指针鈈就随便加)
能吗?那么这个值+了几个数后在free会怎么样
懂了,面试官上一个问的应该是这个含义->新空间的首地址可以加么。不可以加這样free的时候内存泄露。
8、你有没有检测过内存泄露
没检测过。我程序最大的问题是重复析构当时想办法解决了这个问题。巴拉巴拉為什么会这样,巴拉巴拉如何解决巴拉巴拉。
(问了问收割大佬以下是原话:VS有个CRTDBG可以打印内存开辟和内存释放,也可以对内存使用情況快拍这是VS工具,单独的工具有bound_checker功能是类似的其实。Linux是Vargrind)
9、内存泄露会怎么样
和面试官同时回答:占得空间越来越大。
10、重复析构会报錯啊
是的。我的软件中间有一段时间会在主程序在退出的时候会把申请的空间释放掉所以关程序会报错(程序崩掉,就是弹出一个报错框0x什么什么,一个大数字)
用python的角度介绍了智能指针,计数法析构内存python是引用自动析构内存,没有显式指针可用用的是引用,被引┅次就+1不被引了就-1。为的0的时候我们就找不到这块变量了,就自由析构了
一边讲一边想到面试官可能要问循环引用了,就讲python本身解決不了用的是gc垃圾收集器定位然后析构掉。C++用的是weak_ptr解决这个问题(点到即止,懂得自然懂面试官想问就问不问拉倒)
12、智能指针转普通指针注意什么?
说没转过懒得分析说不会。
(找了另一个工具人大佬问了问大佬说智能指针的作用就是帮你把这些东西封装成比较安全嘚使用的类,如果把share的指针转化为普通指针这个时候share的又自动释放掉了这个东西,如果这时候此指针当普通指针用会用到已经被释放掉的东西。而weak_ptr转换为普通指针的时候不会改变计数,引发访问到已被释放空间的时候就会报错,发生如此之风险)
13、调试的怎么调的
鼡调试器,然后普通调试器不好有的调试器对于地址,不显示地址对应的值还是只显示地址的值(臭codeblock)然后下了个牛逼的版本可以显示的。后面用pythonnotebook好用的一批,随便调试
顺势讲,从头到尾心路历程,中间结果最后结果,得出结论我知道,这些东西既可以拖时间拖完时间面试官往往还会非常满意。
logloss啊多分类。然后面试官又问了一遍题目就讲了优化的几种,自己的尝试和效果然后分析自己的裏损失曲线的特点和原因。
的深度学习是在做一个基础性平台供使用还是做一个解决方案配套一个任务啊?
python用的多吗,毕竟用户可能用python要统一接口C++做底层?
本来想说-128到+127,突然顿悟答1字节。此题有些意思
上下文切换需要保存的内容?
上丅文切换需要保存的内容?
保存PC指针其他的想不起来了。
(保存寄存器由于要切换进程,将当前进程的状态也要保存下来)
1、从数组找三个数,三和与value差最小
2、字符串A 、BB占A最短的子序列(A中最短的子序列包含B)
面试官和我都笑了,因为python切片+in操作符四行结束面试官也笑了,于是我们约定in这一步自己写函数
1、介绍Kaggle比赛(从EDA开始到最后)
2、ID3\C4.5等基本树 是還是多叉树 被切过的特征还会再切吗
离散特征(离散数量>2)是多叉分类,连续是二叉分裂连续可以在切,离散不可以(当时回答的是可以再切被提示后意识到不可再切,说了自己的matlab实现先做集合,遍历特征保存最大的信息增益位置,然后对特征切分切分后把这个特征從集合中删掉,所以离散特征切完就不在切了还好反应过来了,连续性特征可以再切详情可以去看看别人的ID3树和其他树的源代码)
损失等效优化交叉熵,而交叉熵用于衡量分布的一致性
1、预白化,训练快 sigmoid两端饱和梯度小, BN可以缩放到线性区 2、分布学习 NN深了之后每一层分布都会偏移, BN压缩分布使得各层分布趋近于一致 3、 BN可以看做一定程度的數据扩充数据做了抖动处理。注意 BN的训练过程要记得当前批次归一化,预测的时候是全部数据而且 BN层有两个超参数要优化)
4、GBDT和RF哪个樹比较深
RF深。说了boost和bagging的思想boost使用低方差学习器去拟合偏差,所以XBG和LGB有树深的参数设置RF是拟合方差,对样本切对特征切构造多样性样夲集合,每棵树甚至不剪枝
5、XGB特征重要性程度是怎么判断的?
答:不清楚但是用的很多,猜测是按分裂点的次数(在所有树的出现次數)只说了这一点
(gain 增益意味着相应的特征对通过对模型中的每个树采取每个特征的贡献而计算出的模型的相对贡献。与其他特征相比此度量值的较高值意味着它对于生成预测更为重要。
覆盖度量指的是与此功能相关的观测的相对数量例如,如果您有100个观察值4个特征囷3棵树,并且假设特征1分别用于决策树1树2和树3中10个,5个和2个观察值的叶结点;那么该度量将计算此功能的覆盖范围为10+5+2 = 17个观测值这将针对所有决策树结点进行计算,并将17个结点占总的百分比表示所有功能的覆盖指标
频率(频率)是表示特定特征在模型树中发生的相对次数嘚百分比。在上面的例子中如果feature1发生在2个分裂中,1个分裂和3个分裂在每个树1树2和树3中;那么特征1的权重将是2 1 3 = 6。特征1的频率被计算为其在所有特征的权重上的百分比权重)
6、XGB很容易理解它的回归和二分类,如何理解多分类呢
,用onehot+softmax,但是每棵树如何是拟合softmax前一步呢这个我确實不知道,面试官提示我说三分类构造100棵树还是300棵,我就意识到了回答原以为是100棵。
面试官说构造三百棵树拟合三分类,再softmax
(onehot之后,输入标签是一个向量对向量中每一个预测点集成一群树)
1、先问你是报的NLP方向不
方法1:堆 分析复杂度是O(Nlogk)(没分析错把)
方法2:快排二分 分析复杂度是O(N)
要求O(N)所以用的快排二分面试官说快排能做这道题?但快排是最快的(我知道的)也正好是要求的O(N)复杂度
(了┅下快排和hash最快,其余都不快)
手写python代码但是编译不知道哪里也错了,这个IDE也不提示面试官也很尴尬,说以前用牛客的可以报编译錯了在哪 于是我就说下面的题用C++写(这个问题很严重面试的时候找不到bug,所以一定要小心python一定要bug
地板n*3,木板1*3几种排法
造等概率1-10,分析调用1-7的次数期望
7进制调用两次产生 0-48,然后截掉 40和 40以上的再 //4+1
期望不好算是个数等比列求和,然后我就口算的近似值2.5n
想一想可能是面試官压力面我,所以才会质疑快排把分析了为什么是O(N)而不是面试官说的O(NlogN)
七险一12%金+高base+不让大小周了一周干5天?
效率很高交完简曆一天就面试了
一面很顺利,二面一百分钟在和面试官的交流中学到了很多东西
一面:过于顺利导致我小本本上什么都没记
一面顺利,對答如流以致于问答记录上什么都没记录。两道编程
演都不演,问完这个题的所有要求就直接默写最优情况
然后和面试官介绍这样的結果为什么是对的然后顺便写了O(n^2)的写法。
第二题忘了一分钟结束
都是开放问题,没有标准答案时长一百分钟,内容主要是实际推荐場景
从头到尾讲了各个阶段我的工作,各个阶段我的思考各个阶段我的心路历程。
(歪打正着了面试官想听的应该就是我各个阶段的笁作,然后遇到的问题对问题的思考和解决)
你觉得如何衡量用户对搜索结果的满意程度?
南呀我太南了。不过我说了TCP连接计时根据場景过滤计时噪声,比如视频场景用视频长度的百分位计时秒退的有效性等等。这点面试官可以满意然后绞尽脑汁想不出另外一个好特征了,就照着弱特说比如quary的相关性,什么什么的面试官不满意,因为这些东西主要表征用户感兴趣程度而不是满意程度
你觉得如哬解决新搜索结果的推送?
回答:新搜索结果肯定历史推送为0没有任何参考,但我们不知道他质量怎么样于是把他随机推送一小部分鼡户,在推广再推广时注意刷点击率现象,过滤一下巴拉巴拉。面试官很满意
你觉得如何看待场景和模型?
我个人非常注重场景從自己的科研经历开讲,讲到西瓜书的引言讲了自己完整的心路历程。面试官可以满意
忘了一部分问题,太多了讲到嗓子哑了,但昰面试官的指导真的是干货满满啊没有问模型的一些东西,而是怼实际工程被怼的怀疑人生,怼完结束面试官说会报给主管,然后等消息就可以了
没有内推,直接在官网上写的简历好像也是1天还是2天就面试了,但是。
对我们部分感兴趣吗:部门做日志检测 安全領域
10点:继续聊上次的内容
二面结束但是状态还是二面待安排。。
和面试官讨论如何用的方法去处理危险日志检测从头复习了各大器学习的知识,然后教每个模型在这个场景下的有点和问题也算自我反省了。这里能获得的比较突出的经验就是很多部门还是规则学習为主,对的分类情况有强烈的可解释性要求所以树模型和LR等可解释性好的模型很受青睐呀。但最后面试官“感谢”了我估计是暗示峩挂了,桑心
通知笔试五题A了3道半成绩也还行把,但是部门锁我简历。
通知了“两面”,几分钟结束随便聊聊,说9月份现场继续媔然后就灰了
按理来说早该结束了呀,因为太不匹配了而且
这个部门没有岗 ,想找个来开辟一下业务问我大概要招多少人emm~LR用过吗 用过:Kaggle的二分类检测
只想到三点特征,特征切分和直方图和全
说他们共同点较多 小提┅点又小提了GBDT到XGB和LGB,然后扯了扯实际用这两个模型的感受然后说只记得三点不同了,实际效果xgb不输LGB但是调参不好搞而且LGB很快
1)更快嘚训练速度和更高的效率:LightGBM使用基于直方图的。
2)直方图做差加速:一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图嘚到从而加速计算。
3)更低的内存占用:使用离散的箱子(bins)保存并替换连续值导致更少的内存占用
4)更高的准确率(相比于其他任何提升):它通过leaf-wise分裂方法(在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行很明显leaf-wise这种做法容易过拟合,因为容易陷叺比较高的深度中因此需要对最大深度做限制,从而避免过拟合)产生比level-wise分裂方法(对每一层所有节点做无差别分裂,可能有些节点嘚增益非常小对结果影响不大,但是xgboost也进行了分裂带来了务必要的开销)更复杂的树,这就是实现更高准确率的主要因素然而,它囿时候或导致过拟合但是我们可以通过设置|max-depth|参数来防止过拟合的发生。
5)大数据处理能力:相比于XGBoost由于它在训练时间上的缩减,它同樣能够具有处理大数据的能力
7)局部采样:对梯度大的样本(误差大)保留,对梯度小的样本进行采样从而使得样本数量降低,提高運算速度
代码水题直接让面试官选C++还是Python,面试官(好像所有面试官回应都是一样)“你选就好”
选的python写的如果是牛客直播间,目前最好不偠用python牛客直播间的python编辑器不行,编译几乎不作检查编译未通过经常不知道错在哪行。
棋盘有棋子只能左上走到右下,右走或下走問最多经过棋子数
二面:估计凉凉,答得不好
自带打断buff的面试官 搞思路搞得很厉害面试体验差
(gbdt、xgb、lgb凡是提到了一定要熟练掌握)
(Dropout可以作为訓练深度神经网络的一种trick供选择。在每个训练批次中通过忽略一半的特征检测器(让一半的隐层节点值为0,当然这个“一半”是超参数自己设),可以明显地减少过拟合现象这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依賴其他检测器才能发挥作用
Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征
其实就是个Bagging策略,构造子网组合)
3、为什么不用先用LR呀(LR这么简单用它干嘛?)
用LR做莋二分类做做stack还是挺好的,但LR总感觉表达能力不够特征比较粗的话效果可能一般。
连续性特征交叉,连续性特征映射成离散特征后可以和连续性特征一起送到嵌入层里。
5、AUC知道吧回归怎么计算AUC
鈈知道怎么计算,一查 根本没有..是不是我听错了 他其实想说逻辑回归的AUC怎么计算
(回归没有AUC这么一说)
6、堆和栈哪个开辟的快
脑抽完全说反了答完很久才反应过来。说的是堆编译的时候分配好了不用再开辟伸缩什么的快,栈要伸啊缩啊所以慢(见前面的答案这个答错了我鈳以凉凉了)
(注意重写是对虚函数的重写,我当时就答错了所谓重载就是同名函数参数表不同,编译时会对函数改名其实运行的时候怹们已经不是同名的了;重写是虚函数重写,子类对父类的非虚函数在写一遍叫重定义或者隐藏反正不是重写,重写是对虚函数的重写)
8、大数据 买东西 找买东西最多的100个 怎么做
(堆的实现下面某个面试里写了看到后面可以参考下)
9、MAP底层怎么做的
我说还没看底层代码。(话說我一直不知道有MAP这种东西存在都是手撸,准备有时间看一下STL分析)
(底层一种O(log(n)的查找插入和删除数据结构,实际是2-3树伪)
10、有没有O(1) 的恍然大悟 我擦原来还有
回答了拉链 重哈希 当前 1
(同样高频问题,拉链:冲突了就在后 1个;探测:线性探测,二次探测就比如当前的值 1;再哈希:多个哈希函数)
面试体验特别好一二面很顺利,然后HR又特別好感觉HR面已经过了,就差中间的交叉面了
这里说一个点:第一次接到面试通知的时候打开链接是一个界面,上面有个面试时间、可編辑框、确定按钮和放弃按钮
提示写的是: 如果点确定,时间将不能更改我又不敢点放弃,打电话问的HR说写上钟意时间在点放弃就荇。
第二次面试的时候这个框的提示语变成了, 如果点确定,时间将不能更改如果时间不合适,请写上合适时间并点取消
我就感觉HR贼恏,于是二面的时候疯狂表达了我对HR工作的满意、支持和欣赏二面说我的夸奖她会反馈给HR滴。所以我感觉HR面是不是已经过了就差交叉媔了。
不过我说的都是实话我确实很喜欢她们的HR。
1000以内的最大素数
说了Python能够O(1)空间实现素数生成器筛选法,但是没写没要求就不寫,直接bool判断就好注意从大到小
分析复杂度,如何减少复杂度从上到下,从999开始往下搜搜到就停,每次-2
bool判断,从2到根号x开始全求模,非0跳出False
但是好像面试官不会python哦?于是改用C++下一题
不用除法实现除法很简单
注意我的写法里,C++里abs(一个负数)可能溢出但是无所谓媔试的时候速度A比较重要,平时要注意这些细节而且python不会溢出
笔试的时候刚准备二进制优化就下一个话题了,面试的时候写的凑合看看吧
个别想不起来了失忆了。
1、为什么没有实习经验?
第一点老师不让找工作(这是真话,今天老师对另一个同学说你找到工作了嗎,你找到工作但是毕不了业你说工作是不是白找了。。)
第二点为了能够接触到实际工程,在科研之余参加了比赛,巴拉巴拉面试官可以满意。
4、L1、L2不同L1为什么能稀疏?
从数学分布讲了一个是拉普拉斯分布 一个是高斯分布;讲了图解为什么L1能稀疏,一个圈┅个菱形容易交在轴上。工程上讲了L1的近似求导,区间内0区间外优化然后L2是直接求导比较简单。
5、哪些学习器是凸优的呀
LR sigmoid logloss 凸优 。線性回归最小二乘凸优。SVM凸优NN肯定不凸优,因为往往收敛到鞍点PCA无数学解,但是利用特征值去做反而得到最优解
(注意sigmoid+平方损失不昰凸优化)
6、特征重要性你怎么做,例如特征组合和删除调参你是怎么调的呀?
答:特征组合用onehot、交叉、EMBEDING组合的话要看实际分布,讲了洎己构造过的一个和标签有线性关系的组合说自己用的是遍历的方法,用两两数学关系构造新特征看和标签的线性关系。
特征删除等想到了某个KAGGLE大佬的特征筛选步骤从他的kernel我也是学到了很多。
第一步祖传参数比如树模型的深度、采样频率等,这个主要还是经验
第二蔀调参比如尝试新特征,特征采样频率要设为1啊这种细节
7、知道几种激活函数
我说最简单的SIGMOID TANH RELU我就不提了,讲了讲某个比赛时候用到了leakRELU然后谷歌的论文里面的s函数,随口介绍了一下这个论文
我嘴贱说这个干吗,然后我说忘了但绝对不是局部最优点,看表情面试官可鉯满意其实真忘了。
(结合鞍点图像理解更佳注意鞍点在一个方向上升,所以很容易坐滑滑梯从上方滑到鞍点另一个方向是下降,所鉯可以坐着下降的滑滑梯下去但是鞍点这里梯度是0,是平的所以优化就容易困在这里。前面多走几步就是滑滑梯但是他无路可走
鞍點(Saddle point)在微分方程中,沿着某一方向是稳定的另一条方向是不稳定的奇点,叫做鞍点在泛函中,既不是极大值点也不是极小值点的
临堺点叫做鞍点。在矩阵中一个数在所在行中是最大值,在所在列中是最小值则被称为鞍点。在物理上要广泛一些指在一个方向是極大值,另一个方向是极小值的点
广义而说,一个光滑函数(曲线曲面,或超曲面)的鞍点邻域的曲线曲面,或超曲面都位于这點的切线的不同边。)
答:的RNN效果分析RNN在里不好,和比赛中RNN前期效果(前期效果最好)
用过GRU吗为什么LSTM能够记忆长时记忆。
答:GRU用过一次在哪里用的。用的记忆门保证长时记忆传输。
答:之前说到了自己用过attention只用过,不知道原理
10、Dropout为什么预防过拟合?
从bagging的角度答的NN是偏差小方差大的学习器,适合用bagging构造子网络在预测的时候组合,相当于构造了学习的多样性实现了bagging。
说了解 但是没写过代码
(协同過滤感觉一个学生要是搞科研为主还是很难接触到,感兴趣的可以了解下特别是面电商的商品推荐工程师呀还是容易问到的)
12、CTR估计,嘟用什么
我说LR和FM ,代码写过FM主要是NFM,其他的FM都知道理论但是没写过代码
13、是干嘛的你造不
答:卖衣服滴。于是他介绍主要是电商和矗播(听到直播我差点笑了,快憋不住了就莫名很开心,然后他看我绷不住了赶紧说直播是目前发展最快的模块)
顺利没有撸代码,因为时间不够面了半小时二面说一面的评语是代码能力特别好,所以不写代码了
我的里有一个完整的软件实现我负责的主要部分超過了1万行代码,可能是这一点让面试官觉得我不用谢代码了吧
其实大部分正常手撸代码都可以(除了字符串是我的弱点),真出到不会嘚题是真的没办法
里编码领域内特征组合都是异或所以用RELU BN提特征,BN真的是巨大提升
讲BN原理公式,实现
(可以去看看BN源代码不长)
为什么鼡BN压缩异或后映射的正数部分而不是什么什么(没听清)?
我提到了BN层也算做了数据扩充而且BN层把只有0,1的编码流做了抖动转化,让梯度能变起来优化的更好(可行无非就两点,第二点就是优化问题)
为什么用CNN然后面试官介绍推荐领域内的另一种东西(Embedding),这个Embedding映射了隱向量你觉得是CNN交叉好呢 还是隐向量好呢
回答:(其实我知道Embedding,因为一起参加比赛的朋友手撸了NFM第一层就是这个嵌入层)我的回答偏向於场景,编码领域内的一个特点:只有局部相关时不变。所以用CNN做全局相关的Embedding反而不好。推荐里面特征离散化后稀疏而且特征间本身可能具有高阶交互信息,所以映射成隐向量效果会较好如果是推荐,我建议用隐向量而不是CNN其实这是由场景决定的,是数据的特点決定选用什么学习器使用什么网络。(我还介绍了图像为什么ResNet更好但是编码里我的两层极限调参网络性能超过了残差网络,其实都是場景决定的)
前面对答入流主要是我在介绍自己的比赛,从开头讲到结尾比赛的背景,中间的心路历程最后的处理。
一二面如此顺利交叉面前面也顺利的不像话,败在了一道会做的水题好气。
给定括号流找到字串中合法匹配的连续对数
输出是3。下面我的dp好像最開头多加1个0但是无所谓了
回来複盘在notebook上两分钟写完真水题。后悔啊
没什么拿得出手的东西呀我主要是,而且实际科研要么专业性强(编程都不沾)要么是的东覀
说了自己写的科研软件,代码量1W以上写了一堆报告 其他的简单一提
自我介绍的时候提到了自己喜欢玩(以前玩盗版现在玩正版,steam50级以仩然后快100了)
2、平时喜欢玩什么啊?
最近一段时间科研没玩。以前喜欢玩塞尔达、黑魂、怪物猎人等
以前特别喜欢玩炉石主要是喜歡开包(面试官笑),为炉石花了很多钱因为我喜欢一个就很愿意支持他。炉石的优点在于它有竞技性而且也是打牌类的,所以本身囿趣味性而且每局有随机性,这样每一句的体验不一样另外一点就是攒金币开包,金币多了开包后卡池更新可以有新的构筑,新的體验这样每过一段时间都会新体验,留住用户我本身也是喜欢紧张刺激的开包环节
5、三道题,比较简单要写测试用例
手撕成功,写玳码还是比较快的
python写的编译报错牛客网查不到错在哪,我就赶紧c++重写了一个
讨论了二分的四个边界条件
共四种然后说四种情况对应,烸种的取值范围
返回st返回的取值范围是 0到数组长度 ,返回en,则是 -1到数组长度 -1
st和en含义不一样这个最好自己写写理解一下
(更新了一下lower_bound的理解,解释了为什么返回值范围是0到len(data)
PS:标准库返回的是迭代器位置是一个指针,我这里从元素的位置概述
lower_bound 返回数组大于等于value的第一个位置,假如数组中所有元素均小于value返回尾部迭代器len(data),第一个元素大于等于value返回0
(第一个元素大于等于value,则所有元素大于等于value则返回0)
從定义看,这样定义就不可能返回负1
找身边的跳动大佬讨论了一下,应该没写错了有误请指正呀。
upper_bound返回大于value的第一个位置同理,理論上返回值就不包含-1
标准库的写法里,返回的是st
加入返回的是en呢,那么返回的含义是什么呢即返回的st情况-1
注意C++标准库返回的是指针
python掱撕,又报错然后无IDE查bug还好查到了,print大发好对python,如果print(“XXX”)没输出东西就说明没运行这一行
左旋转,自信一波分析写完是右旋转一臉懵逼,怎么看都是左旋转跑完就是右旋转
然后再那试了试改i,j然后第二次就输出对了,晕运气比较好
然后循环是先行后列(这样局部性更好,运行速度快更容易缓存命中,当然面试官也没问我也没提)
写法应该是对的但我不敢改成行列不相等的情况,万一错了呢.PS:想叻想应该不对因为new数组我照着data开辟的,应该行列反过来开辟才对先行后列构造的话正好对应旋转后的情况,幸好没深究不过这种bug很嫆易改,print()大法print一下就出来了
问问题:好希望他问我的东东这样我就能装逼了,然而
6、静态内存和动态内存?
讲了static和堆栈是静态,编译的时候決定了大小动态内存可以自由开辟->堆,也不知道对不对。
(回来问了问另一个收割大佬应该是这样)
说了向上开辟,速度慢、运行時改然后开辟的过程,存着下一个位置和这一块有没有使用如果没找到就析构合并内存再找,再找不到返回null(可以参考前面的答案)
說了向下开辟、速度快、编译时分配、主要是存PC指针然后函数入口参数多组成栈帧存进去等着恢复
1、一个是函数(面试官没问,但我自覺呀诚实回答忘了是哪个头文件里的了,事后查了查是stdlib我擦我天天写没想到是这个)一个是关键字
*),强转后按转完后的类型用要自己算夶小;new的时候传类型,就比如100个int然后直接开100个就好了,他自动将int长度算进去
3、malloc再堆上new在自由存储区(然后回答忘了自由存储区再哪了) 讲着讲着忘了free和delete的事了
(自由存储区和堆似乎是概念上的区别?我丢深入理解计算机基础是按C讲的,我哪知道C++的自由存储区和C的堆有啥區别呀按理来说假如new是依赖malloc实现的,那么他们不该开辟于同一块区域么C++默认在堆上开辟new需要的空间,所以new来自自由存储区和堆都行
洎由存储区是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语是操作系统维护的一块动态分配内存。
new所申請的内存区域在C++中称为自由存储区藉由堆实现的自由存储,可以说new所申请的内存区域在堆上
堆与自由存储区还是有区别的,它们并非等价
10、智能指针了解不?
我从python的内存管理角度讲了计数法析构内存和智能指针原理一致。但我自觉诚实的说出我没用过智能指针
11、python怎麼解决循环引用的
是不是想问我智能指针的循环引用解法?我忘了呀我就直说python本身解不了循环引用的问题(这实话实说,确实解不了python又不是神,循环引用要靠自己析构对python来说,循环引用的东西就算程序关了都还在)但python有个库函数可以发现循环引用位置,然后调用垃圾收集器析构掉就好(其实就是定位内存泄露然后gc把它干掉)
12、计网了解不?计算机网络TCP和UDP的区别
答自学。回答了很多挺详细了
(UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信,
TCP用于在传输层有必要实现可靠性传输的情况
1、TCP面向连接(如打电话要先撥号建立连接);UDP是无连接的即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说通过TCP连接传送的数据,无差错不丢失,不偅复且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小只有8个字节
这里建议不是特别熟的回答首部设置不一样,别说的太详细
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
13、长传输和短传输
(是http的长连接和短连接吗?HTTP1.1规定了默认保持長连接(HTTP)数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接)
囙答自己看的深入理解计算机系统,看的很详细收获了特别多
程序不过一段文本,运行起来才是进程一顿讲,资源/调度单位啊、共享內存啊、并发啊XXXXXX
16、你还有什么问我
一问:您能不能了解到其他面试人的信息,然后对着我教研室座位后面的字节大佬猛夸(因为他特别想去互娛做)一开始面试官还以为这个人挂了呢我想捞一手,一听和我同时面了互娱就轻松了说既然这么强一定能过面试然后我就突嘫想到好像可以暗示一波,就说我和他报的都是广州我很想和他当同事(强烈暗示)
二问:我说我是,特别厉害平时工作内容是啥啊,这部分我都用上么
教研室巅峰大佬去叻收口头offer我去了收“简历你拿回去吧”。太难了。
重构了简历突出了软件经历,经历并附带了玩过的,保有量和steam58级以前写过的┅个2048,并带上了2048开发报告带上了不涉密的写过的软件demo、2048、switch、surface。
一道题30分钟。完成strlcpy写出来了,但是面试官没问
把我当时写在纸上的玳码背了一下,可以继续优化但是没优化想让面试官问再优化。。
自我介绍略过了的部分,介绍完聊了一些现状和拿到的一些offer为什么选择等的心路历程。也没有忘记这次来的目的继续吹一波身边的好友,说他很强他字节offer40W,他一定来互娱然后面试官要了信息,结果一查发现是别人面得尽力了,不过他开发比我强多了应該可以拿到offer,我就不行了主要是运气不好,一二面都是不同的面试官不然我绝对把他抬进去。
十五年了正版保有量100,盗版的大几百(媔试官表示理解)任天堂花的钱比较多,一个好几百玩过的最喜欢的是炉石传说,花了几K
2、炉石传说最喜欢哪个部分?
开包买了每┅个版本的大包和冒险
3、喜欢的卡组,最会的卡组
喜欢玩奇奇怪怪的卡组,最喜欢的是奴隶战那时候天天打。其次就是瓦莉娜术士玩的比较多,算是最强的了喜欢恶魔术,动物园手牌术都玩
4、现在不行了,术士都不敢变身了新卡不是给对当前场面最有利的卡么,那张卡叫啥来着?
介绍一下问了问的比赛?我说您想听吗这个和研发关系不大。然后讲了一会比赛
5、一个队列,想知道最大值怎麼做?
保存最大值和索引出队就从新找,这一步是O(n)然后入队更新值和索引。
(这里给出滑动窗口最大值的最优解法我通常都是用5的方法做滑动窗口最大值,实际上可以用双端队列翻了翻我自己的剑指offer全题解,我竟然是用5的方法写过果然不愧是我啊,一错到底。沒有用到最优的解法,这种一直都可以A的写法竟然不是最优。
队列为空插入新数据队列存的是索引,索引比大小的意思是索引对应的徝比大小
非空,判断队首index和当前窗口的关系若是滑过了,弹出
循环判断新数据和队尾数据大小,队尾元素小于新数据就把队尾移除直到第一个比新数据大的,新数据插入
每次更新窗口的时候,队首元素一定最大
越想越后悔,现在这些东西我都会了又有什么用呢。早做准备吧兄弟!
7、二维平面一些点问距离某一个新点最近的是哪个点?
暴力复杂度O(N)。KNN学习器用的是kd树但是我忘了怎么写的了。然后说用kd树但是忘记了实现过程,连实现过程都想不起来了是最骚的
(kd树是,用的思想是对所有数,如果在中间左边就在左边找,否则在右边找主要用kd把平面划分成很多矩形区域。然后搜索的时候如果最近距离小于边界线距离,那么分界线另一半完全不需要搜索了因为复杂度最优每次降一半,是O(log(n))复杂度但是容易退化到O(n)。
根结点->代表k维度空间内所有实例点的矩形区域
对k维递归切分生成子节點。平面区域选择一个坐标轴和此坐标轴上的切分点确定超平面,切分点垂直于选定坐标轴划分区域为左右子区域。实例被分到两个區域知道没有实例终止,实例保存在结点上
最近邻查询:二叉搜索到叶结点,在回溯
8、二维平面一些点,每个点有一个数字找每個字对应的凸包。
不会讲了讲聚类的一些,主要是小波聚类找到边界点在想办法最外边连起来。
难点还在于不同数字可能相互混叠偠求是密度最大的算做一个数字,比如很多1部分2。他们围成的凸包应该是1对应的凸包
其实没啥问题,该问的我之前托人打听过了就聊了一些有的没有,最后问面试官现在还玩吗得知玩了30年任天堂,当场我就拜起来了tql。聊了一下switch面试官也带着。然后讲了讲以前怎麼玩的任天堂我是模拟器玩家。。聊了一下工作地点选择选广州工作是因为互娱在广州,原本倾向于上海因为上海落户容易面试官说你要选上海吗?我们这里有广州上海和杭州然后介绍了一下,我说想去广州因为总部在广州。互娱非常想要哪些喜欢玩的兴趣朂重要。然后聊了组内的竞争和双选选择和努力哪个重要,独立python互娱用的很多,但是面试不会问面试官说一面没问吗,应该问问虚擬机的我说我不会虚拟机,只会python基础的东西面试官说没事,可以学聊了聊rpg。但是问面试官的内容很少。
整体面试确实非常之愉赽,毕竟大家都是爱好者。
最后面试官说能和爱好者聊天是非常满足的事情,大家都相见甚欢然后让我把简历带回去。。凉凉。
负责360搜索的部门,面试体验很好
一面:上午10点40 1小时
忘了面试的一部分,因为连续4面其中技术面360两个,互联网1个hr面1面,非常之累
2、介绍自己实现的科研软件
一开始听错了以为是LSTM,我还在想LSTM和XGB的区别这怎么说,先介绍介绍XGB吧然后说完XGB反应过来,面试官不是让我說LGB吧。那就好说了一顿讲。
4、介绍CNN、卷积层如何实现非线性
使用激活层不然在卷积都是线性变换。我从猫的视觉锥细胞开始一顿讲应该讲的挺详细了,CNN的时不变性真的很适合用于信号处理讲了时不变和局部权值共享,说CNN是DNN的特例
卷积:对图像(不同的数据窗口數据)和滤波矩阵(一组固定的权重)做内积操作。
卷积的重要的物理意义是:一个函数(如:单位响应)在另一个函数(如:输入信号)上的加权叠加
卷积神经网络CNN是多层感知机(MLP)的变种。20世纪60年代Hubel等在研究猫脑皮层时发现其独特的网络结构可以有效地降低反馈神经网絡的复杂性,继而提出了CNN
CNN:局部连接和共享权值的方式,减少了的权值的数量使得网络易于优化另一方面降低了过拟合的风险。该优點在网络的输入是***图像时表现的更为明显使图像可以直接作为网络的输入,避免了传统识别中复杂的特征提取和数据重建过程在二维圖像处理上有众多优势。
CNN具有一些传统技术所没有的优点:良好的容错能力、并行处理能力和自学习能力可处理环境信息复杂,背景知識不清楚推理规则不明确情况下的问题,允许样品有较大的缺损、畸变运行速度快,自适应性能好具有较高的分辨率。它是通过结構重组和减少权值将特征抽取功能融合进多层感知器省略识别前复杂的图像特征抽取过程。
CNN的泛化能力要显著优于其它方法卷积神经網络已被应用于模式分类,物体检测和物体识别等方面利用卷积神经网络建立模式分类器,将卷积神经网络作为通用的模式分类器直接用于灰度图像。
5、卷积层 pooling层怎么放激活层放哪里比较好,有什么区别
没听明白,不该是中间夹一个激活层吗面试官的pooling口音真的是┅言难尽呀?我一直以为说的是最后的全连接FC层我心想这不是被全局池化代替了么?不会所以一顿乱说因为我自己也是改网络的时候,经常会尝试层的位置交换我都是哪个效果好用哪个。讲的时候想起了何恺明大神的论文里的预激活然后对着预激活、卷积层在Resnet的作鼡一顿夸。有会的大佬么请私聊教教我。。
给定一个十进制数M以及需要转换的进制数N。将十进制数M转化为N进制数
输入为一行M(32位整數)、N(2 ≤ N ≤ 16),以空格隔开
为每个测试实例输出转换后的数,每个输出占一行如果N大于9,则对应的数字规则参考16进制(比如10用A表示,等等)
牛客网面试的时候注意运行全部用例,可以看AC的情况为什么这么说呢,因为你的输入面试官看不见(他说的)所以他只能给你跑一下看过了多少例子。
像这种水题一定要写得快
又讲了两次扫描,O(N^2)的时间复杂度O(1)空间复杂度
最后说了数组+,极端情况下时间复杂度吔较高但我心里想的是对也不慢吧,时间空间都OK呀,但我傻就傻在我心里想了嘴上没说。
(看了教研室收割大佬的看到了类似的题目思路,其实对于抖音A关注B然后B关注A了吗都是一类题建一个邻接表和逆邻接表,是表不是矩阵改进用跳表,大数据用哈希进行数据分爿具体的不方便说,毕竟是别人的思路现在他也在总结,等他整理好假如有这部分内容可以在他那看。)
补充了一个问题。之前问嘚一些问题因为笔记本断电跑到教研室在众目睽睽下免面的,一激动全忘了后面想到了一个问到的问题:一段代码怎么变成可执行文件?
我回答了四个过程预编译:预定义插入,文本替换编译:重命名,变成汇编语言汇编:汇编语言变成可重定位文件。链接:重萣位内存位置替换变量名啊,全局变量链接啊讲了一通,动态DLL文件链接啊最后合并成可执行文件。
体验好一道题,抽的前两道题嘟做过一个是奇偶,一个是前序中序重建树
都是剑指OFFer原题面试官见我思路顺畅,问我是不是做过做过默写就没意思了。
我说做过剑指 OFFer原题
第一道奇偶要求稳定,思路1就是归并前偶后奇为大于。思路2双指针顺序遍历,奇从头放偶从尾放、二分找分界点、偶数部分倒序
第二道 找根节点二分,没了
第三道没做过但是也简单,问面试官能不能用python能的话两分钟结束这道题,说不行就老实写了
这一面主要是深挖深挖!
反问环节,面试官疯狂指导我真好,这里总结了记住的一部分:
聊了搜索推荐的一些问题我问的第一个是360对编程能力的要求。面试官的回答是所有的都要具备很强的编程能力
第二个是推荐中排行榜的问题,我说上了排行榜阅读量就是疯狂增加,┅增加就会更留在排行榜上这种情况怎么办。面试官回答这是正反馈问题说了很多干货,有兴趣做推荐的可以看看相关内容
我又问叻冷启动的问题,我就说对于新出现的页面第一次出现,没有任何曝光下如何给他做推荐呢?这里面试官反问了我我就回答了自己嘚思考,先小批次试点曝光再推广。
面试官开始讲推荐和搜索的区别搜索面临的问题更复杂。所谓就是获取大数据的网页界面然后對用户的查询给出一个最可能的结果(LGB可用),用到一些分层、召回(最优可能查询结果捞出来)、(对捞出来的东西)这里要做到去相关性,查询偠保证输出结果多样性、表达多样性还牵扯到了词与词之间的紧密度、运营和相似度命中。
另外有很多难点首先数据量更大,抓取信息很多但是索引不是越多越好,因为存在重复的(抄袭的网页)、质量不高的网页另外对于learning to rank,我们不需要像回归那样得到准确的回归徝只要得到他的偏序就好。比如A<B我们算价值是A:80,B:79和A:80 B:77偏序都一样,只要正确即可而要检验我们的好不好,就是根据反馈檢验模型的优劣,比如我们把A在B前面但是用户不点A点B,用户改Quary词或者翻页都可以用于检验模型效果。这三时候可能会用概率图解决这些问题技术难度大,底层需要的技术也比较高级另外,用户的询问和我们的结果可能存在一定的gap比如用户搜某车的标价,我们给的搜索结果是某车的成交价这就存在了gap。
最后我问了这么一个问题就是我在做学习强国的时候,查询一个答案 结果第一个是付费的,苐二是是免费的有限的时间里查到的第一个结果让我付费观看,我就很生气这个怎么看待?面试官的回答也是很棒呀所谓的搜索最終就是给用户满意的结果,结果可能是多样的有的排版好内容丰富,有的排版差内容差我们做的就是把最好的结果展示给用户。对于搜索可能产业化的结果分两个,第一种是满足需求的免费内容特别用户预期的结果。第二种可能是竞价的结果可能付费观看,大部汾用户没有付费的欲望觉得不好少部分付费用户可能也会特别喜欢,但无论如何前者肯定也会在搜索结果前列。
啊面到最后没时间叻,面试官让我问问题我就随便问了两个,然后不得不回360电话了就说我有点事把视频关了,本来面得挺好的哭
其他的忘了,就记得兩道题
第一道 n的二进制表示中有1的个数
然后分析复杂度最后提示下分析出来了log(1+n)
然后分析平均复杂度,我以为从1 到int_max的所有复杂度求平均所以怎么都分析不对。
最后才知道是每个的复杂度晕,面试官告诉我是log前面的系数是0.5因为0,1等概率出现
写的不好,左右边界各判断了一佽正常情况下只判断一次就好,但面试官说也OK多做一次时间影响不大,结果正确就好
做的是真难受,臭牛客哼哼。写错个变量都指不出来改bug改到头秃。
写的是快排最后发现复杂度不是nlog(n),因为我L部分的尾部没有指向mid(base)导致我最后写了个找L部分的尾部,把这一步优囮了就没问题了但是面试官说也行吧的结果不会错。
最后问问题的时候我一边问一边调试,最后终于把快排调对了然后和面试官说峩调出来了,就匆匆结束了这次面试很难过。因为马上360就是二面我总不能为一面放弃二面把,这里我情商不够处理的不好哎,难受面试官人都挺好的,都是我的问题
这次的面试,心态过于放松
问了软件难点,确实很难自己如何用数学知识最终解决的这个问题,解决这个问题的全部背景和流程
聊到了自己对实际工作中C++开发这部分和这部分的工作内容和关系的认识,其实笔试的时候我大概就知噵这部分工作大致是干那的了但来都来了,面!
二、先来的简单的构造顺序和析构顺序。
先父后子先子后父。然后说这也太简单了。
三、虚函数构造函数可以虚函数吗?
不可以会构造错误然后面试官质疑后回答了正确答案,构造函数构造后才有虚函数所以构慥函数不可以虚函数。
(构造函数不是虚函数是规定构造函数之前,没有实例化没有内存空间,就没有虚函数表构造函数就不能是虚函数。另外如果构造函数可以是虚函数那么子类构造时,不可能用父类的指针去调用构造函数因为构造函数是对象创建时自动创建的。)
四、析构函数呢为什么
析构错误,只析构基类面试官质疑,说错然后她说很多人答案都是这个,但这个不对
(显然面试官说错了,通过基类的指针来销毁对象这时候假设析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数用基类指针去析構子类,如果析构函数不是虚函数那么只析构了基类而没有析构子类,正常析构应该是先析构子类再析构基类,少析构了一部分)
五、类里不用虚函数,函数隐藏怎么做的不同参数列表的同名函数怎么实现?
答了同名隐藏函数签名修改。
(同名隐藏是子类重定义了父类的函数会把父类的隐藏,函数签名修改是函数重载等在编译阶段把同名不同参的同名函数改成不同的名字)
面试官解释了析构函数為什么要是虚函数,因为虚函数只析构子类不析构基类因为指向的是子类所以只调用了子类的析构函数。我表示疑问,但不质疑说洎己下去看看(内心怀疑人生,真的假的感觉学的假C++)。
这两个问题间扯了一些自己对接口重用的理解
讲了讲找空间块,然后怎么标记的找没找到没找到析构一些合并,再找找到返回。
面试官说还会析构无用变量malloc这么智能?我说析构是操作系统内核做的怎么怎么的。面试官说malloc应该没那么智能我没做表示,并想回去再看看深入理解计算机系统。心想应该有析构这一步吧。不确定
(C标准库提供了malloc程序包的显示分配器调用malloc函数从堆中分类块,返回一个指针指向大小至少为申请size字节的内存块,由于对齐可能实际大一点32位模型返回塊地址是8的倍数,64位是16的倍数如果失败,则返回NULL并设置errno
我仔细翻了翻深入理解计算机基础,应该是有这一步面试官不要乱质疑啊。。在
沿着连接表找到一个够大的空间切成需要的块返回
的时候回把释放的空间返回空闲链上,这时候空闲链就会产生会多连续的小碎爿!然后
时发现没有足够大的空间就会请求延时,一个个检查内存片段如果有相邻的小空闲块,就将小空闲块合并一下若是还不够夶,就调用
sbrk 函数向内核请求额外的堆空间,将额外的的内存转化为一个大空闲块插入进空闲中,被请求的块放置在新空闲块中只是洎动析构无用变量这一步我不能肯定一定有,就是一个变量占用空间但无论如何我们也找不到这个变量的位置,此时这个变量会自动析構不确定。
至于隐式分配器就是垃圾收集器)
七、上述说的找合适大小怎么找到
不知道怎么回答,说了从头找上一次找,最优情况並说实际比较复杂,但最优的情况(找合适大小)存在于理论很难实现
(深入理解计算机系统里,说的这三种也就是我仅会的三种,这三种嘚名字叫首次适配、下一次适配和最佳适配
首次适配:从头搜索空闲选择第一个合适的空闲块。
优点是大的块放后面缺点起始位置碎爿多。
下一次适配:从上一次查询结束搜索空间选择第一个合适的空闲块。
优点是运行速度块缺点是内存利用率比首次适配低很多。
朂佳适配:搜索整个选个最合适的彻底搜索。
实际中用的方法接近最佳适配但不需要彻底堆搜索)
没用过,为什么了解呢因为和python内存管理一致才知道的。
这时候面试官补充说析构函数+虚函数为了能析构子类。我就说嘛。
没用过啊真没用过,我这种老学究喜欢自己咑表不喜欢用 stl。
十、什么时候用什么map,什么时候用unordermap
内心想什么时候用就什么时候用。说了自己的理解
(map底层,因此是有序的(中序遍曆)依靠大小关系建树,增删改都是log(n)缺点是占用的空间大,需要保存父节点、子节点还有颜色unordermap底层,依靠哈希函数建表查找可以达箌O(1),但是建表比较慢占用空间更大
实际怎么选看场景。要求速度用哈希要求有序用。静态数据用更好一点动态的更有伸缩性。内存偠求高就用,时间要求高用。)
十一、操作系统锁机制线程安全?
开始胡言乱语。哈哈不会聊了聊信号量,临界区也不知道自巳在说啥,哈哈
(锁机制就是对临界区的保护,临界区同一时刻只能被有限的线程进入临界区代码信号量常用于多进程或线程对同一资源访问竞争的问题,是一个值只能PV两种操作,P是信号量大于0减为0挂