Misra-Gries 算法

参考
https://www.cnblogs.com/super-zhang-828/p/7353217.html

前言

Misra-Gries算法是频繁项挖掘中一个著名的算法。频繁项就是那些在数据流中出现频率最高的数据项。频繁项挖掘,这个看似简单的任务却是很多复杂算法的基础,同时也有着广泛的应用。

对于频繁项挖掘而言,一个简单的想法是,为所有的数据项分配计数器,当一个数据项到达,我们即增加相应计数器的值。但当数据流的规模较大时,出于内存的限制,我们往往不可能为每个数据项分配计数器。而Misra-Gries算法则是以一种清奇的思路解决了这个问题,实现了在内存受限的情况下,以较小的错误率统计数据流中的频繁项。

算法作者

Misra-Gries算法在1982年由华威大学的Misra和Gries提出

Misra-Gries算法

即使ϕ的值很大,解决这个问题的算法也至少要花费O(n)的空间。在这种情况下,一个错误率为ϵ的近似算法被提出。这就是我们的Misra-Gries算法。它的具体步骤如下:

首先建立一个大小为k的数组T。

对于数据流中依次到达的项i进行如下处理:如果项i在数组T中,则其对应的计数器ci++;如果项i不在数组T中,且数组T中的元素个数小于k−1,则将项i加入数组T,并为其分配计数器ci=1;其他情况,将数组T中所有元素的计数器减1,此时如果数组T中存在元素的计数器值为0,则从数组T移除这个元素。

当完成对数据流的扫描后,数据T中保存的k′(k′≤k−1)个元素即是数据流中的频繁项。
伪代码如下

Misra-gries算法分析

空间复杂度

如果用平衡二叉树存储key-value数组,其中key,也就是元素的值可以从[ n ] [n][n]中取,因此长度为⌈ log ⁡ n ⌉ \lceil \log n\rceil⌈logn⌉。value,也就是频数,最大不超过m mm,因此长度为⌈ log ⁡ n ⌉ \lceil \log n\rceil⌈logn⌉。最多存储k − 1 k-1k−1个这样的key-value对。因此空间复杂度为O ( k ( log ⁡ m + log ⁡ n ) ) O(k(\log m + \log n))O(k(logm+logn))。
————————————————
版权声明:本文为CSDN博主「十三言」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/karroyan/article/details/110818901

其他讨论

公认无误的逻辑是,

① 运算逻辑是:不满就放入,如果满了就消掉一行,每个记录中的项都减一;

② Misra-Gries算法输出的数据项并不一定是频繁项,但是频繁项一定在输出结果之中。

③ 频繁项(频数>=n/k)要出现在最终的结果里

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40208392/article/details/112794548
———————————————— 版权声明:本文为CSDN博主「Yuhui Wang」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40208392/article/details/112794548

上面这位博主的想法我觉得有问题,这个近似算法的输出的数据项不应该是输出所有的频繁项,而应该是输出的项都是频繁项,而不能输出所有频繁项。
因为

你说说看,这个近似算法是高估了频繁元素的数量还是低估了?

小可:内存中的频繁元素的计数器不断地由于内存被占满而被削减,显然是低估了。

Mr.
王:没错,我们不能仅仅知道结果是低估了准确值,最好还要能根据算法分析出究竟低估了多少。想要知道低估了多少,我们首先要考虑的就是一个计数器被减小了几次。这就需要我们考虑到在整个算法的执行过程中,执行过多少个减少计数器的步骤。假如把整个结构的权重(也就是计数器的和)记作m’,整个数据流的权重(全部元素的数量)记作m。每当计数器需要降低时,由于内存中有k个计数器,我们也就减少了k个计数器,但是这时新到来的元素x并未计入内存中的计数器,它的到来只是标志着该削减计数器了,所以我们少加了k+1个计数器。因此,最多有个减少步骤。也就是说,估计和真实值最多相差。如果数据流的元素总量远大于值,我们可以得到一个好的频繁元素的估计。

可以看出,错误的界限是与k成反比的。你说说看,这说明什么?

小可:k 是内存中计数器的个数,也就是内存的大小,这说明内存越大,结果就越准确。

Mr. 王:嗯,这也是符合客观规律的。而且我们可以利用数据概要来计算错误的界限,只需要记录m、m’ 和k就可以了。

不过不难看出,如果数据集合中每个元素的数量都相差不多的话,这个算法求出的结果会具有很大的随机性,好在我们一般需要处理的数据都满足Zipf法则。

Zipf法则:典型的频率分布是高度偏斜的,只有少数频繁元素,最多10%的元素占元素总个数的90%。这个定律说明,只有少数的元素是大量重复出现的,而绝大多数元素的出现是不频繁的。

根据Zipf法则我们知道,频繁元素的种类只有少数,而其数量往往是非常大的,在算法执行的过程中,不断地削减内存中的计数器对于频繁元素最终被保留在内存里不会有太大程度的影响。

https://cloud.tencent.com/developer/article/1086891

作业

  1. 给定输入流< b, a, c, a, d, e, a, f, a, d>,计数器个数k = 3。请逐步写出Misra- Gries 算法执行的结果。
    我的答案(不保证对)
    i=b c_b=1 {b}
    i=a c_a=1 c_b=1 {b,a}
    i=c c_a=0 c_b=0 {}
    i=a c_a=1 {a}
    i=d c_d=1 c_a=1 {a,d}
    i=e c_a=0 c_d=0 {}
    i=a c_a=1 {a}
    i=f c_f=1 c_a=1 {f,a}
    i=a c_f=1 c_a=2 {f,a}
    i=d c_f=0 c_a=1 {a}

Misra-Gries 算法相关推荐

  1. 大数据算法 chap-3 亚线性算法例析

    亚线性算法例析 3.1 数据流中频繁元素(空间亚线性) Misra Gries(MG)算法 3.2 最小生成树 3.1 数据流中频繁元素(空间亚线性) 大数据的数据流模型 数据只能顺序扫描1次或几次 ...

  2. 自监督学习新思路!基于蒸馏损失的自监督学习算法 | CVPR 2021

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 AI 科技评论报道 编辑 | 陈大鑫 AI 科技评论 今天给大家介绍 ...

  3. 自监督学习新思路!基于蒸馏(distillation loss)的自监督学习算法

    今天给大家介绍一篇 CVPR 2021 关于自监督的文章叫 S2-BNN [1],来自 CMU,HKUST 和 IIAI.它探讨了如果网络规模在非常小的情况下(比如 efficient network ...

  4. 卡尔曼滤波算法_GPS定位笔记3 (卡尔曼滤波定位算法)

    之前的笔记介绍了传统的最小二乘解法和DOP的概念,这一节介绍卡尔曼滤波的定位解法.需要的先修基础知识: 卡尔曼滤波原理,尤其是拓展卡尔曼滤波(EKF) 卡尔曼滤波回顾与复习 标准线性卡尔曼滤波 一个线 ...

  5. 我是如何从勉强写冒泡成长到轻松get百度offer? (内有许多优质算法书籍介绍及推荐)

    关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这 ...

  6. 新手如何学习算法?算法如何入门以及零基础入门算法应该学些什么?

    搬运工,看到一篇关于算法学习之路的总结,希望对你有帮助. 原文链接:zh.lucida.me/blog/on-le 我的算法学习之路 MAY 4TH, 2014 | COMMENTS  关于 严格来说 ...

  7. 新手收入学习算法?算法如何入门以及零基础入门算法应该学些什么?学习路线是什么...

    作者:周末 链接:https://www.zhihu.com/question/27984119/answer/39116336 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  8. 巩朋:我的算法学习之路

    转自:http://blog.jobbole.com/67348/ 巩朋:我的算法学习之路 分享到: 232 MVC架构模式分析与设计 Linux Guide for Developers 网页广告特 ...

  9. Java基于优先队列的贪心算法,java

    关于这篇博客 这篇博客是在我读<你不知道的JavaScript-上卷>的时候,遇到的我觉得需要记录下来的知识. 刚好又能够配合之前我写的这篇执行上下文与执行上下文栈博客中关于变量提升与函数 ...

  10. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

最新文章

  1. OpenCV下车牌定位算法实现代码
  2. Java中如何实现序列化,有什么意义?
  3. 55种网页常用小技巧
  4. 数据库常用面试题(SQL Server) (转载)
  5. Elasticsearch+Kibana 设置连接密码
  6. 生日快乐编程代码_世界上最好的编程语言,刚刚度过了25周岁生日
  7. IBatis.Net学习笔记七--日志处理
  8. 阿里云 RTC QoS 弱网对抗之变分辨率编码
  9. ERP和C4C中的function location
  10. ATL(COM) 开发下 -- VS2010
  11. 在windows系统上word转pdf
  12. 随机森林、gbdt算法
  13. Java基础:如何读取控制台输入?如何读取字符?
  14. 《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程
  15. Exchange 2010与Exchange Online混合部署PART 3:混合准备
  16. 【技术分享】数据之大,云动未来 - 弹性云数据库技术解析
  17. virt-manage 使用
  18. VS Code中使用PlantUML绘图
  19. Acer宏基笔记本电脑捕食者Predator PH317-55原装出厂Windows10系统恢复原厂OEM系统
  20. FITC-PEG-Biotin,荧光素-聚乙二醇-生物素的相关检测

热门文章

  1. Oracle VM VirtualBox安装教程
  2. 《概率论与数理统计》速成
  3. 谷歌离开中国的三大原因四大后果
  4. slack 聊天机器人_无法筹集资金的Slack机器人
  5. MKV 高清视频文件分解与封装和音频编码的转换
  6. python自动生成文章原创_【Python】皮皮AI工具( AI文章伪原创工具)
  7. 视频教程-【国内首套H3C V7交换机实战课程-2】以太网端口和链路聚合配置与管理-H3C认证
  8. 计算机网络习题(参考)
  9. SQL 2008安装时反复提示重启和安装.net framework 3.5
  10. URPF(Unicast Reverse Path Forwarding)反向路径转发