阿里中间件笔试题---大数据排序

一,题目概要

题目:有10个文件,每个文件有1000万行,文件内容的每一行为一个自然数;需要,写一个程序,将所有数字排序,分为10个文件输出,如0号文件包含前1000万个数字,1号文件文件包含第1千万-2千万之间的数字,依次类推。

限制:如果使用java-Xmx需要设置为32MB;其它语言也需限制内存为32MB

要求:正确输出 使用多线程加分

编写时长:24 小时。提供可运行的程序,以及实现说明

二,解题思路

提取信息:输10按题目要求的文件,经过排序,输出10个相应样式的文件。其中每个整数按4个字节算,需要内存大小为4*10000000*10=400MB。由于内存限制为32MB,所以要控制IO和内存完成排序

思路一:数据库排序

文本文件导入到数据库,让数据库进行索引排序操作后提取数据到文

->干未提供额外数据库支持,且查询时间耗费太高

路二:BitMap

声明一个可以包含8位整数的bit数组(1亿),一共需要1亿/8=12.5M内存,把内存中的数据全部初始化为0 ,读取文件中的数据,并将数据放入内存,相应位置1,输出位数为1的整数即可,满足内存限制

->干未说明输入文件整数唯一,提供额外计数位不确定

路三:外部排

借助磁盘空间作为数据中转,即从n个中转文件中(中转文件内的数据先要在内存排好序),每次取出N/nN为最大内存可用空间)长度的顺串在内存中排序,然后写入输出文件直到归并完成

->可行性高

路四:Hadoop Mapreduce

大数据框架配合处理运算节点,输出文件

->需要调整配置Hadoop,题干应该是考算法,不是工程

最终选择思路三:外部排

第一种做法:输入10个文件,每次读相应大小的文件量并在内存用多线程归并排序(或者快排),排好输出到中转文件,然后将每个中转文件的前N/n读取到内存,再调用多线程排序,输出到10个文件中。

二种做法:输入10个文件,使用选择置换来生成顺串,多路归并来归并顺串,败者树来达到最优归

点分析:

管哪种做法Java文件IO都是绕不开的,

第一种做法比较简单,难点在于用多线程实现排序,不过磁盘IO次数多,时间效率会比较低

第二张做法通过算法减少磁盘IO次数时间,时间上会有优势,不过算法实现堆排序的多线程有难度

最终考虑第二种做法,实现算法,放弃多线程

三,实现说明

(流程:读文件->选择置换算法生成顺串->败者树多路归并->输出文件

选择置换算法用于生成顺串,在有限的内存限制下,它可以生成大概两倍于内存大小的顺串,其算法步骤如下

假设内存中只有一个能容纳N个整型的数

1. 首先从输入文件中读取N个数字将数组填满  

2. 使用数组中现有数据构建一个最小

3. 重复以下步骤直到堆的大小变为0

a. 把根结点的数字A(即当前数组中的最小值)输出

b. 从输入文件中再读出一个数字B,若R比刚输出的数字A 大,则将B放到堆的根节点处,若B不比A大,则将堆的最后一个元素移到根结点,将B放到堆的最后一个位置,并把堆的大小缩减1(即新读入的数据没有进入堆中)

c. 在根结点处调用Siftdown重新维护堆

4. 换一个输出文件,重新回到步骤

败者树:在多路归并的过程中,如果有K个顺串,每次有K个候选值,要找出其中的最小值,普通的做法需要进行K-1次比较,而使用败者树,则只需要OlogK)次比较,其原理就像我们平常的分组比赛,一个参赛者在小组出线之后,只需要与其他小组出线的参赛者比赛即可决出最后的冠军(最值),而不需要和其他所有参赛者都比一遍。

具体源码见https://github.com/lishinho/2019,这里稍微讲解:

generateData.class 有主方法Main生成随机数文件,getRandomNumber生成从0Integer.Max_VALUE的随机值

Main.class test方法 文件初始化,把文件输入到缓存中;buildHeap建初始堆;siftDown调整堆;MultiWayMergeSort多路合并;createLoserTree建败者树;adjust调整败者树;CompareStr比较两个字符串型整数值大小

Test.class 主函数测试

四,结果验证

参考文献:

1.大数据排序总结

https://blog.csdn.net/zhushuai1221/article/details/51781002

2. 大数据排序常用数据结构

https://blog.csdn.net/chenchaofuck1/article/details/52069597

3. 选择置换+败者树C++实现

https://www.cnblogs.com/benjamin-t/p/3325401.html

猜你喜欢

转载自blog.csdn.net/wannuoge4766/article/details/89031384