TopK-求数组中N个数据中最大的K个元素

本文介绍了一种高效解决TopK问题的方法:通过构建一个小堆来筛选出数组中的最大K个元素。首先,创建一个包含前K个元素的小堆,然后遍历剩余元素,若当前元素大于堆顶元素,则替换并重新调整堆。这种方法能有效找出最大K个值。

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

TopK问题求解的最佳方式就是使用堆。

       要求最大的K个元素,所以我们建一个有K个元素的堆(为了方便,直接将前K个值放到堆中),调整堆的形态为小堆,堆顶的元素是最小值,将数组中的每个数字和堆顶比较,如果该数大于堆顶,就把堆顶换成该数,同时使用堆的向下调整操作,将堆调整成排好序的堆,这样依次循环,最后得到的就是最大的K个值

void AdjustDown(int array[],int size,int root){
	//判断root是否是叶子结点
	//因为堆是完全二叉树,所以没有左孩子一定没有右孩子,
	//堆是顺序存储,找到左孩子的下标,如果左孩子的下标越界了,则没有左孩子

	while(1){
	int left = 2 * root + 1;
	if(left >= size){
		return ;//是叶子节点
	}
	//找到左右孩子中最小的一个
	//这里一定有左孩子,判断是否有右孩子
	int right = 2*root+2;
	int min;
	if(right<size&&array[right]<array[left]){
		min = right;
	}
	//比较
	if(array[root]<=array[min]){
		return;
	}
	//交换值
	int t = array[root];
	array[root] = array[min];
	array[min] = t;
	root = min;
	}
}

void CreateHeap(int array[],int size){
	for(int i = (size-2)/2;i>=0;i--){
		AdjustDown(array,size,i);
	}
}
void TopK(int array[],int size,int k){
	int *heap = (int *)malloc(sizeof(int)*k);
	for(int i=0;i<k;i++)
	{
		heap[i] = array[i];
	}
	//针对heap,建小堆
	CreateHeap(heap,k);
	for(int j=k;j<size;j++)
	{
		if(array[i]>heap[0]){
			heap[0] = array[j];
			AdjustDown(heap,k,0);
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值