实现:判断某个元素是否在集合中,统计一段时间内的点击UV数(亿级别)
2017-04-01 10:00
881 查看
OK,这个是需要统计首页KV图的一段时间内的点击UV数(亿级别),每个KV图拥有一个唯一的ID。
UV是unique visitor的简写,是指通过互联网访问、浏览这个网页的自然人。
独立IP:是指独立用户/独立访客。指访问某个站点或点击某条新闻的不同IP地址的人数,独立IP只记录第一次进入网站的具有独立IP的访问者,假如一台电脑关机了,30分钟后重启,再次访问这个站那就再计算一次ip,在同一天内再次访问该网站则不计数。独立IP访问者提供了一定时间内不同观众数量的统计指标,而没有反应出网站的全面活动。比如你是ADSL拨号上网的,你拨一次号都自动分配一个ip,这样你进入了本站,那就算一个ip,当你断线了而没清理cookie,之后又拨 了一次号,又自动分配到一个ip,你再进来了本站,那么又统计到一个ip,但是UV(独立访客)没有变,因为2次都是你进入了本站。
PV(访问量):即Page View, 即页面浏览量或点击量,用户每1次对网站中的每个网页访问均被记录1次。用户对同一页面的多次访问,访问量累计。
现在大多数的统计工具只统计到IP和PV的层面上,因为在大多情况下IP与UV数相差不大。但由于校园网络、企业机关等一些部门的特殊性,IP已经很难真实的反映网站的实际情况,所以就引入了更加精确的UV这个概念。
对于使用真实IP上网的用户,UV和IP的数值是相同的。
这种数据结构,优点在于简单易于理解,且可以使用简单的hash table进行存储。缺点在于,当用户量非常大的时候,会占用比较大的内存空间。如果1亿来计算,就需要1亿*unique cookie占用字节的空间。假设unique cookie占用20个字节,就需要1.8G的内存空间。然而,为了解决hash冲突,还需要一定的空间冗余,假设空间利用率为50%,需要3.6GB空间
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集。
初始状态时,布隆过滤器是一个m位的位数组,每一位都置为0
为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位)。
在判断y是否属于这个集合时,我们对y应用k次哈希函数,如果所有hi(y)的位置都是1(1≤i≤k),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。下图中y1就不是集合中的元素。y2或者属于这个集合,或者刚好是一个false positive。
UV是unique visitor的简写,是指通过互联网访问、浏览这个网页的自然人。
独立IP:是指独立用户/独立访客。指访问某个站点或点击某条新闻的不同IP地址的人数,独立IP只记录第一次进入网站的具有独立IP的访问者,假如一台电脑关机了,30分钟后重启,再次访问这个站那就再计算一次ip,在同一天内再次访问该网站则不计数。独立IP访问者提供了一定时间内不同观众数量的统计指标,而没有反应出网站的全面活动。比如你是ADSL拨号上网的,你拨一次号都自动分配一个ip,这样你进入了本站,那就算一个ip,当你断线了而没清理cookie,之后又拨 了一次号,又自动分配到一个ip,你再进来了本站,那么又统计到一个ip,但是UV(独立访客)没有变,因为2次都是你进入了本站。
PV(访问量):即Page View, 即页面浏览量或点击量,用户每1次对网站中的每个网页访问均被记录1次。用户对同一页面的多次访问,访问量累计。
现在大多数的统计工具只统计到IP和PV的层面上,因为在大多情况下IP与UV数相差不大。但由于校园网络、企业机关等一些部门的特殊性,IP已经很难真实的反映网站的实际情况,所以就引入了更加精确的UV这个概念。
对于使用真实IP上网的用户,UV和IP的数值是相同的。
1.使用数组(哈希表)
这种数据结构,优点在于简单易于理解,且可以使用简单的hash table进行存储。缺点在于,当用户量非常大的时候,会占用比较大的内存空间。如果1亿来计算,就需要1亿*unique cookie占用字节的空间。假设unique cookie占用20个字节,就需要1.8G的内存空间。然而,为了解决hash冲突,还需要一定的空间冗余,假设空间利用率为50%,需要3.6GB空间
2.使用布隆过滤器
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集。
初始状态时,布隆过滤器是一个m位的位数组,每一位都置为0
为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位)。
在判断y是否属于这个集合时,我们对y应用k次哈希函数,如果所有hi(y)的位置都是1(1≤i≤k),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。下图中y1就不是集合中的元素。y2或者属于这个集合,或者刚好是一个false positive。
相关文章推荐
- 判断一个元素是否在一个集合中
- 编写js扩展方法实现判断一个数组中是否包含某个元素
- jquery如何判断元素是否被点击_百度知道
- jQuery判断元素是否显示 是否隐藏的简单实现代码
- 正确重写hashcode hashcode与equals方法 集合元素如何判断是否相等 集合如何查看是否包含某个元素
- java 函数式编程 - 判断集合中是否存在满足某个条件的元素
- c:forEach 遍历集合中的元素,判断是否是最后一个元素
- 扩展方法判断序列(或集合)是否包含元素
- c:forEach 遍历集合中的元素,判断是否是最后一个元素
- 判断数组是否包含某个元素的js函数实现方法
- 题目1.请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个证书x时,判断出S中是否存在有两个其和等于x的元素。
- 队列用链表实现(建立,插入新元素,删除元素,读取元素,全部删除,全部读出,判断是否为空,清空)
- (用树结构支持并查集8.2.2)POJ 1703 Find them, Catch them(并查集的简单使用: 判断两个元素是否属于同一集合)
- 根据2个条件判断集合里面是否存在元素,用拉姆达表达式
- 《算法导论》习题2.3-7 查找集合S中是否有两个元素和为X---Java实现
- 编写js扩展方法实现判断一个数组中是否包含某个元素
- 队列用链表实现(建立,插入新元素,删除元素,读取元素,全部删除,全部读出,判断是否为空,清空)
- iOS开发有用代码(有判断邮箱格式是否正确的代码、图片压缩、亲测可用的图片上传代码和实现点击图片进行跳转的代码等。)
- 集合 判断是否为同一元素 总结
- python实现判断数组是否包含指定元素的方法