假如你有一组数据,现在让你求出前K大的数字。有的人说,直接排序不就Ok了。那么我的问题来了。
如果这个数据很多呢,并且现在给你分配的内存很小,不足以让你开辟足够大的空间去存储数组。我们该怎么办。
这个时候我们就可以用堆来实现。
比如我们现在有300000个随机数字,现在让你找出来前100大的数字。
思路:我们可以建立一个容量为100堆,先将前100个数据存入。将堆变成小根堆,接下来每次从随机数字中取出一个数字,和堆顶的元素比较大小,如果大于堆顶的元素,将堆顶元素替换,在将堆变成小根堆。以此类推,直到所有元素遍历完。
堆实现模块
public class TestHeap {
private final int DEFALUT_SIZE = 10;
private int[] elem ;
public TestHeap() {
this.elem = new int[DEFALUT_SIZE];
}
public void heapSort(int[] arr){
int i;
//先将前k个元素存入堆中
for(i = 0;i<DEFALUT_SIZE;i++){
elem[i] = arr[i];
}
while(i<arr.length){
smallHeapSort(arr[i]);
i++;
}
this.show();
}
//小根堆实现
public void smallHeapSort(int a){
if(elem[0]<a){
elem[0] = a;
int parent = 0;
int child = 2*parent+1;

在处理大量数据并需要找出前K大数字时,由于内存限制不能直接排序。本文介绍了使用小根堆的方法来解决这个问题。通过建立一个容量为K的堆,先存储前K个数据并保持堆有序,然后依次与后续数据比较,更新堆以找到前K大的数字。文章还提供了具体的堆实现和测试过程。
最低0.47元/天 解锁文章
1393

被折叠的 条评论
为什么被折叠?



