top k

本文介绍了一个堆调整算法的具体实现过程,该算法通过一系列的比较和交换操作来维护堆的性质。主要内容包括使用C++实现的堆调整函数HAdjust,该函数接收一个整数向量、一个起始索引及向量的大小作为参数,并通过循环结构和条件判断来完成堆的调整。此外,还提供了一个演示如何利用此函数进行堆操作的main函数。

记录:

#include<iostream>
#include<vector>
using namespace std;
void HAdjust(vector<int> &vec,int i,int n)
{
	int iL,iR,j;
	while(i<=n/2-1&&i>=0)
	{
	   iL=2*i+1;
	   iR=iL+1;
	   j=iL;
	if(iR<n&&vec[iR]<vec[iL]) j=iR;
	if(vec[i]>vec[j]) swap(vec[i],vec[j]);
	i--;
	}
}
int main()
{
	int k=10;
vector<int> vec(k,0);
int temp;
while(cin>>temp)
{
   if(temp<vec[0])
	   continue;
   else
   {
	   vec[0]=temp;
	   HAdjust(vec,4,10);
   }
   for(int i=0;i<10;i++)
	   cout<<vec[i]<<" ";
   cout<<endl;
}
return 0;
}


03-14
### TopK 算法概述 TopK 算法是一种用于从大量数据中高效提取前 K 个最大或最小元素的算法。这种算法广泛应用于电商平台推荐热门商品、搜索引擎返回最相关的搜索结果以及音乐平台展示最受欢迎的歌曲等场景[^1]。 #### 时间复杂度分析 通过堆排序的思想实现 TopK 算法的时间复杂度为 O(n log k),其中 n 表示数据总量,k 是目标数量。相比直接对整个数据集进行排序后再取前 K 项的方法(时间复杂度为 O(n log n)),这种方法更加高效,尤其是在处理大规模数据时表现尤为突出。 --- ### 堆排序思想下的 TopK 实现 为了更具体地理解如何利用堆来解决 TopK 问题,下面提供一种基于 Python 的实现方式: ```python import heapq def top_k_largest(nums, k): """ 找到列表 nums 中最大的 k 个数。 参数: nums (list): 输入的整数列表。 k (int): 需要找到的最大数值的数量。 返回: list: 列表中的前 k 大值。 """ if not nums or k <= 0: return [] min_heap = [] # 使用小根堆存储当前最大的 k 个数 for num in nums: if len(min_heap) < k: heapq.heappush(min_heap, num) # 如果堆未满,则加入新元素 elif num > min_heap[0]: heapq.heapreplace(min_heap, num) # 替换掉堆顶较小的元素 return sorted(min_heap, reverse=True) # 测试代码 nums = [7, 10, 4, 3, 20, 15] k = 3 print(top_k_largest(nums, k)) # 输出应为 [20, 15, 10] ``` 上述代码的核心在于维护一个小根堆 `min_heap` 来保存当前已知的前 K 大值。当遍历到新的较大值时,将其替换入堆并重新调整堆结构以保持其性质不变[^2]。 对于寻找最小值的情况也可以采用类似的策略,只需构建大根堆即可完成相应功能[^3]。 --- ### 应用实例 假设某在线购物网站希望向用户推荐销量最高的十款产品作为促销活动的一部分。如果数据库中共有百万级条目记录每件商品的历史销售情况,则可以直接运用此方法快速筛选出符合条件的目标集合而无需加载全部数据至内存再逐一比较效率低下操作过程。 同样,在社交网络领域里也存在许多类似需求比如统计点赞次数最多的帖子评论区互动活跃度较高的回复等等都可以借助于这类技术手段加以优化提升用户体验满意度同时降低服务器负载压力成本开销等方面均能取得良好效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值