定义:
(作用方面)面对大量数据,牺牲计数的精确性而提高处理速度、减少处理时间的统计频率算法
关键词:大数据 实时计算
算法
基础:
哈希函数:将存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应,使在检索数据时能直接访问到地址,提高检索速度。
冲突:在哈希表中,不同的关键字值对应到同一个存储位置的现象。
解决冲突的方法:
⑴链接法(拉链法)。将具有同一散列地址的记录存储在一条线性链表中。
⑵开放定址法。如果h(k)已经被占用,则按某种规则查找未被占用的地址,并将数据放入找到的空地址中。
⑶桶定址法。桶:一片足够大的存储空间。桶定址:为表中的每个地址关联一个桶。如果桶已经满了,可以使用开放定址法来处理。(链接法和开放定址法的结合)
Count-min sketch算法 :
1、创建一个长度为 x 的数组,用来计数,初始化每个元素的计数值为0 (a[x]={0});
2、对于一个新来的元素,用哈希函数映射0 到 x 之间的一个数,比如哈希值为 i,作为数组的位置索引(a[i]);
3、数组对应的位置索引 i 的计数值加 1 (a[i]++);
那么,这时要查询某个元素出现的频率,只要简单的返回这个元素哈希望后对应的数组的位置索引的计数值即可。
算法流程图:创建a[i]={0},哈希函数f,哈希值i
由于使用哈希函数,存在冲突,故需优化算法来减少冲突:
使用多个数组和多个哈希函数,来计算一个元素对应的数组的位置索引;
那么,要查询某个元素的频率时,返回这个元素在不同数组中的计数值中的最小值即可。
原理:不同映射法则对应的哈希值不同,相互冲突的数据也不同(通过法则h1 a和b冲突,而通过法则h2 a和c冲突),故在不同函数对应的数组中某个元素的频率也不同。当查找某一个元素时,这个元素在不同数组中的计数值中的最小值即为该元素按照某个法则映射发生最少冲突时的频率。这种叠加多种函数,使用多对数组进行相互检验的方式减少冲突带来的影响,提高了计数的准确性。
cm-sketch的优缺点
优点:
1、哈希函数—>内存占用减少:只需要固定大小的内存和计算时间,和需要统计的元素多少无关;
2、通过哈希值—>直接寻址—>加快查找:使用链表遍历查找花费时间多;
缺点:
1、只会估算偏大,永远不会偏小:冲突使不同的数据通过函数映射到同一个地址,使该数组的计数偏大;
2、对于低频的元素,估算值相对的错误可能会很大:当低频的元素与频率高的元素的哈希值相同时(冲突),查找低频元素的频率时输出的是高频元素的频率,对低频元素的估算值影响较大。
参考网页:
https://baike.baidu.com/item/%E5%93%88%E5%B8%8C%E5%87%BD%E6%95%B0/9796422?fr=aladdin
https://blog.csdn.net/pipisorry/article/details/64126199