海量数据处理的一些思路

处理思路

  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 树通常不高,需要的空间不会很大。

原文地址:https://www.cnblogs.com/handso/p/14074034.html