news 2026/6/15 12:16:06

海量数据中找出最大的前100个(find_topk)最小堆算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
海量数据中找出最大的前100个(find_topk)最小堆算法

我来帮你实现这个寻找前100个最大数据的算法。这个算法的时间复杂度是O(n log 100),空间复杂度是O(100)。

C++实现

#include<iostream>#include<vector>#include<queue>#include<functional>#include<random>usingnamespacestd;// 寻找前k个最大元素的算法vector<int>findTopK(constvector<int>&nums,intk){if(nums.size()<=k){vector<int>result(nums.begin(),nums.end());returnresult;}// 创建最小堆priority_queue<int,vector<int>,greater<int>>minHeap;// 步骤1: 插入前k个元素for(inti=0;i<k;i++){minHeap.push(nums[i]);}// 步骤2-3: 遍历剩余元素,维护堆for(size_t i=k;i<nums.size();i++){if(nums[i]>minHeap.top()){minHeap.pop();// 弹出堆顶minHeap.push(nums[i]);// 插入当前元素}}// 步骤4: 堆中元素即为前k个最大数据vector<int>result;while(!minHeap.empty()){result.push_back(minHeap.top());minHeap.pop();}returnresult;}intmain(){// 生成测试数据vector<int>data(1000);random_device rd;mt19937gen(rd());uniform_int_distribution<>dis(1,10000);for(inti=0;i<1000;i++){data[i]=dis(gen);}intk=100;vector<int>topK=findTopK(data,k);cout<<"前"<<k<<"个最大元素:"<<endl;for(size_t i=0;i<topK.size();i++){cout<<topK[i]<<" ";if((i+1)%10==0)cout<<endl;}cout<<endl;return0;}

Python实现

importheapqimportrandomfromtypingimportListdeffind_top_k(nums:List[int],k:int)->List[int]:""" 寻找前k个最大元素的算法 实现步骤: 1. 创建一个最小堆并将前k个数据插入堆中 2. 遍历剩余的数据,如果当前数据比堆顶大,就替换堆顶元素 3. 继续遍历所有数据,确保堆中保留的是最大的k个数据 4. 遍历完成后,堆中的元素就是前k个最大的数据 """iflen(nums)<=k:returnsorted(nums,reverse=True)# 步骤1: 创建最小堆并插入前k个元素min_heap=nums[:k]heapq.heapify(min_heap)# 建立最小堆# 步骤2-3: 遍历剩余元素,维护堆fornuminnums[k:]:ifnum>min_heap[0]:# 如果当前元素比堆顶大# 弹出堆顶,插入当前元素heapq.heapreplace(min_heap,num)# 步骤4: 堆中元素即为前k个最大数据# 堆是最小堆,需要排序后返回result=sorted(min_heap,reverse=True)returnresultdeffind_top_k_alternative(nums:List[int],k:int)->List[int]:"""另一种实现方式,更清晰地体现算法步骤"""iflen(nums)<=k:returnsorted(nums,reverse=True)# 步骤1: 创建最小堆并插入前k个元素min_heap=[]foriinrange(k):heapq.heappush(min_heap,nums[i])# 步骤2-3: 遍历剩余数据foriinrange(k,len(nums)):ifnums[i]>min_heap[0]:# 比堆顶大# 我就往堆里面插heapq.heappop(min_heap)# 弹出堆顶heapq.heappush(min_heap,nums[i])# 插入当前数据# 步骤4: 返回结果returnsorted(min_heap,reverse=True)defmain():# 生成测试数据random.seed(42)data=[random.randint(1,10000)for_inrange(1000)]k=100# 使用方法1top_k=find_top_k(data,k)print(f"前{k}个最大元素:")fori,numinenumerate(top_k,1):print(f"{num:6d}",end=" ")ifi%10==0:print()print()# 验证结果正确性sorted_data=sorted(data,reverse=True)[:k]print(f"算法结果是否正确:{top_k==sorted_data}")# 使用方法2top_k2=find_top_k_alternative(data,k)print(f"方法2结果是否正确:{sorted(top_k2)==sorted(top_k)}")if__name__=="__main__":main()

算法复杂度分析

  • 时间复杂度: O(n log k),其中n是总数据量,k=100
  • 空间复杂度: O(k),只需要维护大小为100的堆

关键点说明

  1. 使用最小堆的原因:我们想要最大的k个元素,使用最小堆可以让我们在O(1)时间内知道当前堆中最小的元素
  2. 堆顶的作用:堆顶始终是当前堆中最小的元素,也就是第k大的候选者
  3. 替换条件:只有当新元素大于堆顶时,才进行替换,确保堆中始终是见过的最大的k个元素
  4. “我就往堆里面插”:这个操作在代码中体现为
    "heapq.heapreplace()"或先pop再push的操作

两种实现方式都可以,Python版本提供了两种写法:

    “find_top_k”:使用
    “heapq.heapreplace()”,更简洁

    “find_top_k_alternative”:分步操作,更清晰地体现算法步骤

    版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
    网站建设 2026/6/13 11:45:05

    来那替尼与曲妥珠单抗联合治疗:疗效提升还是风险叠加?

    在乳腺癌的治疗领域&#xff0c;来那替尼和曲妥珠单抗都是重要的靶向治疗药物。近年来&#xff0c;将这两种药物联合使用的治疗方案逐渐受到关注&#xff0c;人们既期待这种联合治疗能够带来更好的疗效&#xff0c;也担忧是否会带来更多的风险。联合治疗的理论基础来那替尼和曲…

    作者头像 李华
    网站建设 2026/6/15 1:57:17

    NetBox拓扑视图插件零基础入门:5分钟搞定网络架构可视化

    NetBox Topology Views是一款专为NetBox设计的网络拓扑可视化插件&#xff0c;它能自动基于设备间的电缆连接生成清晰的拓扑视图&#xff0c;支持多维度过滤和个性化配置&#xff0c;让复杂的网络架构一目了然。 【免费下载链接】netbox-topology-views A netbox plugin that d…

    作者头像 李华
    网站建设 2026/6/12 22:15:52

    WhiteSur主题完整配置手册:打造macOS风格Linux桌面体验

    WhiteSur主题完整配置手册&#xff1a;打造macOS风格Linux桌面体验 【免费下载链接】WhiteSur-gtk-theme MacOS Big Sur like theme for Gnome desktops 项目地址: https://gitcode.com/GitHub_Trending/wh/WhiteSur-gtk-theme 想要为你的Linux桌面注入macOS Big Sur的现…

    作者头像 李华
    网站建设 2026/6/13 10:35:27

    驱动2026年增长:你必须关注的20个前瞻性营销指标与优化清单

    什么是市场营销中的关键绩效指标&#xff08;KPI&#xff09;&#xff1f; 营销中的关键绩效指标&#xff08;KPI&#xff09;是显示企业在特定营销目标方面表现如何的数据点。 例如&#xff0c;如果你的目标是增加线上销售额&#xff0c;那么网站流量可以作为营销的关键绩效指…

    作者头像 李华
    网站建设 2026/6/12 18:48:42

    iOS个性化定制终极指南:Cowabunga工具箱深度体验

    iOS个性化定制终极指南&#xff1a;Cowabunga工具箱深度体验 【免费下载链接】Cowabunga iOS 14.0-15.7.1 & 16.0-16.1.2 MacDirtyCow ToolBox 项目地址: https://gitcode.com/gh_mirrors/co/Cowabunga 厌倦了千篇一律的iOS界面&#xff1f;想要打造真正属于自己的手…

    作者头像 李华
    网站建设 2026/6/14 21:16:36

    ANSYS Fluent UDF 编程手册深度解析与实战应用指南

    ANSYS Fluent UDF 编程手册深度解析与实战应用指南 【免费下载链接】ANSYSFluentUDFManual2020R2官方手册资源下载 本开源项目提供了ANSYS Fluent UDF Manual (2020R2) 的官方PDF文件下载&#xff0c;专为希望在Fluent中进行自定义编程的用户设计。手册详细介绍了UDF的基础概念…

    作者头像 李华