这是几个月前我面试金山网络的校招题目,面试官的原题是:假设你的电脑内存是100M,现在让你去读取一个1G的电影,在看电影的过程中可以进行剪切或插入片段,你应该怎么去设计这个内存。说完后面试官就把一张纸一支笔放在我面前,然后自己拿出手机在那里玩游戏……
那时到了面试结束我问面试官有没标准的答案,他说答案不能告诉我的,因为后面还有很多人面试,鄙人不才,目前还是一名学生,以下只是我分享一下自己的思考过程,有什么不正确的地方请大牛们指出,不胜感激……
我把问题转化为一个读文件的模型,假设我有10M的内存,我要显示一个100M的文件内容,并且在读取过程中可进行删除、修改和增加内容。10M的内存假设在内存中的地址是1-10共10个单位
100M的文件在磁盘中的内存地址假设为1-100共100个单位,可以将其分段:
1--------9
10------18
19------27
28------36
37------45
46------54
55------63
64------72
73------81
82------90
91------99
100
为什么我不直接把这100M直接以每10M为一段分10段这样就可以直接读10次就读完完事了?哈哈,请继续往下看->
确定好模型后就开始做正事了:
1.对于文件的读取
因为我在磁盘中是以9个单位为一段,所以就算完整地在10个单位的内存读入一段还有1个单位的空闲区,这1个单位的空闲区就是我用来保存磁盘的地址和边界,我只需要在这个空闲区记录下(1,9)、(10,9)、(19,9)、(28,9)、(37,9)、(46,9)、(55,9)、(64,9)、(73,9)、(82,9)、(91,9)、(100,1)这12个地址数组,其中每一个小括号表示(磁盘起始地址,地址长度),他们的相对地址为1-12,还需要在空闲区记录下此时读到的相对位置,例如读完1-9这一段后,此时应该读到的相对位置就是2,继续按顺序读取下一段,以此类推下去
2.对于读取过程中进行文件的增加内容
假设当我读到磁盘地址为20时想插入一段内容,此时插入的内容保存的磁盘起始地址是135,共有13个单位,这样可以拆分为(135,9)、(144,4),此时空闲区保存的地址数组顺序应该为(1,9)、(10,9)、(19,1)、(135,9)、(144,4)、(20,8)、(28,9)、(37,9)、(46,9)、(55,9)、(64,9)、(73,9)、(82,9)、(91,9)、(100,1),相对地址就变成1-15,应该读到的相对位置为4。其他的情况以此类推
3.对于读取过程中进行文件内容的删除
假设我删除的内容地址为(19,1)和(135,3),{ps:为什么会出现这样?因为当我读19的时候,(139,9)这一段内容已经加到缓存里面去了,这样子我查看起来就感觉内容就是一直无间断地显示出来},此时空闲区保存的地址数组顺序应该为(1,9)、(10,9)、(138,6)、(144,4)、(20,8)、(28,9)、(37,9)、(46,9)、(55,9)、(64,9)、(73,9)、(82,9)、(91,9)、(100,1),相对地址就变成1-14,应该读到的相对位置为3。其他的情况以此类推
4.文件内容的修改就不再多余叙述了
面试完毕后我回去宿舍查看一下金山网络的新闻动态,发现他们最近在wps上新加了一个功能:可以在手机wps上读取大文件。看完后我深深地后悔了,如果要准备面试一家公司,一定要对公司的动态或产品有了解,这样就能有充分的知识准备去应对面试。