阿里二面:100m内存怎么读10G文件 | 讲得最通俗易懂的一集

作者: Java面试题分享分类: 计算机技术 发布时间: 2024-05-28 15:48:48 浏览:5431 次

阿里二面:100m内存怎么读10G文件 |  讲得最通俗易懂的一集

克1khm:
加内存,10个G花不了多少,一般不敢这种活,干这种活的,也不缺这点儿内存,算法角度可以用时间换空间,不过,能干这种事的,时间会更值钱。综上,加内存,花点儿[doge]。

【回复】一个mmap内存映射搞定,
橙月Yukio:
如果我这10G文件实际只表示一个有10G位的大数呢[doge]

z774930:
这个思路存在问题,整个数据中出现次数最多的不一定在每个分块中出现次数都最多 0 0 1 1 1 0 0 2 2 2 0 0 3 3 3 假设这样15个数,每5个一组,很显然出现次数最多的是0但没有一组出现次数最多的会是0 所以为了更好的适应性,可以分层 每组出现次数前n的数,n不必特别大,内存占用很低,再把组合并,可以更加稳定的找到出现次数最多的数

【回复】我觉得他的意思是数字本身分块,比如0和1存在一个文件,2和3存在另一个文件,4和5存在另一个文件。统计的时候如果想避免重复打开关闭文件的话可以读三遍,第一遍只读0和1,其他跳过,以此类推
Cobight:
郑州蚂蚁外包昨晚遇到了这题,你早点啊![doge]

四处察察:
shit,32M内存都能按行够读取1*10^10000000000EB的文件

一级有大:
题目是数字,也就是说只有0到9这10个,用map存够了

【回复】回复 @一级有大 :死抠字眼没劲了,别人想表达哪个意思你不清楚吗[doge]
【回复】回复 @权方和等式 :数和数字是有区别的,99是数
扩大福:
这个是java吗?java的char是两个字节?long是8字节?没接触过java不清楚,一直弄的c/c++,这两个类型和java的不一样

【回复】话说假如每个分段统计得到的前几位出现数非常接近,或者说以高低频出现不就有问题了
【回复】java用的UTF-16编码,char类型两个字节大小,小于两个字节的字符用一个char来存储,大于两个字节的字符用两个char来存储,一个char是高代理项,一个char是低代理项,组成一个代理对。
权方和等式:
直接哈希,分成若干个桶。如果某个桶数量大于10m,用其他哈希函数分桶。最后每个桶都小于10m,每个桶都算出最大的次数就就是答案[doge]

【回复】回复 @z774930 :可以证明,任意两个桶的任意数字 必然不会相同[doge]
【回复】每个桶中出现次数最多的数字,不一定是全局出现次数最多的数字

科技猎手 技术 IT 程序员 编程 教程 计算机技术 java Java Java面试

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!