最小堆

海量数据的topK问题

折月煮酒 提交于 2019-12-08 18:33:59
问题描述: 有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k或者Top 10) 问题分析: 由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。   可以利用数据结构的 最小堆 来处理该问题。   最小堆如图所示,对于每个非叶子节点的数值,一定 不大于 孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然 根节点 是其中的最小数值)。  每次有数据输入的时候可以先与根节点比较。若不大于根节点,则舍弃;否则用新数值替换根节点数值。并进行最小堆的调整。如下图: import java.util.Scanner; /** * @author 浩 * @version 创建时间:2016年5月17日 上午8:46:03 */ public class TopK { public static final int K =10; public static void main(String[] args) { Scanner in = new Scanner(System.in); int []max = new int[10]; for(int i=0;i<10;i++){ max[i] = in.nextInt(); } buildHeap(max); while(in.hasNextInt()){

海量数据——TopK问题

为君一笑 提交于 2019-12-08 18:33:45
TopK 问题是一个经典的海量数据处理问题,比如微博热搜每隔10分钟都会更新出排行前10的热门搜索信息,再或者通过大数据找出一个地区最爱吃的水果等,都可以使用TopK问题来解决,其核心思想就是最小堆的引入。 TopK问题分析 在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常被称为TopK问题。 下面我们通过一个简单的例子来说明:假如面试官给你100W个数据,请找出其最大的前K个数,而且现在只有1M的空间? 在32位操作系统中,默认一个字节为4个字节,则有下列运算: NeedSize = 100W * 4 / 1024 /1024 = 4M 计算结果大约等于4M,很显然1M的空间根本不够。也就是说,即使用最复杂的方法你也无法找到一个合适的空间来存储,因此引入了最小堆数据结构。 下面我只说实现的核心思路,对此有不理解的请查看最大堆和最小堆的相关性质。思路如下: (1)定义两个数组,arr用于存储海量数据,top用于存储最小堆(底层可以借助vector) (2)将海量数据的前K个元素先填满top堆 (3)调整top堆为最小堆结构 (4)通过遍历将新数据与堆顶元素(此时堆顶元素是堆里最小的数据)进行比较,大于堆顶就入堆,并向下调整堆结构 (5)遍历结束,则堆中的元素即n个数中最大的前K个 //TopK.h #pragma once #include

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

折月煮酒 提交于 2019-12-08 18:30:05
Top-k的最小堆解决方法 问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k或者Top 10) 问题分析:由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。 可以利用数据结构的最小堆来处理该问题。 最小堆如图所示,对于每个非叶子节点的数值,一定不大于孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然根节点是其中的最小数值)。 每次有数据输入的时候可以先与根节点比较。若不大于根节点,则舍弃;否则用新数值替换根节点数值。并进行最小堆的调整。 TOP K的python代码实现 def heap_sort (ary, k) : # 构建小顶堆 def siftdown (ary, begin, end) : i,j = begin, begin* 2 + 1 while j < end: if j+ 1 < end and ary[j+ 1 ] < ary[j]: # 查看左右子树的最小节点 j += 1 if ary[i] < ary[j]: # 如果不需要交换了,则停止 break ary[i],ary[j] = ary[j],ary[i] # 交换父和子 i,j = j,j* 2 + 1 # 构建最小堆 end = len(ary) for i in range(end// 2 - 1 ,

大数据——海量数据处理的基本方法总结

可紊 提交于 2019-12-08 18:17:34
声明: 原文引用参考July大神的csdn博客文章 => 海量处理面试题 海量数据处理概述 所谓海量数据处理,就是数据量太大,无法在较短时间内迅速解决,无法一次性装入内存。本文在前人的基础上总结一下解决此类问题的办法。那么有什么解决办法呢? 时间复杂度方面,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie树。空间复杂度方面,分而治之/hash映射。 海量数据处理的基本方法总结起来分为以下几种: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序; 双层桶划分; Bloom filter/Bitmap; Trie树/数据库/倒排索引; 外排序; 分布式处理之Hadoop/Mapreduce。 前提基础知识: 1 byte= 8 bit。 int整形一般为4 bytes 共32位bit。 2^32=4G。 1G=2^30=10.7亿。 1 分而治之+hash映射+快速/归并/堆排序 问题1 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 分析 :50亿*64=320G大小空间。 算法思想1 :hash 分解+ 分而治之 + 归并 遍历文件a,对每个url根据某种hash规则求取hash(url)/1024

数据挖掘、数据分析、海量数据处理的面试题(总结july的博客)

家住魔仙堡 提交于 2019-12-08 18:04:35
缘由 由于有面试通知,现在复习一下十道和海量数据处理相关的题。两篇博客已经讲的非常完备了,但是我怕读懂了并非真的懂,所以必须自己复述一遍。 教你如何迅速秒杀掉:99%的海量数据处理面试题 海量数据处理:十道面试题与十个海量数据处理方法总结 MapReduce技术的初步了解与学习 面试归类 下面6个方面覆盖了大多数关于海量数据处理的面试题: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序; 双层桶划分 Bloom filter/Bitmap; Trie树/数据库/倒排索引; 外排序; 分布式处理之Hadoop/Mapreduce。 下面我讲针对上两篇博客里的海量数据处理的题的解法再复述一遍。 第一类:分治后hash统计再排序 第一题:海量日志数据,提取出某日访问百度次数最多的那个IP 解答: 该题解题思路总共分为三步 分而治之/hash映射:如果该文件过大,不能全部读入内存。我们就必须先利用hash函数将其分割成若干小文件。再分别对各个小文件进行处理。注意这一步我们肯定会将相同的ip放在同一个文件。由于这个题干给的比较少。我只有自己脑补一下,大概给我们的日志中就是百度web服务器自己记录的来自不同的ip的访问。这个日志是按天生成的,所以现在我们要统计一天内,哪一个ip访问本网站百度的次数最多。那么日志中肯定就是记录是访问ip和时间,但是相同的ip肯定是单独的一条

大数据——海量数据处理的基本方法总结

时间秒杀一切 提交于 2019-12-08 17:50:28
原文地址为: 大数据——海量数据处理的基本方法总结 声明: 原文引用参考July大神的csdn博客文章 => 海量处理面试题 海量数据处理概述 所谓海量数据处理,就是数据量太大,无法在较短时间内迅速解决,无法一次性装入内存。本文在前人的基础上总结一下解决此类问题的办法。那么有什么解决办法呢? 时间复杂度方面,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie树。空间复杂度方面,分而治之/hash映射。 海量数据处理的基本方法总结起来分为以下几种: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序; 双层桶划分; Bloom filter/Bitmap; Trie树/数据库/倒排索引; 外排序; 分布式处理之Hadoop/Mapreduce。 前提基础知识: 1 byte= 8 bit。 int整形一般为4 bytes 共32位bit。 2^32=4G。 1G=2^30=10.7亿。 1 分而治之+hash映射+快速/归并/堆排序 问题1 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 分析 :50亿*64=320G大小空间。 算法思想1 :hash 分解+ 分而治之 + 归并 遍历文件a

海量数据处理面试题集锦

安稳与你 提交于 2019-12-08 17:44:28
十七道海量数据处理面试题与Bit-map详解 作者:小桥流水,redfox66,July。 前言 本博客内曾经整理过有关海量数据处理的10道面试题( 十道海量数据处理面试题与十个方法大总结 ),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。 同时, 程序员编程艺术系列 将重新开始创作,第十一章以后的部分题目来源将取自下文中的17道海量数据处理的面试题。因为,我们觉得,下文的每一道面试题都值得重新思考,重新深究与学习。再者,编程艺术系列的前十章也是这么来的。若您有任何问题或建议,欢迎不吝指正。谢谢。 第一部分、十五道海量数据处理面试题 1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。 遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。

面试题-海量数据处理问题

ⅰ亾dé卋堺 提交于 2019-12-08 17:43:15
参考链接: 教你如何迅速秒杀99%的海量数据处理面试题 类型一 海量数据,出现次数最多or前K 分而治之/Hash映射 + Hash统计 + 堆/快速/归并排序 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 IP有32位,共有 2 32 //--> 个IP。 1)采用hash的方式,ip%m,将大文件分成m个小文件。 2)对每个小文件,用hash表统计ip出现的次数。找出这个小文件出现次数最多的ip 3)在这m个ip中,比较得到出现次数最多的ip。 如果是top k的话,就维护一个长度为k的最小堆。 2、统计最热门的10个查询串,要求使用的内存不能超过1G。 假设目前有一千万个记录,这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。每个查询串的长度为1-255字节。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。 300万*255=7.65x10^8<1GB 1)用hash表统计查询串出现的频率 2)维护长度为k的最小堆 3、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。 10文件顺序读取,然后hash,分散到10个文件里面去。再hash表统计词频,排序。最后归并。 4、给定a、b两个文件,各存放50亿个url,每个url各占64字节

海量数据面试题

青春壹個敷衍的年華 提交于 2019-12-08 17:42:26
from: http://kenby.iteye.com/blog/1031124 一 给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url? 两个50亿个url的文件,大概有50 0000 0000 * 64 B = 640G的大小,肯定不能全部读入内存,可以分组解决.准备1030个桶,读取两个文件的url,对每个url,通过hash(url)%1031, 把url映射到其中一个桶,然后把每个桶的url都写入一个文件,得到1030个文件,每个文件大约640M大,可以断定,相同的url只可能出现在一个文件中。所以接下来只需依次把1030个文件读入内存,再次通过hash表找出相同的url,当然这次的hash函数不要跟上次用一样的,不然每个url都会出现冲突。最后汇总到一个文件,即得到了结果。算法中之所以取1031的模,是因为1031是素数,且接近1024。 二 有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。如何按照query的频度排序? 总共要处理10G的数据,想办法分割成512份,每份大小为20M.准备520个桶,读取10个文件的query,对每一个query,通过hash(query)%521,把query映射到其中一个桶,然后把每个桶的query写入一个文件

【PTA】【数据结构与算法】堆

做~自己de王妃 提交于 2019-12-07 16:15:18
判断题 1.任何最小堆的前序遍历结果是有序的(从小到大)。 (2分) T F 2.任何最小堆中从根结点到任一叶结点路径上的所有结点是有序的(从小到大)。 (2分) T F 3.在有N个元素的最大堆中,随机访问任意键值的操作可以在O(logN)时间完成。 (2分) T F 4.一棵有124个结点的完全二叉树,其叶结点个数是确定的。 (2分) T F 5.完全二叉树中,若一个结点没有左孩子,则它必是树叶。 (1分) T F 6.完全二叉树的存储结构通常采用顺序存储结构。 (1分) T F 选择题 1.堆的形状是一棵: (2分) 选项 A 二叉搜索树 B 满二叉树 C 非二叉树 D 完全二叉树 2.创建一个初始堆,含有N个记录,其时间复杂度是: (2分) 选项 A O(logN) B O(N) C O(NlogN) D O(N 2 ) 3.哪种树,树中任何结点到根结点路径上的各结点值是有序的? (2分) 选项 A 二叉搜索树 B 完全二叉树 C 堆 D 以上都不是 4.将6、4、3、5、8、9顺序插入初始为空的最大堆(大根堆)中,那么插入完成后堆顶的元素为: (2分) 选项 A 3 B 5 C 6 D 9 5.下列的序列中,哪一组是堆? (2分) 选项 A 37,99,45,33,66,10,22,13 B 99,45,66,13,37,10,22,33 C 99,66,45,33,37