海量数据处理的 Top K算法(问题) 小顶堆实现

10.巩固学习PriorityQueue类------海量数据处理的 Top K算法(问题) 小顶堆实现 海量数据处理的 Top K算法(问题) 小顶堆实现 问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k)    问题分析:由于(1)输入的大量数据;(2)只要前K个。那么对整个输入数据的保存和排序是非常耗时耗内存且没必要的。 可以利用数据结构的最小堆来处理该问题。 最小堆如图所示,对于每个非叶子节点的数值,一定不大于孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然根节点是其中的最小数值)。 每次有数据输入的时候可以先与根节点比较。若不大于 阅读详情

问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k或者Top 10)

  问题分析:由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。

        可以利用数据结构的最小堆来处理该问题。

        最小堆如图所示,对于每个非叶子节点的数值,一定不大于孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然根节点是其中的最小数值)。

      每次有数据输入的时候可以先与根节点比较。若不大于根节点,则舍弃;否则用新数值替换根节点数值。并进行最小堆的调整。

  实现代码以及说明:

复制代码
#include<stdio.h>
int n;  ///数字个数,n很大(n>10000)
int dui[10];
#define K 10    ///Top K,K的取值

void create_dui();  ///建堆
void UpToDown(int);  ///从上到下调整
int main()
{
    int i;
    int tmp;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=K;i++) ///先输入K个
            scanf("%d",&dui[i]);
        create_dui();  ///建小顶堆
        for(i=K+1;i<=n;i++)
        {
            scanf("%d",&tmp);
            if(tmp>dui[1])  ///只有大于根节点才处理
            {
                dui[1]=tmp;
                UpToDown(1);    ///向下调整堆
            }
        }
    }
    return 1;
}

void create_dui()
{
    int i;
    int pos=K/2;      ///从末尾数,第一个非叶节点的位置K/2
    for(i=pos;i>=1;i--)
        UpToDown(i);
}

void UpToDown(int i)
{
    int t1,t2,tmp,pos;
    t1=2*i; ///左孩子(存在的话)
    t2=t1+1;    ///右孩子(存在的话)
    if(t1>K)    ///无孩子节点
        return;
    else
    {
        if(t2>K)  ///只有左孩子
            pos=t1;
        else
            pos=dui[t1]>dui[t2]? t2:t1;

        if(dui[i]>dui[pos]) ///pos保存在子孩子中,数值较小者的位置
        {
            tmp=dui[i];dui[i]=dui[pos];dui[pos]=tmp;
            UpToDown(pos);
        }
    }
}
复制代码

   由于仅仅保存了K个数据,有调整最小堆的时间复杂度为O(lnK),因此TOp K算法(问题)时间复杂度为O(nlnK).

[Top-K] 海量数据的Top-K问题/出现频率Top-K问题 描述 最近在面试中有被问到,Top-K的相关问题,在此做以总结,希望对后续面试的小伙伴有帮助 题目要素 1.海量数据(大数量,小内存) 2.排名前K 变体:海量数据的词频问题 例子 先举一个比较有趣的例子。 已知现在有25匹马,5条赛道,假设不考虑马的疲劳问题,不可以使用计时器记录每一匹马的时间。最少需要多少次比赛才能选出25匹马中的TOP3。 答案:7次 思路: ❗ 解决此类问题,脑海中一定要从哪些马没有资格成为TOP3的思想出发。 首先,对25匹马进行5次比赛,淘汰每一组中排名靠后的两匹马,因为这些 阅读详情

相关推荐

Oracle EBS财务模块(三)总账功能

(一)总账管理系统主要功能  总账管理系统(Oraclegeneralledger)是一个公司一切账务系统的核心,它好比是公司会计信息的中央处理器。总账管理系统提供了一个完整的财务管理核算及分析流程。它是所有子账户的信息存储器,因此反映了所有子账户的财务和现金活动。总账管理系统的主要作用是记录公司的财务活动,并生成财务报表和管理报表,以帮助公司内外人士进行决策。一个公司或组织的制造系统、项目管理系

苏南生的优快云博客 2万+

堆排序在topK场景题中的应用及原理

堆排序在topK场景题中的应用及原理

梦~' 1251

MATLAB信号处理实战:VMD分解参数调优全指南(附避坑技巧)

本文深入探讨了MATLAB中变分模态分解(VMD)的核心参数调优实战技巧。针对模态数K和惩罚系数α的选择难题,提供了从经验估计、可视化观察到量化指标辅助的渐进式调优框架,并分享了避免过分解与欠分解的实用避坑指南,旨在帮助工程师高效处理非平稳信号,提取清晰的物理特征。

weixin_29079671的博客 144

topk--堆排序--小顶堆

【问题描述】 假设需要我们在一堆海量数据中找出排名前k的数据;最好的方法是用最小堆排序,直接用前k个数据建立一个小顶堆,然后遍历剩余的数, ①如果此数 ②如果此数>堆顶的数,则将此数和堆顶的数交换,然后从堆顶向下调整堆,使其重新满足小顶堆。 【说明】堆的存储 一般用数组来表示堆,第i个节点的父节点下标为i/2-1;它的左右节点下标分别为:2*i+1和2*1+2 【代码】

suibianshen2012的专栏 5714

【WRF后处理】基于wrf-python处理wrf运行结果wrfout_d01

基于wrf-python处理wrf运行结果wrfout_d01

WW、forever的博客 5209

脉冲变压器电感选型参数,结构原理,工艺与注意问题总结

脉冲变压器电感简称脉冲变压器,是一种特殊类型的变压器,主要用于处理脉冲信号。它的主要特性是能够在短时间内承受高电压和大电流。脉冲变压器主要用于开关电源、脉冲功率放大、雷达脉冲调制等领域。本文对脉冲变压器的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1342

算法-topK算法

可以用堆排序解决。 数组中第k大的元素 数组中重复次数第k大的元素(前k大的元素) 维护一个大小为 K 的小顶堆,依次将数据放入堆中,当堆的大小满了的时候,只需要将堆顶元素与下一个数比较:如果大于堆顶元素,则将当前的堆顶元素抛弃,并将该元素插入堆中。遍历完全部数据,Top K 的元素也自然都在堆里面了。当然,如果是求前 K 个最小的数,只需要改为大顶堆即可。 例题: 给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数

Gamble6 351

【Bug已解决】claude: No such file or directory — Claude Code 命令凭空消失解决方案

方案适用场景推荐指数难度方案一:重建软链接所有平台,软链接断裂⭐⭐⭐⭐⭐低方案二:修复 shebangnvm 用户,不想重装⭐⭐⭐⭐中方案三:nvm default aliasnvm 用户,长期稳定⭐⭐⭐⭐低方案四:切换到 Volta频繁切换 Node.js 版本⭐⭐⭐中方案五:修复 PATHPATH 配置丢失⭐⭐⭐⭐低方案六:Homebrew 安装macOS 用户,npm 不稳定⭐⭐⭐⭐低根本原因与。

博客 1万+

使用小顶堆解决TOPK问题

首先我们需要构建一个小顶堆 我们可以用PriorityQueue这个优先队列,它给我们从小到大排序好了的,至于什么是小顶堆可以去看看堆和数的概念. PriorityQueue pq = new PriorityQueue<>(); 我们需要对小顶堆的堆顶与插入的数进行比较 private int k = 1000; //从文件中找到最大的一千个数 PriorityQueue<Integer> pq = new PriorityQueue<>(k);

jmzzzzz的博客 703

ccSwitch 安装使用指南,claude code的最佳搭档

ccSwitch 是一款真正为 AI 编程开发者打造的效率工具。它把原本繁琐的配置管理工作,简化成了直观的图形界面操作。无论你是需要在多个 API 提供商之间切换,还是想要统一管理多款 AI 编程工具,ccSwitch 都能帮你大幅提升效率。如果你是重度 AI 编程工具用户,强烈推荐尝试一下 ccSwitch,相信它会成为你开发工具箱中不可或缺的一员。项目地址。

篮球界最会写bug的人;程序猿中打球最菜的人。 1287

宇树G1开发实践--PPT汇报(基础版)

本文介绍了一套基于宇树G1人形机器人的PPT自动演示系统,可实现"一键启动、自动演讲"功能。系统通过多线程同步技术,将音频播放与机器人动作完美结合,支持12种预设社交互动动作。硬件依赖宇树G1机器人、外接音响和网络连接,软件采用Python SDK和ALSA音频工具。核心功能包括音频文件自动排序、外接音响播放控制、机器人动作执行及音画同步。使用时需配置网络接口和音频设备号,运行后自动按顺序播放音频并执行随机动作。系统特别强调了安全注意事项,并提供了常见问题解决方案,适用于展会、汇报等需要

m0_47999117的博客 510

topk算法

问题 对于海量数据到处理经常会涉及到 topK 问题。在设计数据结构和算法的时候,主要需要考虑的应该是当前算法(包括数据结构)跟给定情境(比如数据量级、数据类型)的适配程度,和当前问题最核心的瓶颈(如降低时间复杂度,还是降低空间复杂度)是什么。 首先,我们来举几个常见的 topK 问题的例子: 给定 100 个 int 数字,在其中找出最大的 10 个; 给定 10 亿个 int 数字,在其中找出最大的 10 个(这 10 个数字可以无序); 给定 10 亿个 int 数字,在其中找出最大的 10 个(这

qq_40813329的博客 4659

适航规章、标准,书籍资料下载汇总(更新中)

以下是一些收集到的适航相关的资料,分享给大家。(如果没有你想要的资料,请留言,等找到会及时更新!

qq_41854911的博客 2550

海量数据处理的 Top K算法(问题) 小顶堆实现

  问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k或者Top 10)   问题分析:由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。         可以利用数据结构的最小堆来处理该问题。        最小堆如图所示,对于每个非叶子节点的数值,一定不大于孩子节点的数值。这样可用含有K个节点的最小堆来...

weixin_34238642的博客 82

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Corinna AI 订阅管理:三档付费方案怎么选不踩坑 [特殊字符]

想给团队挑个套餐,却被一堆功能名词绕晕?Corinna AI 的订阅管理把这事拆得很直白:三档方案、三种额度,按你的业务量对号入座就行。 ## 三档订阅怎么选:STANDARD、PRO、ULTIMATE 对号入座 STANDARD 每月 29 美元,面向初创和小型团队。它给的是基础 AI 聊天功能,额度也是最少的。团队刚起步、对话量不大,选它就行。 PRO 每月 79 美元,目标用户是中型企

gitblog_00088的博客 1058

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

TOP-K问题深度解析:从堆与快速选择到海量数据实战

在数据处理和算法设计中,高效检索关键数据是核心需求之一,这自然引出了TOP-K问题——即从海量数据中快速找出最大或最小的K个元素。其原理在于避免全排序的冗余计算,通过维护一个动态的候选集来优化性能。这一思想的技术价值在于,它能以远低于O(N log N)的复杂度处理大规模数据,在资源受限的场景下尤其关键。常见的实现技术包括堆(Heap)和快速选择(QuickSelect)算法,它们分别以稳定的O(N log K)时间和平均O(N)时间高效解决问题。这些方法广泛应用于**实时排行榜**、**监控系统**告警、

weixin_32715349的博客 282

【数据结构】二叉树——顺序结构——堆及其实现

树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成的一个具有层次关系的集合。除根节点外,其余部分被分为M(M>0)个互不相交的集合T1、T2、.....Tm,其中的每一个集合 Ti(1 <= i <= m)又是一颗结构与数类似的子树。每一颗子树的根节点都有且只有一个前驱节点,而可以有0个或者多个后继节点。树是递归定义的。在树形结构中,子树之间不能存在交集子树中存在交集,就不是树形结构了除了根节点以外,每一个节点有且只有一个父节点如图,E节点存在两个父节点,该图不是树形结构。

LH__1314的博客 3981

海量数据处理算法(top K问题)

举例 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。 思路 首先把文件分开 针对每个文件hash遍历,统计每个词语的频率 使用堆进行遍历 把堆归并起来 具体的方案 1.分治: 顺序读文件中,对于每个词c,取hash(c)%2000,然后按照该值存到2000个小文件中。这样每个文件大概是500k左右。 注意...

222

海量数据处理的 Top K相关问题

Top-k的最小堆解决方法问题描述:有N(N&gt;&gt;10000)个整数,求出其中的前K个最大的数。(称作Top k或者Top 10)问题分析:由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。可以利用数据结构的最小堆来处理该问题。最小堆如图所示,对于每个非叶子节点的数值,一定不大于孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然根节点是其中的

8610

击破海量数据与面试瓶颈:Top K 问题的四大通关指南

本文探讨了Top K问题的多种解决方案及其适用场景。通过分析堆排序法、快速排序、位图和哈希分治等不同方法,比较了它们的时间复杂度、空间复杂度及优缺点。重点介绍了小顶堆法的实现原理,通过维护一个大小为K的堆结构高效筛选出最大或最小的K个元素。文章还提供了Java代码示例,并详细解释了小顶堆"筛选"机制的工作原理,帮助读者理解如何在不同数据规模下选择合适的算法解决Top K问题。

先做到 再看见 699
上一篇: 十道海量数据处理面试题与十个方法大总结
下一篇: Spring-data-redis: 分布式队列
aoxida
博客等级 码龄16年 157粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值