常用的几种方法:
1、分治法/Hash映射 + hash_map
a、将海量数据通过Hash映射为若干的小文件;
b、利用hash_map对每个小文件进行统计(key为数据内容,value为出现次数);
2、Bloom Filter
Bloom Filter是一种允许有少量错误的数据判重或者集合求交集的方法。
具体内容以及公式参考博客Bloom Filter 算法简介 (增加 Counting Bloom Filter 内容)
a、 建立一个长度为m的位数组+ k个独立的hash函数(若输入的元素个数为n,则错误率为0.01时一般m=13*n,k=8);
b、 输入一个元素,经过k个hash函数映射后,将位数组相应位置置1;
c、 若一个数据对应的所有位置都为1,则该数据很可能已经出现过,若不全为1,则肯定没有出现过。
缺点:不能保证结果完全正确;只支持插入和查找,不支持删除;
优点:节省内存。
改进:CountingBloom Filter
它将标准BloomFilter位数组的每一位扩展为一个小的计数器(Counter),在插入元素时给对应的k(k为哈希函数个数)个Counter的值分别加1,删除元素时给对应的k个Counter的值分别减1。)
3、Bitmap
Bitmap是一种和Bloom Filter差不多的概念,用bit的值来标记某个元素对应的Value,Key为该元素,常用于统计重复数据,以及两个集合之间的比较。
4、Trie树
Trie树,即字典树,又称单词查找树或键树。
常用于统计和排序大量字符串或者单词。
Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
优点:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
它有3个基本性质:
a、根节点不包含字符,除根节点外每一个节点都只包含一个字符。
b、从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
c、每个节点的所有子节点包含的字符都不相同。
好比假设有b,abc,abd,bcd,abcd,efg,hii 这6个单词,我们构建的树就是如下图这样的:
5、外排序
当待排序的文件很大,内存不够,就不能使用内部排序,需要做内外存内容的交换。外排序其实也是归并排序。具体内容以及公式参考博客外排序
例如对4500个记录排序,但是内存只能存750个记录。
第一步:将数据分为6份,每次对其中一份进行内部排序,并将结果存到一个外部存储器。
第二步:将内存分成3份,其中两份作为输入缓冲区,一份作为输出缓冲区。从Segment_1中取250个数据,从Segment_2中取250个数据,将归并结果存入输出缓冲区(满了之后移入临时缓冲区),输入缓冲区空了之后从相应的归并段继续取,直到排序结束。重复,直到所有排序结束。
6、桶排序
将数据划分为间距相同的桶,不同大小的数据放到相应的桶里面,主要用于查找处于海量数据中某一区间内的数据,如查找中位数。
7、最大堆、最小堆
主要用于解决Top K 问题
取前K个数据,维护一个最大堆(取最小的K个数),维护一个最小堆(取最大的K个数)。
常见题目参考博客