1单节点上的topK

(1)批量数据

  数据结构:HashMap, PriorityQueue

  步骤:(1)数据预处理:遍历整个数据集,hash表记录词频

     (2)构建最小堆:最小堆只存k个数据.

  时间复杂度:O(n +n*lgk) = O(nlgk)

  空间复杂度:O(|n|+k) (|n| = number of unique words)

  lintcode原题:Top K Frequent Words

(2)流式数据

  数据结构:TreeMap, HashMap

  步骤:有新数据到来时,HashMap进行更新,在TreeMap中查找所更新的条目,如果存在,把旧的条目删除,加入更新后的条目;如果不存在,将该条目与TreeMap中最小的比较,小于该最小值就pass,大于该值则TreeMap删除最小值,插入新的条目。

  lintcode原题:Top K Frequent Words II

2 多节点上的topK

 场景一: 假设给一组10T文件,文件内容是10million用户,当天的微博搜索记录,求微博今日热搜?

思路:先分再合。

     a.切分成小文件

     b.小文件分发到不同的节点

   c. 每个节点计算自己的topK

     d.合并每个topK,计算总的TopK

   

    切分方式:如果按照文件顺序切分,可能会导致一个词频很高的词被均匀分配到各个节点,导致它在各个节点的topK中无法胜出。正确的切分方式是用hash,相同的单词                           hash值相同,同一个的hash值只由一个节点处理。这样就保证了相同的单词一定会发送到同一个节点,不会出现上面的问题。

    可能出现的问题:一个词的词频过大,都发往一个节点导致该节点负荷过重。解决思路是:建立监测机制,当发现一个节点负荷很重,其他节点负荷很轻时,对该节点上的词                   加一个后缀,然后进行二次hash,发往其他节点进行topK,完成后再把TopK的结果返回到当前的slave。

场景二: 有N台机器, 每台机器各自存储单词文件,求所有单词出现频率的topK。

思路:使用rehash,将相同的单词发送到同一个节点,再来计算每个节点的topK,最后再合。有点跟shuffle类似。

3 Realtime TopK with Low QPS

当新数据进来时,写入到disk还是hashMap?

(答:都不是。写入disk速度太慢,写入hashMap会导致内存不够,以及宕机时会导致数据丢失。应该写入database。)

之后每次database更新就触发treeMap进行更新。

4 Realtime TopK with High QPS

QPS高的时候,database的效率很低,会带来高延时。解决方案是将请求分散到各个节点,这样每个节点的QPS就会降低。如下图:

问题是,当一个词很热门时,仍然会出现一个节点上的QPS很高,带来高时延,如下图:

用户向master请求topK,master向slave1请求topK1,但是此时有新数据到达slave1,使得dataBase更新,进而会更新TreeMap,更新TreeMap时会锁住TreeMap,使得获取topK1的请求一直要waiting。

解决方案:(牺牲一定的精确性得到低延时)使用缓存。新数据每次存到缓存中,缓存隔一段时间会往database里面写,database更新的时候再来锁treeMap。这样treeMap被锁的频率就大大降低了。

5 Approx TopK Algorithm(近似TopK算法)

  由于实际情况中可能总共有一百万个单词,其中只有一百个词是高频词,剩下的都是低频词。把这些低频词存储在hash表中很浪费空间,因此有一种近似topK方法来解决这个问题。

  该算法中,我们可以手动指定hash表的大小,且hash表中的key是不再是单词,而是单词的hash值,value仍然是词频(只不过表示所有hash值为key的词的词频)。当新词到来时,更新hash表,并且认为这个词的词频就是hash表中对应的词频,基于此来更新treeMap。

  可以看出,上面的过程中存在两种情况会导致错误:

  (1)多个低频词映射到同一个hash值,导致这个hash值的value很大,进而错误的选择低频词作为topK。

  分析:这种情况其实出现的概率比较低。通常是多个低频词的词频加起来还没有一个高频词的词频大,还要要求这些低频词hash值相同。因此这种情况可以不考虑。

  (2)一个高频词映射到一个hash值,使得它的value很大,这时候又来一个低频词也映射到这个hash值。这种情况下会误认为这个低频词的词频也是那么大,进而会错误地把它选到topK里面。

  分析:这种情况实际中很有可能发生。解决办法是使用Bloom Filter,即选用多个hash函数,然后选取这些hash函数中映射的最小词频作为这个新词的词频。如果这个新词真的是高频词,那么这个词频就接近真实值;如果是低频词,则这个最小值很有可能就很小。

大数据热点问题TOP K的更多相关文章

  1. CSS实现大数据热点波纹图

    CSS实现大数据热点波纹图 实现效果: 涉及知识点: 定位 盒子阴影 动画 思想:以3道波纹为例.首先使用一个div盒子作为圆心,然后每道波纹作为一个div.4个盒子均使用定位属性定位到圆心.然后设置 ...

  2. 优先队列PriorityQueue实现 大小根堆 解决top k 问题

    转载:https://www.cnblogs.com/lifegoesonitself/p/3391741.html PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于 ...

  3. 优先队列实现 大小根堆 解决top k 问题

      摘于:http://my.oschina.net/leejun2005/blog/135085 目录:[ - ] 1.认识 PriorityQueue 2.应用:求 Top K 大/小 的元素 3 ...

  4. 海量数据处理之top K问题

    题目: CVTE笔试题https://www.1024do.com/?p=3949 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万 ...

  5. Top k问题的讨论(三种方法的java实现及适用范围)

    在很多的笔试和面试中,喜欢考察Top K.下面从自身的经验给出三种实现方式及实用范围. 合并法 这种方法适用于几个数组有序的情况,来求Top k.时间复杂度为O(k*m).(m:为数组的个数).具体实 ...

  6. 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)

    前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...

  7. 如何解决海量数据的Top K问题

    1. 问题描述 在大规模数据处理中,常遇到的一类问题是,在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门 ...

  8. 大数据,why python

    大数据,why python ps, 2015-12-4 20:47:46 python" title="大数据,why python">http://www.op ...

  9. top(k,n)—db kernel队解题思路

    0. 比赛 公司里的第三届XX中间件性能挑战赛 我和另外两个P5组队参加,队名为"db kernel".最后获得了第八,应该是P5里的最高排名. 以下简单扼要地介绍一下题目,以及我 ...

随机推荐

  1. Jetty 简单使用

    Jetty与Tomcat类似,也是一种Servlet引擎,可以用来运行Java Web项目. 其常被嵌入到项目中,以便于开发.测试,以及Demo等项目的运行. 1.作为插件——作为开发.测试时项目运行 ...

  2. JSP 入门 HTML嵌套Java脚步 显示时间

    <%@ page import="java.util.Date"%> <%@ page language="java" contentType ...

  3. VC----SDK下对窗口非客户区的操作

    窗口分成两大部分:客户区和非客户区.非客户区再次细分:标题栏,如图片中顶部深蓝色:左边框,如图片中红色部分:上边框,如图片中绿色部分:右边框,如图片中右侧天蓝色部分:底边框,如图片中下面棕色部分. 之 ...

  4. 知乎布局||offsetTop||侧边栏自动等高

    1.对a标签的详细介绍 直接在a标签使用onclick,怎么去除a的默认链接,onclick="return test()" 注意这里的return 不可舍去,test函数可以直接 ...

  5. Flash Builder 4.7 破解

    http://litech.diandian.com/post/2013-03-22/40049178994 Adobe Flash Builder 4.7 For Mac 破解 和Photoshop ...

  6. PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)

    1.和mysql扩展库的区别: (1   安全性.稳定性更高 (2  提供了面向对象和面向过程两种风格 2.php.ini  中的  extension=php_mysqli.dll 解除封印 3.面 ...

  7. Redis学习——SDS字符串源码分析

    0. 前言 这里对Redis底层字符串的实现分析,但是看完其实现还没有完整的一个概念,即不太清楚作者为什么要这样子设计,只能窥知一点,需要看完redis如何使用再回头来体会,有不足之处还望告知. 涉及 ...

  8. 让FineUI数据绑定支持dynamic对象

    FineUI非常好用,但是有一个缺点,就是不支持dynamic对象的数据绑定.查了一下源代码,找了解决方案,其实只需要几行代码就可以搞定,这就是开源的好处. 本想直接在CodePlex上贡献代码,但不 ...

  9. java enum类

    1.可以在enum中添加变量和方法 先来看一段代码示例: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...

  10. spring mvc3的注解@ResponseBody 自动返回jason

    第三种利用spring mvc3的注解@ResponseBody 例如: @ResponseBody @RequestMapping("/list") public List< ...