栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言数据结构】利用堆解决Topk问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言数据结构】利用堆解决Topk问题

Topk问题:给定你一个数组a,内有n个元素,请问怎么可以找出他前k个最大/最小的数?

这个题我们可以利用堆的特性来解决。我们可以先创建一个大小为k的小堆(如果求前k个最小的数就创建大堆,这里以求前k个最大的数为例),并对其排序。此时排在堆顶的就是当前堆内最小的数。下一步我们将剩余n-k个数依次与堆顶元素比较,如果这个数比堆顶元素大,那么将堆顶元素删除并将这个数入堆,否则就检查下一个数。如此下来到最后,堆内剩下的元素就是所有数里最大的k个数了。

void PrintTopK(int* a, int n, int k)
{
	HP hp;
	HeapInit(&hp);
	for (int i = 0; i < k; i++)
	{
		HeapPush(&hp, a[i]);
		//先将前k个元素入堆,当全部入完后已经自动将最小的元素列在堆顶
	}
	//此时取后面的n-k个元素依次与堆顶元素比较
	for (int i = k; i < n; i++)
	{
		
		if (a[i] > hp.a[0])
		{
			HeapPop(&hp);
			HeapPush(&hp, a[i]);
		}
	}
	HeapPrint(&hp);
	//最后打印一下堆内元素
	HeapDestroy(&hp);
}

当求前k个最小的数时,就把堆变为大堆,判断条件改为当元素比堆顶元素小的时候删除堆顶元素并将这个元素入堆即可。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429486.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号