/**
* 求最大的M个 解决方案:小根堆(数据量比较大的情况下
* @author 团团儿
*
*/
public class TopM {
/**
* 创建k个节点的小根堆
*/
public int[] createHeap(int a[],int k) {
int[] result=new int[k];
for (int i = 0; i <k; i++) {
result[i]=a[i];
}
for (int i = 1; i < k; i++) {
int child=i;
int parent=(i-1)/2;
while (child!=0&&parent>=0&&result[parent]>result[child]) {
int temp=result[child];
result[child]=result[parent];
result[parent]=temp;
child=parent;
parent=(parent-1)/2;
}
}
return result;
}
/**
* 插入新值
* @param result
* @param value
*/
public void insertHeap(int result[],int value) {
result[0]=value;
int parent=0;
while (parent<result.length) {
int lchild=parent*2+1;
int rchild=parent*2+2;
int minIndex=parent;//指向左右儿子中最小的
if(lchild<result.length&&result[lchild]<result[parent])
minIndex=lchild;
if(rchild<result.length&&result[rchild]<result[minIndex])
minIndex=rchild;
if (minIndex==parent) {
break;
}else {
int temp=result[minIndex];
result[minIndex]=result[parent];
result[parent]=temp;
parent=minIndex;
}
}
}
/**
* 找到前k个最大值
* @param a
* @param k
* @return
*/
public int[] getTopByHeap(int a[],int k) {
int result[]=createHeap(a, k);
for (int i = k; i <a.length; i++) {
if (a[i]>result[0]) {
insertHeap(result, a[i]);
}
}
return result;
}
public static void main(String[] args) {
int a[] = {4,3,5,1,2,8,9,10};//待找TOP M 的排海量数据N
int result[] = new TopM().getTopByHeap(a, 6);
System.out.print("TOP M is :");
for(int resultItem : result) {
System.out.print(resultItem + " ");
}
}
}
TopM实现
最新推荐文章于 2022-11-30 09:43:24 发布