java海量数据_关于java:海量数据处理-大量数据中找出最大的前10个数-Top-K-问题...

在工作中咱们常遇到此类问题,从一个大量甚至海量的数据中取出前几个大的数。必须在海量的文章中取出点击量最大的10篇文章。

此类问题其实就是Top K问题。

给定一个数据(数据量海量 N),想找到前 K 个最大的或最小的元素。

eg:有10亿个Long型整数,存储在文件中,如果找出其中最大的10个?

最容易想到的办法是将数据全副排序,而后在排序后的汇合中进行查找,最快的排序算法的工夫复杂度个别为O(nlogn),如疾速排序。每个Long类型占8个字节,10亿个数就要占用7GB+的存储空间,对于一些可用内存小于7GB的计算机而言,很显然是不能一次将全副数据读入内存进行排序的。其实即便内存可能满足要求(我机器内存都是8GB),该办法也并不高效,因为题目的目标是寻找出最大的10个数即可,而排序却是将所有的元素都排序了,做了很多的无用功。

第二种办法采纳最小堆。首先读入前10个数来创立大小为10的最小堆,而后遍历后续的数字,并于堆顶(最小)数字进行比拟。如果比最小的数小,则持续读取后续数字;如果比堆顶数字大,则替换堆顶元素并从新调整堆为最小堆。整个过程直至10亿个数全副遍历完为止。而后依照中序遍历的形式输入以后堆中的所有10个数字。这个办法应用的内存是可控的,只有10个数字所需的内存即可。

这种办法Java中有现成的数据结构优先级队列能够应用:java.util.PriorityQueue

代码如下:

import org.junit.Test;

import java.io.*;

import java.util.PriorityQueue;

import java.util

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值