C++海量数据查重和top k综合应用
C++海量数据查重问题
解决方案:
- 哈希表 。查询的时间复杂度 O ( 1 ) O(1) O(1),但内存需要更多。
- 分治思想。
- Bloom Filter:布隆过滤器。
- 字符串类型,TrieTree字符树。
哈希表:使用unordered_map
用于存储重复的次数,遍历一遍所有的数据并存储起来。
const int SIZE = 10000;
int ar[SIZE] = {0};
for (int i = 0; i < SIZE;i++)
{
ar[i] = rand();
}
unordered_map<int, int> map;
for(int val:ar)
{
map[val]++;
}
for(auto pair:map)
{
if(pair.second>1) cout << "数字:" << pair.first << " 出现的次数:" << pair.second << endl;
}
分治思想:如果一个文件中有大量的整数,约50亿个整数,内存限制400M,需要找出文件中重复元素的重复次数。哈希表需要占用的空间5G * 4 byte * 2 = 40 G
。分治的思想:大文件划分成小文件,是每一个小文件都能加载到内存当中,并求出对应的重复的元素,把结果写入到一个存储重复元素的文件中。
Bloom Filter:a、b两个文件,里面都有10亿个整数,内存限制在400M,请出a、b两个文件中的重复的元素有哪些?把a、b两个大文件划分成个数相等的一系列小文件(分治的思想)。
C++海量数据求top k问题
一般存在的情况:求最大的/最小的前K个元素。
10000个整数,找到值前10大的元素。
解法:
- 大根堆/小根堆。维护一个优先栈,栈顶存储最小的数,每次对比栈顶决定是否入栈,最终遍历一遍得出结果栈。更多大根堆、小根堆【数据结构】堆,大根堆,小根堆,优先队列 详解。
- 快排分割函数。经过快排分割函数,能够在 O ( log n ) O(\log n) O(logn)时间内,把小于基准数的整数调整到左边,把大于基准数的整数调整到右边,基准数(index)就可以认为时第(index+1)小的整数,[0,index]就是前index+1小的数了。
C++海量数据查重和top k应用
求解问题:数据的重复次数最大/最小的前K个/第K个。
思路:使用map映射求每个元素出现的次数,然后使用大根堆/小根堆/快排分割函数求top k问题。