多机求海量数据的中位数和topK的问题

在大数据场景下,解决TopK问题是一个常见挑战。本文介绍了三种方法:1) 利用堆数据结构,通过构建最小堆寻找最大元素;2) 应用分治策略,结合MapReduce进行分区计算与合并;3) 结合Hash去重,降低数据量后再进行处理。这些方法旨在提高效率并降低空间复杂度。

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

Top K 问题

在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题


如何在100亿数据中找到最大的1000个数

最容易想到的就是将数据全排序,但是效率太低了,对于海量数据处理并不合适。

一、构建堆

用构建堆。(找1000个最大的数,构建最小堆)找1000个最小的数构建最大堆

我们知道完全二叉树有几个非常重要的特性,就是假如该二叉树中总共有N个节点,那么该二叉树的深度就是log2N,

对于小顶堆来说移动根元素到 底部或者移动底部元素到根部只需要log2N,相比N来说时间复杂度优化太多了(1亿的logN值是26-27的一个浮点数)

具体思路:先从文件中取出1000个元素构建一个最小堆数组(O(log 1000)),然后对剩下的100亿-1000个数字m进行遍历,如果当前元素大于 最小堆的堆顶,

就是K【0】元素,就用m取代k【0】,对新的数组从新构建小根堆。遍历结束,这个最小堆就是要找的数。

时间复杂度:O((100亿 - 1000)log 1000) 就是O((N-M)logM), 空间复杂度M

这个算法优点是性能尚可,空间复杂度低,IO读取比较频繁&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值