海量数据处理的一些思路
-
计算容量
-
拆分
-
整合
海量数据判重
-
hashset
-
Bitset
-
布隆过滤器
-
Trie
海量数据排序
-
外部排序+小根堆大根堆合并
-
Trie
-
Bitmap
TopK
-
快速选择
-
堆
维护一个大小为 K 的最小堆,堆顶元素就是 Kth Element。
使用大顶堆来维护最小堆,而不能直接创建一个小顶堆并设置一个大小,企图让小顶堆中的元素都是最小元素。
维护一个大小为 K 的最小堆过程如下:在添加一个元素之后,如果大顶堆的大小大于 K,那么需要将大顶堆的堆顶元素去除。
-
时间复杂度 O(NlogK) 、空间复杂度 O(K)
-
特别适合处理海量数据
在下面的实现中,令
k = nums.length - k + 1;
,这是因为此时 k 不是从零开始,和上面的快速选择解法有所不同。 -
-
海量数据
在这种场景下,单机通常不能存放下所有数据。
-
拆分,可以按照哈希取模方式拆分到多台机器上,并在每个机器上维护最大堆;
-
整合,将每台机器得到的最大堆合并成最终的最大堆。
-
频率统计
HashMap
使用 HashMap 进行频率统计,然后使用快速选择或者堆的方式找出频率 TopK。在海量数据场景下,也是使用先拆分再整合的方式来解决空间问题。
Count-Min Sketch
维护 d*w 大小的二维统计数组,其中 d 是哈希函数的个数,w 根据情况而定。
-
在一个数到来时,计算 d 个哈希值,然后分别将哈希值对 w 取模,把对应统计数组上的值加 1;
-
要得到一个数的频率,也是要计算 d 个哈希值并取模,得到 d 个频率,取其中最小值。
该算法的思想和布隆过滤器类似,具有一定的误差,特别是当 w 很小时。但是它能够在单机环境下解决海量数据的频率统计问题。
Trie