C++海量数据查重和top k综合应用

C++海量数据查重和top k综合应用

C++海量数据查重问题

解决方案:

  1. 哈希表 。查询的时间复杂度 O ( 1 ) O(1) O(1),但内存需要更多。
  2. 分治思想
  3. Bloom Filter:布隆过滤器
  4. 字符串类型,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大的元素。
解法:

  1. 大根堆/小根堆。维护一个优先栈,栈顶存储最小的数,每次对比栈顶决定是否入栈,最终遍历一遍得出结果栈。更多大根堆、小根堆【数据结构】堆,大根堆,小根堆,优先队列 详解
  2. 快排分割函数。经过快排分割函数,能够在 O ( log ⁡ n ) O(\log n) O(logn)时间内,把小于基准数的整数调整到左边,把大于基准数的整数调整到右边,基准数(index)就可以认为时第(index+1)小的整数,[0,index]就是前index+1小的数了。

C++海量数据查重和top k应用

求解问题:数据的重复次数最大/最小的前K个/第K个。

思路:使用map映射求每个元素出现的次数,然后使用大根堆/小根堆/快排分割函数求top k问题。

猜你喜欢

转载自blog.csdn.net/qq_45041871/article/details/131997434