问题一,判断一个字串的存在与否?
一般常规是使用HashSet.
但是,随着量的增长,性能也线性降低,同时JVM内存使用不断膨胀,最终无法承受,如下图所示:
1.Bloom filter算法
基于bit位数组与Hash functions。这种算法虽然高效,但并非精确,会有一定的误差。对于要求不是很精确,但内存很小的情况下可用,同时也是可以调整误差率。
建议值:
问题二,计数,出现的次数?
一般用:
但是大量的数也会使其不堪重负:
算法1,CountMinSketch
CountMinSketch cms=new CountMinSketch(100,100,2);
cms.add(1,2);
cms.add(2,5);
cms.add(4,8);
cms.add(8,20);
cms.add(2,10);
long cntOf2= cms.estimateCount(2);
System.out.println("the count of 2 is :"+cntOf2);
HyperLogLog 用于计算 基(cardinality):