智臾科技面经 一面(凉)

自我介绍

项目介绍

面试官:你这个15445项目运用到了RAII思想,可以介绍一下RAII思想嘛.

我:RAII思想就是利用生命周期来实现对资源控制.

比如mutex_lock,智能指针。然后我项目中运用RALL思想,实现了page_guard类。

面试官:RAII这么做的目的是什么?

我:拿page_guard来说,在构造时上锁,drop或生命周期结束时释放锁,这样极大的简化编程难度。如果没有实现这个,编程难度会变大,忘记释放锁或忘记上锁,容易造成死锁,或者是占用更多性能。

又或者是智能指针, 在智能指针没有出来之前,指针会经常遇到一些困境,比如 忘记delete造成内存泄漏,已经delete后指针忘记置空,变成野指针等问题。

总而言之,RAII方便了我们的资源管理.

面试官:15445中的做了事务隔离,可以简单介绍一下嘛.

我:p4太难,放弃了。

面试官:那你能介绍一下lab3中优化部分做了哪些嘛?

我:首先是实现了topn优化和hash_join的优化. 原本是使用 nest loop join方法,也就是一个两层循环,是最坏的情况,我们通过hash_join进行优化。

面试官:了解B+树嘛?

我:简历上写错了,因为2023 fall做的是可扩展哈希,所以没太了解B+树。

面试官:C++的内存空间是怎样的结构

我:栈区,堆区,全局/静态区,常量区。栈区相对较小,全局/静态区和堆区较大。

面试官:哪些情况用栈,哪些情况用堆,哪些情况用全局/静态区?

我:我们从main()函数执行前后来讲,在main函数执行之前,会先把 static变量,全局变量放进全局/静态区。

然后我们平时写函数的时候,在里面定义的变量会放到栈里又或者是递归的时候会压栈。至于堆,是由程序员主动申请的空间,什么时候用堆呢?首先第一点,因为栈区比较小,所以当我们开一个大数组,或者是动态数据结构(如set,map,动态开点线段树等)时,是需要放到堆里的。第二点是,当需要对象需要被多个函数共享时,这时候我们把该对象放到堆里面,就可以实现共享.这样就减少了内存开销.

面试官:堆和栈有什么差别?或者说栈相对与堆有什么优势?什么情况尽可能的放到栈上?什么情况尽可能的放到堆上?

我:首先是堆的,我们刚才有讲到过,就是动态数据结构(如set,map,动态开点线段树等)或共享对象时,是需要放到堆里的。

至于栈的话,比较小的变量就可以直接放。

(这题应该是G了。哎)

面试官:堆和栈在访问效率上有什么差别?

我:堆会快一点。(这里答错了,因为我不知道,所以我随便答了一个,正确答案是栈)

(面试官拿起来笔,在本本上画了两下。)

搜了一下:

优势和适用情况:

  1. 栈的优势:快速分配和释放:栈上的内存分配和释放速度快,适用于需要频繁创建和销毁对象的情况。空间效率高:栈的空间有限,但是分配和释放的开销小,适用于存储较小的数据对象。
  2. 堆的优势:动态分配:堆允许在程序运行时动态分配内存,适用于需要灵活管理对象生命周期的情况。大内存空间:堆的空间相对较大,适用于需要存储大型数据结构或对象的情况。共享数据:堆上的数据可以被多个模块或线程共享,适用于需要在不同的上下文中访问数据的情况。

一般情况下,以下准则可以作为选择栈或堆的一些参考:

  • 当数据对象的大小较小且生命周期可以确定时,优先考虑将其放到栈上。
  • 当数据对象的大小较大、生命周期不确定或需要动态分配时,考虑将其放到堆上。
  • 需要注意的是,在堆上分配内存后,需要及时释放以避免内存泄漏。

面试官:还剩半小时我们来做一下算法题.

算法题1:一个骰子有n面,投到每一面的概率相同,问每一面都至少出现一次,需要投几次。

我:考了最不会的期望dp且一个月没写过题。。 想了20分钟,然后推了个期望方程。

设dp[i]表示n面中有i面出现了至少一次需要投的次数。

dp[i] = (n-i)/n *(dp[i+1] + 1) + i/n*(dp[i] +1 );

dp[i+1] = (n/(n-i))+dp[i];

算法题2:把至少出现一次改成至少两次。

我:没写过来。

面试官:其实算法题2跟算法题1是很像的,设dp[i][j]表示出现一次的有i面,至少出现了两面的有j面即可转移。

反问环节。

自我反思:

1.算法题考虑期望dp,一个月没写题加上期望dp不熟,菜是原罪。

2.项目最好完善一下,事务的隔离级别和B+树,就算没做也要了解一下。

全部评论
佬,一面完是多久出结果啊
1 回复 分享
发布于 2024-04-23 12:18 广东
for(int i = n;i >= 0; i--){ for(int j = n; j >= 0; j--){ if(i == n && j == n) dp[i][j] = 0; else if(i < j) dp[i][j] = 0; else{ if(n==j){ std::cout << "error, div is zero" << std::endl; std::cout<< "i = " << i << ", j = " << j << std::endl; } dp[i][j] = 1.0*n/(n-j)+1.0*(n-i)/(n-j)*dp[i+1][j]+1.0*(i-j)/(n-j)*dp[i][j+1]; } } } 不知道对不对
1 回复 分享
发布于 2024-01-09 11:22 湖北
佬,你投的是日常实习吗,我也想投这个公司的日常实习,但是算法还没刷太多,mit6.824才写了2个lab
点赞 回复 分享
发布于 2024-09-03 17:17 湖北

相关推荐

2025-12-19 02:15
门头沟学院 C++
1.&nbsp;实习介绍2.&nbsp;两段开源经历拷打,主要聊开发过程遇到的事,技术涉及较少,虽然也没什么技术,估计就是确认一下是本人干的。3.&nbsp;面试官介绍自己部门不是搞数据库内核的,询问真想来吗,给面试官给予了肯定的回答。4.&nbsp;开发习惯闲聊,看不看火焰图,跨语言的benchmark怎么测的巴拉巴拉。5.&nbsp;正式开始拷打,汗流浃背了。简历上项目就是常规15445+tinykv,遇到一个也都做过的面试官相当正常。6.&nbsp;15445&nbsp;lru-k算法、crabbing&nbsp;协议(还包括读写锁细节,楼主都快记不得了,头一次有面试官问这个)。7.&nbsp;ACID&nbsp;含义(楼主顺便聊了一下CAP的C跟ACID的C区别,直接预判面试官)8.&nbsp;15445&nbsp;三种隔离级别(RU,&nbsp;RC,&nbsp;RR,这块楼主早忘记了,所以回答的是mysql和pg的实现细节,参考:https://gg2002.github.io/2025/03/16/mysql-latch,顺便扯了几嘴mysql为啥会有表级锁和binlog,因为mysql是一个分离式的架构巴拉巴拉)9.&nbsp;tinykv拷打,multi&nbsp;raft必要性,项目思想。10.&nbsp;分布式事务Percolator跟寻常单体数据库事务的差别(楼主大败而归,说到3列,但是忘记怎么具体地写这3列)11.&nbsp;raft全流程介绍(leaderelection+logreplication,楼主顺便加了点行业现状试图展示知识面)12.&nbsp;raft脑裂问题,prevote优化介绍13.&nbsp;raft的Leader&nbsp;Lease和ReadIndex优化(更是大败而归,头一次有面试官问这个,早就忘记了,扯了几嘴思想草草而过)14.&nbsp;面试官询问tinysql,楼主没做过,但楼主打过ob数据库比赛,说那个比赛sql写的多,再次跟面试官闲聊一阵15.&nbsp;广告场景题,问楼主广告曝光log和点击log哪个存kv好些,楼主说点击log少些,存点击,面试官说错,然后解释16.&nbsp;算法题,线程安全的LRU
点赞 评论 收藏
分享
2025-12-22 17:59
已编辑
北京邮电大学 C++
6月的时候比较迷茫,发了个跟cpp选手如何走相关的帖子,也收到了很多牛友的回复(感谢大伙们)。最后是打算多学一门后端语言拓宽找实习的范围,go和java之间因为觉得springboot挺不错所以多学了一会java。最后发现其实cpp找实习没有想象的那么难,虽然方向多但还是有面试机会的,而且感觉写java后端没那么有意思,有点后悔感觉😥😥😥,而且约面以cpp为主下面写写面试记录以及一些感受吧项目:1cpp项目1java项目timeline:10.1开刷代码随想录+hot10010.14&nbsp;快手音视频架构&nbsp;一面挂10.21&nbsp;百度搜索架构cpp&nbsp;一面过了好几天挂(感觉答得差不多算法也写出来了)10.27虾皮推荐系统cpp&nbsp;一面&nbsp;10.30&nbsp;二面挂10.29托特私募笔试,之后线下面聊得挺好的但是一周后挂10.31&nbsp;腾讯csig音视频相关cpp&nbsp;一面挂11.6京东java后端&nbsp;一面&nbsp;11.11二面&nbsp;11.13三面挂11.17京东安全java后端&nbsp;一面挂12.02蚂蚁oceanbase数据库内核cpp&nbsp;一面&nbsp;12.05二面挂有几个小厂过了,但感觉不喜欢干,拒了之前总怕面不同cpp岗位会问很多相关知识,实际上大部分还是根据简历问的,因为项目基本是自己手敲部署的,所以对项目很熟悉,关于项目的问题基本都能跟面试官聊很多,不过cpp岗手撕经常出问题,比如虾皮的叫我撕线程池啥的之前没准备,而且通常需要比较熟计网操作系统数据库,这些还没学过之后回归cpp了,打算多学学计网操作系统数据库,做一下cmu15445,不知道如果6月的时候打算cpp走到底现在会不会不一样
点赞 评论 收藏
分享
12.9&nbsp;TCL&nbsp;java开发实习生以下是面试中面试官提出的问题总结:1.&nbsp;项目细节比亚迪实习项目:“你这里的项目能不能挑一个你主要负责的讲一下?”(用户回答身份认证、测试环境连接器二次开发、时间转换器)“具体问题是什么?比如时间转换的业务逻辑?”北京掌上新机网络项目:“这个项目里处理过并发相关的,具体问题是什么?”(用户回答数据量太大导致传输失败,采用分片传输和校验)“线程池的核心参数(最大线程数、队列容量)有哪些?在项目中如何设置?”2.&nbsp;技术深度提问Redis缓存:“Redis是什么?它的特点是什么?如何减少SQL压力?”Java集合:“你用双端队列处理卖家信任度排序的业务场景,具体是怎样的?”“还有哪些数据结构?各自的特点是什么?”(用户回答哈希结构等)分库分表:“比亚迪的分库分表场景是什么?为什么要分库分表?”“分库分表的类型(水平/垂直)有什么区别?”“分库分表后会有什么问题?查询效率如何体现?”JVM垃圾回收:“JVM有哪些垃圾回收算法?(标记、复制、标记整理、分代收集)”“实际项目中如何选择垃圾回收器?”3.&nbsp;校园经历与能力组织活动:“你在学校组织过哪些活动?”(用户回答团日活动、党员工作站工作、足球比赛)“如何保障任务进度?举个例子说明。”(用户以红色文化活动为例,讲分工、安全、材料整理等)4.&nbsp;候选人反问“你们部门的业务方向是什么?”(面试官回答研发效能、数据处理等)“团队的人员架构和工作内容是怎样的?”“后续的面试流程大概是怎样的?”总结面试官的问题主要围绕项目细节、技术深度(Redis、集合、分库分表、JVM垃圾回收)、校园经历与组织能力展开,并在最后询问了部门方向、人员架构和后续流程,体现了对候选人技术能力和岗位匹配度的关注。
查看14道真题和解析
点赞 评论 收藏
分享
评论
13
33
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务