java常见问题 挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?
浏览量:2043
时间:2021-03-15 08:01:02
作者:admin
挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?
一、用4字节表示的整数个数为2^32≈40亿,而用2字节表示的无符号整数个数为2^16≈6万。
二、2G=2^31B≈20亿字节。
三、要找出出现次数最多的数,则应记录每个数出现的次数,最快的方法是在内存中将每个数出现的次数记录下来,记录的方法则是内存地址对应数,相应地址的内存单元记录次数,但2G内存以字节为单位仅能记录20亿个数,且每个数出现的次数大于255将会出现溢出风险。因此,这一方案不可取。
四、这样只能将每个次出现的次数记录在磁盘上。这样在磁盘上建一个16G的文件,每4字节对应一个整数,可对应40亿个整数,并用于记录相应整数的出现的次数。
1、将文件初始化。
2、依次读取数据,并用无符号整数记录在磁盘文件中,如出现溢出,则该数为次数最多的数。
3、从文件中读取各数出现的次数,用一个变量A记录最高次数,再用一个变量B记录最高次数出现的数据个数,要用个文件依次记录最高次数出现的数。当最高次数增加时,A 1,B置1,文件中写入该数,同次数的数出现时,B 1,文件相应位置写入该数,直到全部读完。
这样根本不需2G内存。
一表示什么,从总数里面去掉一部分?
"部分数"和"总数"是分析加减法应用题的数量关系用到的概念。例如:小华有20本课外书,借给同学5本,还剩几本?在这道题中,“20本”是总数,借出的5本是一部分,剩下的是另一部分,借出的和剩下的都是部分数。数量关系式是:部分数 另一部分数=总数总数-部分数=另一部分数求“还剩几本”就是求另一部分数是多少,20-5=15,剩下15本。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。