海量数据处理

1 数值topK问题:给出n个数中最大的k个数

1.1 若能全部读入内存

1,快速排序+二分。O(n)
2,冒泡排序k次。O(kn)

1.2 不能全部读入内存,数据流

维护大小为k的小根堆。O(nlogk)

2 频率topK问题:给一个文件,求文件中出现次数最多的k个单词。

2.1 不分块

建立一个哈希表或者前缀树,遍历一遍文件,统计每个词出现的次数,转化为数值topk问题。

2.2 分块

I 将文件hash%m映射为m个小文件
II 对每个小文件,建立哈希表,统计次数,得到topk
III 对m个topk归并,得到最终topk

3 中位数

3.1 全部读入内存

1,分桶(分为若干区间),读取一遍数据,得到每个桶的元素个数,就知道中位数在哪个桶,再对该桶排序即可。O(n+mlogm)
2,快速排序+二分。O(n)

3.2 数据流

双堆:大根堆<=大根堆堆顶<=中位数<=小根堆堆顶<=小根堆
I 第奇数个数时,往小根堆加入元素
1)先让该数插入大根堆,调整大根堆
2)把大根堆堆顶删去,插入小根堆,调整大根堆,小根堆
II 第偶数个数时,类似的往大根堆加入元素
III 最终中位数为两个堆顶其中之一

你可能感兴趣的:(海量数据处理)