问题:对于有9亿条不重复的11位整数对这个文件进行排序?
问题转换:一个移动公司的一个任务需要把9亿个11位电话号码进行排序?
对于转换之前的问题我们可能认为实用性不大,但是转换之后变成电话号码了这就有实用性了。
对于一些小伙伴来说可能一上来就马上思考把所有数据导入到内存中,然后使用我们常用的快速排序,归并排序等,最后将排序好的数据存入文件 。但是对于9亿条数据对于java来说一个int型的整数4个字节。这里有9亿 X 4字节 ,就需要用3.6GB左右的内存(四舍五入就是一个亿啊),3。6GB的数据同时读入内存载入起来特别的复杂麻烦,排序就更不用想了。
下面给出几个方法:
1.数据库排序:数据库排序不需要我们自己设定算法,我们只需要将文件导入数据库中,让数据库进行索引排序操作后提取数据到文件。这种方法虽然简单,方便,但是运算速度 比较慢,需要考察我们对数据库设备。
2.分治法。通过Hash法将9亿条数据分为20段,每段大约5000万条,大约占用200MB的空间,在文件中依次搜索0-5000万,5000万零1到1亿 将排序的结果存入文件。每次都进行归并。
3.位图法。对于11位数最大的是99999999999,由于我们这里的数据是不重复的,可以把这些数据组成一个数组,初始化一个99999999999大小的数组,我们只需要遍历一次就可以统计出他们分布情况,在其中用0或1 表示有还是没有,所以只需要一个bit就可以存储,而声明一个可以包含11位整数的bit数组,一共需要12亿/8,大约150MB内存就可以进行一次排序。一般推荐位图法。
海量数据排序问题
最新推荐文章于 2024-05-24 12:15:56 发布