分组Top N问题(一) - java实现Top n算法基础

本文介绍了在Java中解决分组Top N问题的四种方法:合并法、快排过程法、使用小顶堆/大顶堆以及PriorityQueue。详细讨论了每种方法的数据特点、实现步骤和适用场景,为理解和实现Top N算法提供了基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

在分析MapReduce、Hive、Redis和Storm、Spark等工具实现分组Top n问题前,我们先看下java最原始实现Top的方法有哪些,为后面奠定些基础,这也是我要整理成一个系列的原因。

对于Top n问题,这里根据数据特点用合并法、快排过程法、大小顶堆和PriorityQueue固定队列四种方式来实现。

合并法:

数据描述:这种方法适用于几个数组有序的情况,来求Top k。

实现描述:采用Merge的方法,设定一个数组下标扫描位置记录临时数组和top结果数组,然后从临时数组记录下标开始遍历所有数组并比较大小,将最大值存入结果数组,最大值对应所在数组下标加一存入临时数组,以使其从下位开始遍历,时间复杂度为O(k*m)。(m:为数组的个数)。

具体实现:

package fjdm;
import java.util.ArrayList;
import java.util.List;
/**
 * 已知几个递减有序的m个数组,求这几个数据前k大的数
 * a[4,3,2,1],b[6,5,3,1] -> result[6,5,4]
 * @author 张恩备
 * @date 2016-11-25 上午10:57:03
 */
public class TopKByMerge{
 public static int[] getTopK(List<List<Integer>>input,int k){
	int index[]=new int[input.size()];//保存每个数组下标扫描的位置;
	int result[]=new int[k];
	for(int i=0;i<k;i++){
	   int max=Integer.MIN_VALUE;
	   int maxIndex=0;
	   for(int j=0;j<input.size();j++){
		   if(index[j]<input.get(j).size()){
				if(max<input.get(j).get(index[j])){
					max=input.get(j).get(index[j]);
					maxIndex=j;
				}
		   }
	   }
	   if(max==Integer.MIN_VALUE){
		   return result;
	   }
	   result[i]=max;
	   index[maxIndex]+=1;
	   
	}
	return result;
 } 
 public static void main(String[] args) {
	 List<Integer> a = new ArrayList<Integer>();
	 a.add(4);
	 a.add(3);
	 a.add(2);
	 a.add(1);
	 List<Integer> b = new ArrayList<Integer>();
	 b.add(6);
	 b.add(5);
	 b.add(3);
	 b.add(1);
	 List<List<Integer>> ab = new ArrayList<List<Integer>>();
	 ab.add(a);
	
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值