智臾科技面经 一面(凉)

自我介绍

项目介绍

面试官:你这个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+树,就算没做也要了解一下。

全部评论
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 湖北
佬,一面完是多久出结果啊
1 回复 分享
发布于 2024-04-23 12:18 广东
佬,你投的是日常实习吗,我也想投这个公司的日常实习,但是算法还没刷太多,mit6.824才写了2个lab
点赞 回复 分享
发布于 2024-09-03 17:17 湖北

相关推荐

我知道学历是硬伤,所以和计算机搭边的岗位我都投了,相思了都。图片中的本科是自考的,今年6月就毕业。不是假学历。这个是不是不写比较好啊。
数学转码崽:专业技能后三条删了,还有你面Java开发就不要写c++,Python,显得很业余。面中小厂的话,MySQL和redis这俩多写点,MySQL基本的存储引擎事务索引锁日志mvcc主从分离这些得会吧。redis底层数据结构,持久化策略,内存淘汰过期删除策略,分布式锁,主从哨兵集群等等 项目写的太草率了,你指望面试官问你什么,问你怎么发短信,怎么用人家的服务器部署项目吗
点赞 评论 收藏
分享
找工作前&nbsp;你要想好&nbsp;未来5年后,你打算做什么。如果你想就找个稳定的工作,那我建议你考个985研究生,专门去研究某一领域&nbsp;,毕业就按这个方向去投简历,最好在上学期间做个自己实验小产品,那面试拿产品更有说服力。如果你想创业,我建议找个创业型公司,但是要求就是你能接触到整个项目,目的不是钱,是为了5年后你能积累足够的知识。这种公司不能太抠门,我指的是研发经费不能少,你可以工资少,但是研发经验不能扣扣搜搜,到时候你学习买材料都不给拨款,那就没什么意义选择创业型,这种可能不适合大部分人,首先你要问你自己,对这行是不是真的感兴趣,如果你只为了工作而工作,最好别去这种创业型公司。你记住一句话,工作为了你自己以后有更好的发展,钱少,没关系&nbsp;但是我要学到东西。如果你下班都不能拿出精力去学习,只能说你可能不适合创业。还是找个稳定工作上班为好。楼主之所以能研究2天3夜&nbsp;去解决问题,最大原因是我喜欢这行,我非常喜欢自己做点小产品以达到自己内心的满足感。可以说,不是为了钱,就是兴趣爱好使然。还有两句话&nbsp;,一直激励我:1.&nbsp;书山有路勤为径&nbsp;学海无涯苦作舟我自认为我足够聪明,学习能力超强,应该超过60%人的智商了,不过我还是很勤奋。能静下心去专心做一件事。如果你们想成功,就必须达到忘我的境界。2&nbsp;多年后你会感激当初那么奋斗的自己!当你到死的前一天,你回想你这辈子所有经历,你觉得你没白活,你作为一个人&nbsp;值得了。不是行尸走肉。我这人信神学,我觉得有平行世界,我们每天做梦可能会看到平行世界的自己。所以我对死亡无所畏惧,但是我要活得有意义。这辈子我设计很多产品,走过很多地方,教育好下一代,这就是我人生目标很多人私信我,想转行,看到我写的这些,还是有些疑惑,我再此给些建议吧。1&nbsp;计算机,通信,电气自动化专业&nbsp;转到嵌入式这类人相比于土木生化跳专业转这行相对来说要容易得多。有很多优势。这些专业学过c语言,大学物理,高中物理,理解计算机基础部分,上手容易。具体想转行的,参照我之前楼层写的&nbsp;怎么从入门开始学,一共6步。具体要转偏软件还是偏硬件,这个具体要看个人,如果说想短期上手挣钱,我建议转偏软,也就是linux,安卓这些。但是这种岁数大会有职业危机,可替代性强。如果说想长期从事嵌入式行业,并且还能静下心学习,不怕辛苦,这种不是三天打鱼&nbsp;两天晒网&nbsp;要持之以恒这种,我建议转偏硬件,这种偏硬件在未来可以选择自己创业,也可以选择在不断提高技术后,跳槽到大公司。这种越老越吃香,但是很困难。起码要5-8年&nbsp;成为大手。具体看个人情况而定。另外大家不要心血来潮去干一件事,一定要深思熟虑后再做决定,要热爱这行&nbsp;,你才能学好!如果是土木生化&nbsp;想转到嵌入式,说实话,我不太建议转,首先大学没怎么接触c语言,单片机这些基础知识,转行很费劲。其次,360行行行出状元,我认为任何行业都能挣钱,但是如果大环境不好,要善于观察,看准什么方面挣钱,抓紧风口。如果说硬要转,我建议报班转偏软件,硬件能把人弄疯的,什么都没有准确答案,程序写对了,电路没设计好,也会出问题。但是偏软件的,没有硬件这些额外因素,相对来说问题小很多。另外刚毕业有条件可以考虑&nbsp;gwy,部队文职,选调生&nbsp;这些,不用非干技术不可,理想很丰满&nbsp;现实很骨感&nbsp;,毕竟要挣钱吃饭的。沈阳有900万人口,做我们这行精通的几千人都没有,所以嘛&nbsp;有铁饭碗的,我建议去。想好自己职业规划,三思而行。最后呢大家可以看看专栏
投递360集团等公司9个岗位
点赞 评论 收藏
分享
神哥了不得:(非引流)可以这样的,Java和go的项目其实差别不是很大,但是Java岗用Java的项目肯定最合适,Java实现一版会更好
点赞 评论 收藏
分享
评论
12
25
分享

创作者周榜

更多
牛客网
牛客企业服务