TopK---返回第K小(大)的数字

本文介绍了TopK问题,即如何在数组中找到第K小(或大)的数字。讨论了两种解决方案:一是基于快速排序的快排选择算法,通过partition函数定位并递归查找;二是利用最小堆,先构建K大小的最小堆,然后依次与后续元素比较并调整堆,最终堆顶元素即为第K小的数字。提供了相关代码实现。

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

TopK—返回第K小(大)的数字

给定一个数组,返回数组中第K小(或者第K大)的数字,比较经典的TopK问题。

快排选择

基于快排的思想,partition函数每次将切分元素放置到正确位置pos:当我们需要的K>pos时,代表我们需要再从(pos,right]中查找;当K

最小(大)堆

基于堆排序的思想,当我们需要查找第K小(大)的数字时,我们将数组前K个元素构建成最大(小)堆,则堆顶元素是前K个数字中最大的(也就是第K小的),再从数组第K+1个元素开始遍历,如果元素小(大)于当前堆顶元素,则交换到堆顶,再调整堆,维护最大堆,当遍历完数组后,堆顶元素就是整个数组中第K小的元素。

代码:

#include<iostream>

using namespace std;

void exchange(int a[],int i,int j);
int partition(int a[],int lo,int hi);
int quick_selector(int a[],int k,int size)
### 使用Python实现TopK算法 为了实现在量数据中找到前`k`个最或最小元素的需求,可以采用堆这一高效的数据结构来完成。下面展示了一个基于堆的`topk`函数的具体实现方式。 ```python import heapq def topk(data, k, reverse=False): """ 返回列表data中的前k(当reverse为True)或前k小(默认情况)元素组成的有序列表。 参数: data (list): 输入数据集。 k (int): 需要获取的最/最小子项数量。 reverse (bool): 如果设置为True,则返回的k个项目;如果False则相反。 返回: list: 前k个最/最小项目的排序列表。 """ heap = [] for item in data: if len(heap) < k: heapq.heappush(heap, item) else: # 当寻找较的k个数值时,比较当前item与heap中最小值; # 反之亦然,即在寻找较小的k个数值时,应调整条件逻辑。 if (reverse and item > heap[0]) or (not reverse and item < heap[0]): heapq.heapreplace(heap, item) # 对最终得到的小顶堆/顶堆进行降序/升序排列并输出结果 result = sorted(heap, reverse=reverse) return result ``` 这段代码通过维护一个小不超过`k`的最小堆(用于找最值的情况)或者最堆(用于找最小值),遍历输入序列中的每一个元素,并根据实际情况更新堆内的成员[^1]。最后通过对这个固定长度的堆做一次完整的排序操作获得所需的`top-k`集合。 对于上述例子而言: ```python data = [4, 2, 7, 1, 8, 3, 5, 6] k = 3 result = topk(data, k, reverse=True) print(result) ``` 执行以上程序将会打印出列表`data`里三个最数字—— `[8, 7, 6]`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值