如何解决查找文件中出现的每个整数值的绝对计数
| 在最近的一次采访中问 有一个包含一百万个整数的日志文件。每个整数的长度为32位。日志文件中的特定整数值可能会重复。您可以顺序读取日志文件。您还可以按顺序读取和写入临时文件。随时可以打开的文件数量没有限制。但是,在任何给定时间,您在内存中最多可以保留2000个整数。 我被要求生成一个直方图,以显示日志文件中出现的每个整数值的绝对计数,并说明每个整数必须加载到内存中的次数的顺序复杂度的上限解决方法
这是一个令人困惑的问题。您不能只读取2,000个数字,对它们进行排序,然后再写入临时文件吗?进行500次,然后进行N次合并。每个数字将两次加载到内存中。
如果必须在只有2 GB RAM的计算机上对1 TB大小的文件进行排序,则这与您要做的事情相同。
,打开232个临时文件,每个整数一个。顺序读取一次日志文件。每当读取整数n时,请将“ 1”写入临时文件编号n。然后通过遍历所有临时文件来生成直方图。每个整数只能读一次到内存中,因此它是O(n)算法。
,保留在内存中2000 int =大小
缓冲区
读写文件无限制
=每个数字计数将存储在一个文件中。
32位长度数=每个
文件是一个数字,文件名
是代表
整数(可以使用整数值
以及)
显示直方图(表示无顺序
需要)
伪代码:
count = 2000
HashMap<number,number> = new
code:readbuffer
while count != 0
read NextNumber
if HashMap.HasKey NextNumber then HashMap[NextNumber]++
else HashMap[NextNumber]=1
count --;
end while
code:flushbuffer
foreach Key in HashMap
if exists FileName Key.ToBinnary
FileValue += HashMap[HashKey]
else WriteNewFile FileName=Key.toBinnay; SetValue = 1
end foreach
code: histogram
each file name is the number;
each file value is the count.
费用:readbuffer
顺序号读取= 2M(M =百万)
Map.HasKey =(在2000年记录中搜索密钥,最坏的情况是该数字不存在,SUMMARY(∑2000)x2M)
地图上的SetValue与上述费用相同
总计:(2M)+(2Mx∑2000)x2
费用:flushbuffer
File.exists 2M
费用:直方图
2M
总计= 6M + 4Mx∑2000
,实现基于文件的B树。
文件名是GUID。
文件内容为:
看数字
计数
左节点文件
右节点文件
经过一遍之后,复杂度可以从B树得出。
而且您的直方图隐含在结构中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。