海量数据处理的 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次比赛,淘汰每一组中排名靠后的两匹马,因为这些 阅读详情

相关推荐

从Mule ESB到Apache Camel:手把手教你设计一个轻量级企业集成框架的‘心脏’

本文深入探讨了从Mule ESB到Apache Camel的轻量级企业集成框架设计实践,对比了两者在协议支持、消息处理能力和部署灵活性等方面的差异。通过实际代码示例和性能优化技巧,帮助开发者构建高效的核心模块,适用于现代微服务架构下的系统集成需求。

weixin_28738165的博客 375

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

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

梦~' 1251

避坑指南:Xilinx SelectIO IP核官方例程里那些容易忽略的细节(复位、时钟与数据回环)

本文深入解析Xilinx SelectIO IP核设计中复位策略、时钟域交互和数据回环验证三大关键领域的实战避坑技巧。针对官方例程中易被忽视的细节,如复位同步链深度、时钟相位约束和数据对齐机制,提供经过项目验证的优化方案,帮助工程师节省80%以上的调试时间。特别适用于FPGA开发中高速接口设计场景。

weixin_42561476的博客 447

topk--堆排序--小顶堆

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

suibianshen2012的专栏 5714

WRF-Chem新手避坑指南:从chem_opt到emiss_opt,那些手册里没明说的参数配置实战

本文为WRF-Chem新手提供从chem_opt到emiss_opt的参数配置实战指南,解析官方文档中未明确的常见陷阱与解决方案。通过华北重霾案例,详细讲解化学机制选择、排放源配置及特殊参数组合的注意事项,帮助用户避开常见错误,提升模拟效率。

weixin_30897079的博客 279

手把手讲解RTX5操作系统在GD32F407上的移植

然后将GD32F4xx_Demo_Suites_V2.6.4\GD32407V_START_Demo_Suites\Projects\01_GPIO_Running_LED下面的main函数复制到我们的项目文件夹中;打开对应GD32407V_START_Demo_Suites的文件夹下面的Utilities,复制gd32f407v_start.c和gd32f407v_start.h文件到一开始项目保存的文件夹下面;为了验证我们的操作系统是否被正确添加,是否能够正确运行,我们需要添加示例文件;

Praguejing的博客 1860

算法-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

ComfyUI安装包运行前准备:安装Git

Git 是一个分布式版本控制系统(Version Control System, VCS),用于跟踪和管理文件(尤其是代码)的变更历史。 简单理解就是,git是用来管理文件的版本的,如果有新的版本,就可以使用git来更新。

聚梦小课堂 2万+

使用小顶堆解决TOPK问题

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

jmzzzzz的博客 703

【鸿蒙南向开发】OpenHarmony——分布式数据对象之功能实践

通过本文的学习可了解到分布式数据对象的主要接口、大致调用方法和功能实现等。结合对应内容,可以进一步对分布式数据对象同步机制做深度学习。下一步,(1) 着重理解同步组网的构建原理。(2) 着重理解同步组网内,监听change和status变化的实现。●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:●关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。

HarmonyOS_666的博客 1090

【MicroPython编程-ESP32篇:设备驱动】-SHT31温度湿度传感器驱动

SHT31 是 Sensirion 的下一代温湿度传感器。 它建立在一个新的 CMOSens® 传感器芯片之上,该芯片是 Sensirion 新湿度和温度平台的核心。

视觉与物联智能 229

topk算法

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

qq_40813329的博客 4659

MATLAB库函数unwrap(相位解卷绕)的C语言实现

什么是相位解卷绕 Q = unwrap(P) Q = unwrap(P) corrects the radian phase angles in a vector P by adding multiples of ±2π when absolute jumps between consecutive elements of P are greater than or equal to the default jump tolerance of π radians. If P is a matrix, unw

业精于勤,荒于嬉 4247

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

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

weixin_34238642的博客 82

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

gitblog_00088的博客 1058

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

weixin_32715349的博客 282

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

树是一种非线性的数据结构,它是由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、付费专栏及课程。

余额充值