如何使用10M的内存读入100M的文件,并且保证在读取过程中可进行删除、修改和增加内容

来源:互联网 发布:淘宝奖池怎么设置 编辑:程序博客网 时间:2024/06/02 13:21

     这是几个月前我面试金山网络的校招题目,面试官的原题是:假设你的电脑内存是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上读取大文件。看完后我深深地后悔了,如果要准备面试一家公司,一定要对公司的动态或产品有了解,这样就能有充分的知识准备去应对面试。

0 0
原创粉丝点击