TopN指的是从已经存在的数组中,找出最大(或最小)的前n个元素。
算法的核心就是循环数组,并将当前的最大的n个数存入一个数组topN[n]中,插入结束后对数组进行排序。当循环到第k+1个数时,与topN[0]比较,若比topN[0]大,则替换topN[0]为第k+1个数,并对topN[n]排序;若比topN[0]小,则比较下一个数。
下面是实现方法:
package com.xiva.cms.data.test;
import java.util.Date;
import java.util.Random;
import com.xiva.cms.data.util.SortService;
/**
* Top N 算法
* @author XIVA
*
*/
public class TopNAlgorithm
{
public static int[] datas = new int[100000000];
/**
* 生成测试数据
*/
public static void genarateData()
{
Random random = new Random(new Date().getTime());
for (int i=0; i < datas.length; i++)
{
datas[i] = random.nextInt(1000000000);
}
}
/**
* main 方法
* @param args
*/
public static void main(String[] args)
{
SortService<Integer> sortSrv = new SortService<Integer>();
int topN = 100;
Integer[] topNData = new Integer[topN];
System.out.println("Start genarate Data.");
TopNAlgorithm.genarateData();
System.out.println("End genarate Data.");
// 初始化 Top N
for(int i=0; i < topN; i++)
{
topNData[i] = 0;
}
System.out.println("Search for top N Starting.");
// 获取TopN
for ( int i = 0; i < datas.length; i++)
{
int num = datas[i];
if (num % 1000000 == 0)
{
System.out.println("Search for top N index:" + i);
}
if (topNData[0] < num)
{
topNData[0] = num;
// 使用折半插入排序
sortSrv.binaryInsertSort(topNData, 1);
}
}
for (int i = 0; i < topNData.length; i++)
{
System.out.println("Top N:" + topNData[i]);
}
System.out.println("Search for top N ended.");
}
}