海量数据算法
http://topic.csdn.net/u/20090806/16/72971F41-0EE8-48C3-BBD9-43572A78AD1F.html
1.有1亿个浮点数,请找出其中对大的10000个。提示:假设每个浮点数占4个字节,1亿个浮点数就要站到相当大的空间,因此不能一次将全部读入内存进行排序。
2:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。
3:有一篇英文文章(也就是说每个单词之间由空格分隔),请找出“csdn”着个单词出现的次数,要求效率最高,并写出算法的时间级。
4:给定一个日期2031-7-2,求出该日为星期几(已知2002-3-28为星期四)。只要求说明思路,不要写java code
1.有1亿个浮点数,请找出其中对大的10000个。提示:假设每个浮点数占4个字节,1亿个浮点数就要站到相当大的空间,因此不能一次将全部读入内存进行排序。
答:
1.每100万个一组,读到内存(大约要4M内存)中,构建大顶堆,把堆顶(最大数)和文件号记录到一个100大小的数组A,再写回到磁盘,形成一个文件,这样共形成100个文件。
2。这时,A数组也添满了,再对这A数组建大顶堆。
3.堆顶A[0]输出。
4.对堆顶对应的文件(同文件号确定)去掉堆顶后重新调整堆,再把新的堆顶放到A[0].
5.对A调整堆。
6. 对2~4步循环10000次,最大的10000个数就选出来了。
2:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。
答:
简单的说.
1. 每次读入500M个整数用快速排序排序。存为文件。
2.把产生的20个文件用归并排序两两合并,直到归为一个文件。
3.在文件中找到第5G和第5G+1个数,求这两个数的平均数即所求。
3:有一篇英文文章(也就是说每个单词之间由空格分隔),请找出“csdn”着个单词出现的次数,要求效率最高,并写出算法的时间级。
答:
1.把整个文章存入char[]数组chars。
2.根据下标变量index扫描chars。
3.如果chars[index]==' ' && chars[index+1]!=' ';则从index+1开始判断接下来的四个字符是不是csdn.只要有一个不匹配,或者下一个字符是空格,则不再匹配。如果全匹配则counter++.
算法的时间复杂度为O(n) n为文章的长度。和“csdn”没有关系,index不会有重复的值。
4:给定一个日期2031-7-2,求出该日为星期几(已知2002-3-28为星期四)。只要求说明思路,不要写java code
答:
1.根据条件,2002-3-31为星期日.
2.从2002-4-1开始统计到2031-7-2的天数counter。
3.2002年 4,5,6,7,8,9,10,11,12月数加起来30*9+5=275天。
4.2003~2030年的天数=365*(30-3+1)+30/4
5.2031年的天数,1~6月的天数=6*30+3-2
7.20031年7月的天数为2.
8.上面3~5的天数之和放入counter.
9.counter%7为0是星期天,其它情况是几就是星期几。
我估计不让用Calender。用Calender就简单了。2002-3-28为星期四这个条件也就没有用了。