海量数据处理(数据无法一次读入内存处理)

海量数据处理
    所谓海量数据处理,就是基于海量数据的查找、统计、运算等操作。所谓海量数据,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。从而导致传统的操作无法实现。
1、分治法——Hash映射
    所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性使得散列函数具有确定性的结果。
    在对大文件进行处理时,若文件过大,无法一次性读入内存,可以考虑采取Hash映射的方法将文件中的元素映射到不同大小文件中,然后再依次处理各个小文件,最后合并结果,这样就降低了问题规模。

2、top K问题
    在大规模数据处理中,经常会遇到的一类问题:如何寻找出最大的前K个数、或最小的K个数。堆也是海量数据处理经常采用的工具

Trie树、Suffix树、败者树、多路归并、堆排序、hash_map都可以用到海量数据处理里面。

3、Bit-map
    Bit-map的原理就是使用位数组来表示某些元素是否存在,由于采用了bit为单位来存储数据,因此在存储空间方面,可以大大节省,故适用于海量数据的快速查找、判重、删除等。
eg:如何利用位逻辑运算实现Bit-map,要求能够表示的最大值为10,000,000
//思路,一个整形能表示32位,10000000/32得到要多少个整形
//由于不可能刚好能被32整除,所以要多加一个整形来表示10000000
#include<iostream>
using namespace std;
#define BITWORD 32
#define SHIFT 5  //一个数左移5位就相当于除以32
#define MASK 0x1F  //掩码,确定一个数要表示在一个32位的哪一位上,左移0~31
#define N 10000000
int a[1+N/BITWORD];   //申请一个最小的能表示10000000的数组
void set(int count)  //设置表示数count的对应位为1,count>=0
{
        a[count>>SHIFT] |= ( 1<<( count & MASK ) ); 
        //count>>SHIFT得到count要存放在数组中哪一个int中,count&MASK
        //得到在该int中,哪一位要置1。MASK = 0x1F。
        //最后|=加上要置为1的位
}
void clr(int count)  //将表示count的位置0
{
        a[count>>SHIFT] &= ~( 1<<( count & MASK ) );
}
bool test(int count)  //返回表示count的对应位的状态
{
        return !!(a[count>>SHIFT] & ( 1<<( count & MASK ) ));
}
int main()
{
        set(10);
        set(20);
        cout<<test(10)<<" "<<test(20)<<" "<<test(30)<<endl;
        clr(10);
        clr(11);
        cout<<test(10)<<" "<<test(20)<<" "<<test(30)<<endl;
        cout<<test(11)<<endl;
        system("pause");
}


4、Bloom Filter(布隆过滤器)
    即Bit-map的扩展,具体而言,Bloom Filter是一个包含了m位的位数组,数组的每一位都初始化为0,然后定义k个不同的Hash函数,每个Hash函数都可以将集合中的元素映射到位数组中的某一位。
    当向集合中插入一个元素时,根据k个Hash函数可以得到数组中的k个位,将这些位全部设置为1;
    当要查询某个元素是否属于集合时,就使用k个哈希函数得到此元素对应的k个位,如果所有点都是1,那么元素在集合内,如果有0,元素不在集合内。
    注意:如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。
    总结:Bloom Filter的位数m通常要比集合中的最大元素小得多,可见,Bloom Filter是一种空间效率和时间效率很高的随机数据结构,但这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合。因此,Bloom Filter不适合那些“零错误”应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。

5、倒排索引法
    倒排索引也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文检索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。
    使用范围:搜索引擎的关键字查询。
    倒排索引是相对正向索引而言的,正向索引是用来存储每个文档的单词的列表。在正向索引中,文档占据了中心的位置,每个文档指向了一个它包含的索引项的序列。也就是说文档指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很容易看到这个反向的关系。

原文地址:https://www.cnblogs.com/meihao1203/p/9548268.html