《大数据算法》一3.3 寻找频繁元素的非随机算法

3.3 寻找频繁元素的非随机算法

上面讲的是一个简单的例子,接下来讲一个复杂的例子——频繁元素。
频繁元素指的是在数据流当中同一个元素出现多次,希望找到出现最频繁的元素。我们看一个例子:在数据流状态<32,12,14,32,7,12,32,7,6,12,4>中,当前最频繁的元素是32和12。这两个都是最频繁元素。
频繁元素问题
输入:流,隐式地定义了一个频率向量f=(f1,…,fn)。注意f1+…+fn=m。
输出:对于一个参数k,输出集合
频繁元素问题有广泛的应用。在网络当中找到“elephant flow”、ip地址等,在搜索引擎中找到频繁查询,可以给这些最频繁的查询做一些优化。在应用当中求频繁元素时有一个假设,即Zipf原则:典型的频率分布是高度偏斜的,只有少数频繁元素,大多数元素是非常不频繁的。这个假设是合法的,根据统计一般最多10%的元素占元素总个数的90%。

3.3.1 频繁元素的精确解

求精确解的方法很简单,可以对每一个单独元素设置一个计数器。当处理一个元素时,增加相应计数器。
例如求上述数据流中的频繁元素。

1) 首先,32到来,给32设一个计数器,并加1,得到<32,1>。
2) 接着12到来,给12设一个计数器,并加1,得到<32,1>,<12,1>。
3) 接下来给14设一个计数器,得到<32,1>,<12,1>,<14,1>。
4) 32又来了,给32的计数器加1,得到<32,2>,<12,1>,<14,1>。
5) 依此类推,最终结果为<32,3>,<12,3>,<14,1>,<7,2>,<6,1>,<4,1>。

这样做确实能得到精确解。但缺点是很明显的,只要数据流里面有一个新元素,在内存当中就要保存这个元素和它的计数器。如果在整个数据流中不同数据的数量非常大,则它所需要的内存量也是非常大的。这意味着没有一个很具体的界限。最坏情况是需要维护n个计数器,数据的个数就是计数器的个数。但在现实当中可以提供的计数器个数k是远小于n的,因此,可以退而求其次,求近似解。

3.3.2 频繁元素的Misra-Gries算法

Misra-Gries算法是一个计算频繁元素的非随机化近似算法。求解思想为:对于接收到的元素x,如果已经为其分配计数器,则把相应计数器加1;如果没有相应计数器,但计数器个数少于k,就为其分配计数器,并设为1,意味着内存中还有空间;如果当前计数器的个数为k,说明内存已经满了,则把所有计数器减1,然后删除取值为0的计数器,这样内存就又有空间了,再依次处理下一个x。
考虑上面的例子,其中n=6,k=3,m=11。

1) 接收32,内存有空间,为其分配计数器,内存状态<32,1>。
2) 接收12,内存有空间,为其分配计数器,内存状态<32,1>,<12,1>。
3) 接收14,内存有空间,为其分配计数器,内存状态<32,1>,<12,1>,<14,1>。
4) 接收32,32对应计数器加1,内存状态<32,2>,<12,1>,<14,1>。
5) 接收7,7不在内存当中,需要为其分配新的计数器,但是内存没有空间了。这时将所有计数器减1,然后把值为0的计数器删除,这时候,12和14的计数器就没有了。注意此时不将7的计数器加1,内存状态<32,1>。
6) 接收12,内存又有空间,为其重新分配计数器,内存状态<32,1>,<12,1>。
7) 接收32,32对应计数器加1,内存状态<32,2>,<12,1>。
8) 接收7,为其分配计数器,内存状态<32,2>,<12,1>,<7,1>。
9) 接收6,这时候内存满了,把所有计数器减1,然后把值为0的计数器删除,内存状态<32,1>。
10) 接收12,内存又有空间,为其再重新分配计数器,内存状态<32,1>,<12,1>。
11) 接收4,为其分配计数器,内存状态<32,1>,<12,1>,<4,1>。

这时候,如何根据计数器估计x出现的次数?最直接的办法是将内存里最后的数据定为x出现的次数,计数器在内存中将x返回,没有则返回0。很显然这种方法低估了计数问题,32出现了3次,但是最后只返回1次。
该算法的伪代码如算法3-2所示。算法3-2 求元素频率

初始化:A←;

处理j:
if j ∈ keys(A) then
  A\[j\]←A\[j\]+1
else if keys(A)<k-1 then
  A\[j\]←1
else
  foreach ∈keys(A) do
    A\[\]←A\[\]-1
    if A\[\]=0 then从A中移除;
输出:对于查询a, if a∈ keys(A),then输出fa=Aa,else输出fa=0。

算法精确性分析
定理3-2 算法3-2求得的元素a、频率估计fa和真实值fa之间的关系满足,其中m是数据流中所有元素出现的次数,m′是当前所有计数器之和。
证明 由于在计算过程中每个元素对应的计数器都可能减掉一些值,故显然
下面通过分析删除最多的元素数分析fa与fa之差的上界。这二者的差距是由a所对应计数器的减少所引起的,出现一个减少计数器的步骤,相应计数器就要减少一次。因而问题转化为整个计算过程中a对应计数器减少的次数。
注意到在计算过程中,只有内存已经满了的时候,即已经有k个计数器的时候,才执行计数器减少步骤,而此时每个计数器减少了1,意味着共减少了k。而在出现减少的时候,应该往内存里放的元素并没有放到内存中,也就是说未计入输入元素的此次出现,因此,每次计数器减少的步骤相当于减少了k+1。整个数据流的元素总数是m,内存中保存的计数总数是m′,每一轮计数器减少步骤减少了k+1,那么应该有(m-m′)/(k+1)个计数器减少步骤,这也就意味着fa和fa最多相差(m-m′)/(k+1),即。■
由上述分析可见,当数据流中元素的总数远大于(m-m′)/(k+1)时,可得到频繁项的一个好的估计。而且错误的界限和k成反比,因为k越大估计值和真实值相差越小,即内存越大误差越小。
可以利用略图计算错误的界限,在内存中记录m、m′和k,然后,把内存里最后一个频繁元素再加上相差的值,就可以得到频繁元素真实值的一个上界,而内存中保存的估计值是频繁元素的一个下界。在频繁元素的真实值范围之内,估计就准确得多。该算法有效的原因源于Zipf原则,就是说极少数元素出现的次数非常多,而大多数元素出现的次数非常少。

时间: 2024-09-29 12:54:10

《大数据算法》一3.3 寻找频繁元素的非随机算法的相关文章

《大数据算法》一3.5 寻找频繁元素的随机算法

3.5 寻找频繁元素的随机算法 本节重新研究3.3节中讨论的问题,提出寻找频繁元素的随机算法.Misra-Gries算法通过扫描数据一次提供足够的信息,然后通过第二次扫描数据解决频繁元素发现问题,即扫描数据第一次过程中Misra-Gries算法计算一个数据结构,对于j∈[n]该数据结构可以获得其频率fj的足够准确估计fj.本小节提出另外两个频率估计的随机算法. 3.5.1 略图法 1.略图和线性略图 在处理数据流σ的过程中,令表示Misra-Gries算法中所需的数据结构.这种数据结构的一个缺点

被互联网大数据改变的二手房中介:寻找新盈利模式

大数据时代里,一家传统的二手房中介公司或将演变成一家 互联网公司. 11月19日,链家副总裁林倩透露,链家在 目标市场占有率已经超过50%,是第二名规模的三至四倍.另据本报记者了解,2013年链家"卖了"价值超过1600亿的房子.以2.7%的中介费率粗略计算,链家的营业收入超过40亿. 随着规模的急剧扩大,房地产经纪公司开始变得"不安分"."过去一年里我们一直在关注淘宝的模式,虽然我们还不是一家互联网公司,但我们也在用互联网思维."链家地产品牌中

《大数据算法》一导读

前 言 本书的缘起 "大数据"在今天成为一个非常时尚的概念,其影响已经远远超过了计算机学科本身,甚至影响到了自然科学.社会科学.人文科学等.由于其深远的影响和广泛的应用,大数据一直得到IT从业人员的重视,他们对大数据相关理论.技术的学习有着强烈的需求. "算法设计与分析"是计算机科学的重要主题,进行大数据计算,"算法设计与分析"是必不可少的步骤,可以说,算法设计是"大数据落地"的关键之一.然而,虽然在今天的书店里,关于大数据的

我们找了 4 家大数据公司技术 Leader,聊了聊算法和数据挖掘工程师的机会和选择

当话题转向「算法工程师的招聘」时,TalkingData 首席数据科学家张夏天不免面露难色起来.而在此之前,谈论起算法和数据挖掘等具体业务时,他还滔滔不绝.兴致勃勃. 不只是张夏天,自去年 10 月以来,不止一位技术 Leader 曾向我吐过「招聘算法工程师难」的苦水.尽管「算法」背后代表的是「人工智能.机器学习」等被看作是未来发展方向的前沿技术,但招聘相关领域人才确实是摆在不少创业公司面前的一道难题. 100offer 的平台数据也侧面论证了这一点.截至目前,平台上的算法和数据挖掘工程师面试邀

大数据时代零售企业如何进行精确营销

近年来,同质化商品.频繁的价格战.店铺租金上涨.电子商务的冲击等因素导致零售企业利润不断下降,在2015年出现了零售业关店潮这一现象,大量零售门店关门,2016年还在延续.但是,有人倒下,就有人站出来.在当今大数据时代,谁能顺应时代的改变进行改革,谁就能抓住新的发展机遇. 零售企业通过多年的运营,掌握了大量的一手数据资料,如果能从这些数据中发现其的价值,掌握消费者的消费行为规律,预测消费者的购买意图,从而有针对性地制定精确的营销策略,消费者将感受到企业对他们的关注,降低营销成本的同时能改善消费者

MIT最新发布编程语言Milk,加速大数据时代并行运算

导读:本周MIT最新发布新编程语言Milk,新的程序语言在大数据方面能实现比现有语言快四倍的处理速度. 在当下的计算机芯片中,内存管理是基于计算机科学家所称的局部性原理(principle of locality)来实现的: 如果一个程序需要某个内存位置的数据块,它可能也需要数据块临近位置的数据. 但是在大数据时代,这种假设已不再成立.如今的计算机程序更多地是在大型数据集中离散地获取一点点数据.由于从主要内存位中获取数据已成了当下芯片的最大性能瓶颈,所以不得不更加频繁地获取数据,这也明显拖慢了程

超级人工智能:大数据的未来?

在百度大数据开放大会上,搞计算机学术理论的怀进鹏校长的演讲犹如给所有听众的一记闷棍,怀校长的学术演讲把大家弄得云里雾里,把所有人弄晕了,现场能够听懂的绝对是少数,可能都会觉得怀校长有点像个外星人一般在那自顾自的演讲.但我作为一个曾经有志从事人工智能研究但失之交臂的又是学计算机毕业的人却越听越兴奋,冥冥中似乎找到了未来的人工智能所能抵达的可能性,那么我现在就尝试把怀教授的演讲转换为人类也能够听懂的语言吧. 一,理解大数据 1,当前大数据的四大特征:规模大.变化快.种类杂.价值密度低. 其实这理解起

时间轴:大数据时代的“生死簿”

时间轴能真实呈现用户更加个性化.隐私化.立体化.互动化的数据和信息,各类相关形式的创新产品和应用,被认为将蕴含巨大的商业价值. 一年前,Facebook.Path等诸多国外的互联网公司都开始运用了时间轴(Timeline)功能.简单说,Timeline是用户自我编辑的个人时间轴,用来记录用户的行为轨迹,并可以控制个人信息只给想展示的人.时间轴应用让Facebook用户可以与朋友分享他们的各类活动,创建一个动态的时间轴主页.时间轴赋予用户一个载体,将其在互联网上的零散时光串联起来,用全新的方式诠释

五个角度浅析大数据与BI的区别

BI(Business Intelligence),中文翻译是商务智能,是一套完整的解决方案,用来将组织中现有的数据进行有效的整合,快速准确的提供报表并提出决策依据,帮助组织做出明智的业务经营决策. 大数据(Big Data)是从收集的海量数据中,通过算法将这些来自不同渠道.格式的数据进行直接分析,从中寻找到数据之间的相关性.简单而言,大数据更偏重于发现,以及猜测并印证的循环逼近过程. 不管定义如何不同,大数据与传统BI是社会发展到不同阶段的产物,我们从几下几个纬度来可以迅速的看出两者的区别: