文章目录

  • Count-Min (CM) Sketch
  • Conservative-Update (CU) Sketch
  • Count Sketch

假设我们有一个数据包序列 S = { p 1 , p 2 , ⋯ , p n } \mathrm{S}=\{p_1, p_2, \cdots, p_n\} S={p1​,p2​,⋯,pn​}. h 1 ( . ) , h 2 ( . ) , ⋯ , h d ( . ) h_1(.), h_2(.), \cdots, h_d(.) h1​(.),h2​(.),⋯,hd​(.)均为哈希函数. 对于任意一个数据包 p i p_i pi​, 假设它的流标识符为 i d i id_i idi​, 则 h j ( i d i ) h_j(id_i) hj​(idi​)将生成一个随机数, 其中 i = 1 , 2 , ⋯ , n . j = 1 , 2 , ⋯ , d . i=1,2,\cdots, n. j = 1, 2, \cdots, d. i=1,2,⋯,n.j=1,2,⋯,d. 我们将以这一场景来介绍以下的几种sketch.

Count-Min (CM) Sketch

G. Cormode and S. Muthukrishnan, “An Improved Data Stream Summary: The Count-Min Sketch and Its Applications,” in LATIN 2004: Theoretical Informatics, Apr. 2004, pp. 29–38, doi: 10.1007/978-3-540-24698-5_7.

我们首先建立 d d d个哈希表, 每个哈希表包含 w w w个哈希桶, 每个哈希桶都是一个计数器. 当一个数据包 p i p_i pi​到达的时候, 我们从它的流标识符 i d i id_i idi​生成 d d d个不同的索引值, 即 i d x 1 = h 1 ( i d i ) , i d x 2 = h 2 ( i d i ) , ⋯ , i d x d = h d ( i d i ) idx_1 = h_1(id_i), idx_2=h_2(id_i), \cdots, idx_d=h_d(id_i) idx1​=h1​(idi​),idx2​=h2​(idi​),⋯,idxd​=hd​(idi​). 每个索引都分别在一个哈希表确定了一个唯一的哈希桶. 随后, 我们将每个哈希表中刚才确定的哈希桶的计数值增加1, 于是便完成了这个数据包对Count-Min Sketch的更新.

# 假设d=3, 单个哈希表的宽度为w
哈希表1 = [0]*w
哈希表2 = [0]*w
哈希表3 = [0]*w
def CountMin(数据包):标识符 = 数据包.流标识符索引1 = h1(标识符)%w索引2 = h2(标识符)%w索引3 = h3(标识符)%w哈希表1[索引1] += 1哈希表2[索引2] += 1哈希表3[索引3] += 1

当我们要查询某个数据流 f i f_i fi​的长度的时候, 我们首先提取这个数据流的流标识符 i d i id_i idi​, 然后使用 h 1 ( . ) , h 2 ( . ) , ⋯ , h d ( . ) h_1(.), h_2(.), \cdots, h_d(.) h1​(.),h2​(.),⋯,hd​(.)分别在每个哈希表中确定一个哈希桶, 这 d d d个哈希桶中的最小计数值便是对数据流 f i f_i fi​的长度的估计.

def 查询(f):标识符 = f.流标识符索引1 = h1(标识符)%w索引2 = h2(标识符)%w索引3 = h3(标识符)%w长度 = min(哈希表1[索引1], 哈希表2[索引2], 哈希表3[索引3])return 长度

Conservative-Update (CU) Sketch

C. Estan and G. Varghese, “New directions in traffic measurement and accounting,” in Proceedings of the 2002 conference on Applications, technologies, architectures, and protocols for computer communications, Pittsburgh, Pennsylvania, USA, Aug. 2002, pp. 323–336, doi: 10.1145/633025.633056.

我们同样创建 d d d个哈希表, 每个哈希表的宽度为 w w w, 每个哈希桶都仅包含一个计数器. 当一个数据包到达的时候, 我们用 h 1 ( . ) , h 2 ( . ) , ⋯ , h d ( . ) h_1(.), h_2(.), \cdots, h_d(.) h1​(.),h2​(.),⋯,hd​(.)对数据包的流标识符进行哈希, 从而在每个哈希表中确定唯一的一个哈希桶. 现在我们已经找到了 d d d个计数器; 我们将具有最小计数值的计数器增加1. 这个计数器更新后有计数值 c c c, 则对于剩余的计数器, 如果他们的值小于 c c c, 则我们将它们的值都设为 c c c, 否则就保持它们的值不变.

# 假设d=3, 单个哈希表的宽度为w
哈希表1 = [0]*w
哈希表2 = [0]*w
哈希表3 = [0]*w
def ConservativeUpdate(数据包):标识符 = 数据包.流标识符索引1 = h1(标识符)%w索引2 = h2(标识符)%w索引3 = h3(标识符)%w最小计数值 = min(哈希表1[索引1], 哈希表2[索引2], 哈希表3[索引3]) + 1哈希表1[索引1] = max(哈希表1[索引1], 最小计数值)哈希表2[索引2] = max(哈希表2[索引2], 最小计数值)哈希表3[索引3] = max(哈希表3[索引3], 最小计数值)

向Conservative-Update Sketch查询数据流 f f f的长度的时候, 我们依然对 f f f的流标识符进行哈希, 从而在每个哈希表中确定一个哈希桶, 这些哈希桶的最小计数值就是Conservative-Update Sketch对数据流 f f f的长度的估计.

def 查询(f):标识符 = f.流标识符索引1 = h1(标识符)%w索引2 = h2(标识符)%w索引3 = h3(标识符)%w长度 = min(哈希表1[索引1], 哈希表2[索引2], 哈希表3[索引3])return 长度

Count Sketch

M. Charikar, K. Chen, and M. Farach-Colton, “Finding Frequent Items in Data Streams,” in Automata, Languages and Programming, Berlin, Heidelberg, 2002, pp. 693–703, doi: 10.1007/3-540-45465-9_59.

我们同样有 d d d个哈希表, 每个哈希表包含 w w w个计数器. 但是现在我们有两组哈希函数, 其中 h 1 ( . ) , h 2 ( . ) , ⋯ , h d ( . ) h_1(.), h_2(.), \cdots, h_d(.) h1​(.),h2​(.),⋯,hd​(.)可以由一个流标识符生成一个索引, 而 s 1 ( . ) , s 2 ( . ) , ⋯ , s d ( . ) s_1(.), s_2(.), \cdots, s_d(.) s1​(.),s2​(.),⋯,sd​(.)可以由一个流标识符随机生成 { + 1 , − 1 } \{+1, -1\} {+1,−1}中的一个数. 当一个数据包 p i p_i pi​到达的时候, 我们会由它的流标识符生成一个索引 i d x j = h j ( p i . 流 标 识 符 ) idx_j=h_j(p_i.流标识符) idxj​=hj​(pi​.流标识符), 然后将第 j j j个哈希表中于 i d x j idx_j idxj​对应的计数器的值加上 s j ( p i . 流 标 识 符 ) s_j(p_i.流标识符) sj​(pi​.流标识符). 具体更新算法如下:

# 假设d=3, 单个哈希表的宽度为w
哈希表1 = [0]*w
哈希表2 = [0]*w
哈希表3 = [0]*w
def CountSketch(数据包):标识符 = 数据包.流标识符索引1 = h1(标识符)%w索引2 = h2(标识符)%w索引3 = h3(标识符)%w哈希表1[索引1] += s1(标识符)哈希表2[索引2] += s2(标识符)哈希表3[索引3] += s3(标识符)

当我们要查询某个数据流 f f f的长度的时候, 我们根据 f f f的长度从每个哈希表中确定一个计数值, 然后求他们的中位数, 所得结果即为CountSketch对数据流 f f f的长度的估计.

def 查询(f):标识符 = f.流标识符索引1 = h1(标识符)%w索引2 = h2(标识符)%w索引3 = h3(标识符)%w长度 = 中位数(哈希表1[索引1]*s1(标识符), 哈希表2[索引2]*s2(标识符), 哈希表3[索引3]*s3(标识符))return 长度

常见sketch简介相关推荐

  1. 线程编程常见API简介(中)

    2019独角兽企业重金招聘Python工程师标准>>> 一.概述 在<线程编程常见API简介(上) >中讲述了有关线程创建过程中常用的 API 的使用方法,本节继续讲述有 ...

  2. .NET常见线程简介

    .NET常见线程简介(翻译) 转载于:https://www.cnblogs.com/killmyday/archive/2009/02/20/1394746.html

  3. AI - 常见算法简介(Common Algorithms)

    机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...

  4. RSA算法原理——(1)目前常见加密算法简介

      艾伦·麦席森·图灵在二战期间主要负责破译德国人的密码系统Enigma,破解密码需要大量的计算,图灵深知工欲善其事必先利其器的道理,于是一台叫作CO-LOSSUS的计算机在1943年被研制出来,后来 ...

  5. 零售行业常见数据分析简介

    零售行业常见数据分析简介 1.财务分析 1)分析企业的财务状况,了解企业资产的流动性.现金流量.负债水平及企业偿还长短期债务的能力,从而评价企业的财务状况和风险. 2)分析企业的资产管理水平,了解企业 ...

  6. 001.常见监控简介

    一 监控架构 1.1 组成 客户端:数据采集部分 服务端:数据存储分析告警展示 1.2 采集模式 被动模式:服务器端到客户端采集数据,对服务器的开销较大,适合小规模的监控环境. 主动模式:客户端主动上 ...

  7. Qwt开发教程(三)—Qwt常见类简介#F0222

    本文原创作者:冯一川(ifeng12358@163.com),未经作者授权同意,请勿转载. 接下来,我们开始学习Qwt控件的使用来,使用前,先来简单了解下常见的Qwt类. 一.QwtPlot 它继承自 ...

  8. 倍福TwinCAT(贝福Beckhoff)基础教程2.1 TwinCAT常见类型简介

    常见数据类型可以参考EXCEL表格的内容,在准备值中输入非法数据,然后回车会有错误提示(例如BYTE数据输入256) 右击可以切换二进制或十进制显示,wData5可以被挨个采集每个位上的数据,也可以使 ...

  9. .NET常见线程简介(翻译)

    当你分析一个dump文件的时候,调试里面最艺术的地方就是知道哪些东西是可以忽略的,而哪些是你想要的东西. 特别是在你分析一个程序停止响应(hang)的bug时,了解这些常见线程对你非常有帮助,浏览线程 ...

最新文章

  1. iOS HitTest 机制
  2. C++报错解决:error: ‘int’ is not a class, struct, or union type typedef typename _Sequence::value_
  3. 随笔--2011.12.21
  4. JAVA系统和DOMINO通过LDAP集成方
  5. java中产生死锁的原因及如何避免
  6. python模型预测_python:目标检测模型预测准确度计算方式(基于IoU)
  7. nginx核心模块ngx_http_core_module详解
  8. [Python] L1-003. 个位数统计-PAT团体程序设计天梯赛GPLT
  9. Excel表中的数据导入到数据库中
  10. 手机无线信道测试软件,WiFi不稳定经常断?手机WiFi信道小工具
  11. 运算放大器(运放)选型、参数分析以及应用OPA2350
  12. plsql窗口文件怎么找回_简单粗暴搞定网易云音乐限制!找回失去的灰色快乐
  13. 善用GOOGLE–从入门到精通
  14. SpringBoot mybatis 实现多级树形菜单
  15. 身为程序员就算月薪再高,想找女朋友的话这些你千万别做!
  16. iOS 将状态栏设置成白色
  17. 计算机上u盘变成快捷方式,win7系统U盘文件都变成快捷方式的解决方法
  18. Mac录屏,同时保留声音
  19. 认知智能三大技术体系之类脑模型简介
  20. 01. 微信小程序音乐播放器

热门文章

  1. mysql自动生成id方式_Mysql全局ID生成方法
  2. 我的世界服务器无限装备指令2020,我的世界手机版指令表
  3. java方法案例:判断整数是奇数还是偶数
  4. TeamPlan小组工作计划管理系统想法
  5. 强人工智能基本问题:自上而下还是自下而上?
  6. mysql uuid分页优化_MySQL性能优化之分页查询优化
  7. http之短链接原理分析
  8. 修改谷歌浏览器账号密码自动填充功能的默认样式,elementUI
  9. Angular二级导航栏
  10. CHROME插件 by stormzhang