zoukankan      html  css  js  c++  java
  • 海量数据处理的一些思路

    处理思路

    1. 计算容量

    2. 拆分

    3. 整合

    海量数据判重

    1. hashset

    2. Bitset

    3. 布隆过滤器

    4. Trie

    海量数据排序

    1. 外部排序+小根堆大根堆合并

    2. Trie

    3. Bitmap

    TopK

    1. 快速选择

    2. 维护一个大小为 K 的最小堆,堆顶元素就是 Kth Element。

      使用大顶堆来维护最小堆,而不能直接创建一个小顶堆并设置一个大小,企图让小顶堆中的元素都是最小元素。

      维护一个大小为 K 的最小堆过程如下:在添加一个元素之后,如果大顶堆的大小大于 K,那么需要将大顶堆的堆顶元素去除。

      • 时间复杂度 O(NlogK) 、空间复杂度 O(K)

      • 特别适合处理海量数据

      在下面的实现中,令 k = nums.length - k + 1;,这是因为此时 k 不是从零开始,和上面的快速选择解法有所不同。

    3. 海量数据

      在这种场景下,单机通常不能存放下所有数据。

      • 拆分,可以按照哈希取模方式拆分到多台机器上,并在每个机器上维护最大堆;

      • 整合,将每台机器得到的最大堆合并成最终的最大堆。

    频率统计

    HashMap

    使用 HashMap 进行频率统计,然后使用快速选择或者堆的方式找出频率 TopK。在海量数据场景下,也是使用先拆分再整合的方式来解决空间问题。

    Count-Min Sketch

    维护 d*w 大小的二维统计数组,其中 d 是哈希函数的个数,w 根据情况而定。

    • 在一个数到来时,计算 d 个哈希值,然后分别将哈希值对 w 取模,把对应统计数组上的值加 1;

    • 要得到一个数的频率,也是要计算 d 个哈希值并取模,得到 d 个频率,取其中最小值。

    该算法的思想和布隆过滤器类似,具有一定的误差,特别是当 w 很小时。但是它能够在单机环境下解决海量数据的频率统计问题。

    Trie

    Trie 树可以用于解决词频统计问题,只要在词汇对应节点保存出现的频率。它很好地适应海量数据场景,因为 Trie 树通常不高,需要的空间不会很大。

  • 相关阅读:
    http工作流程
    HTTP的响应码?
    原型链
    ubuntu查看IO
    ubuntu14.04 64位 安装H3C iNode客户端
    关于ubuntu14.04LTS 64位 播放优酷视频
    python 的字符串驻留机制
    【转】使用virtualenv在ubuntu上搭建python 3开发环境
    ubuntu14.04 python2.7 安装配置OpenCV3.0
    记录两个折磨了我三天的低级错误
  • 原文地址:https://www.cnblogs.com/handso/p/14074034.html
Copyright © 2011-2022 走看看