Count Sketch--计数草图

背景

Count Sketch 是一种空间高效的概率型数据结构,由 Moses Charikar、Kevin Chen 和 Martin Farach-Colton 在 2002 年提出,用于估计数据流中元素的频率,也可用于解决重击者问题。

原理

算法结构

  • 参数设定:Count Sketch算法主要依赖两个参数,即哈希函数的数量 d和哈希表的大小w。这两个参数决定了算法的空间复杂度和估计精度。

  • 哈希表初始化:根据设定的参数,初始化一个大小为d*w的二维数组,通常称为哈希表。数组中的每个元素初始值都为0,用于存储元素的频率估计值。

哈希函数设计

  • 哈希函数选择:算法使用 d个独立的哈希函数 h_{1},h_{1},...,h_{d}​,每个哈希函数将输入元素映射到 [1,w] 的范围内。同时,还使用d个随机符号函数 ​g_{1},g_{2},...,g_{d},每个符号函数将输入元素映射到 {−1,1}。

  • 哈希映射规则:对于输入元素 x,通过每个哈希函数 h_{i}(x)确定其在哈希表中的位置,即第 i 行的第 h_{i}(x)列。同时,根据符号函数g_{i}(x)确定对该位置的值进行加1还是减1操作。

数据处理流程

  • 元素插入:当一个元素 x出现时,算法会遍历 d个哈希函数。对于每个哈希函数 h_{i},计算h_{i}(x)g_{i}(x),然后在哈希表的第 i行第 h_{i}(x)列的位置加上 g_{i}(x)。这样,元素 x的信息就被分散存储在哈希表的多个位置中。

  • 频率估计:当需要估计元素 x 的频率时,同样遍历 d个哈希函数。对于每个哈希函数 h_{i}​,计算 h_{i}(x)g_{i}(x),然后查看哈希表第 i行第 h_{i}(x) 列的值,并乘以 g_{i}(x)。最后,取这 d 个值的中位数作为元素 x 的频率估计值。

例子

1. 参数设定

假设我们设定哈希函数的数量 d=2,哈希表的大小 w=3。那么我们将初始化一个大小为 2×3 的二维数组,所有元素初始值都为0,如下所示:

000
000

2. 哈希函数和符号函数设计

我们选择两个哈希函数 h1​ 和 h2​,以及两个符号函数 g1​ 和 g2​。假设它们的具体映射如下(这里为了简化示例,直接给出映射结果):

  • h1​(x):将元素 x 映射到 [1,3] 的范围内

    • h1​(a)=1

    • h1​(b)=2

    • h1​(c)=3

  • h2​(x):将元素 x 映射到 [1,3] 的范围内

    • h2​(a)=3

    • h2​(b)=1

    • h2​(c)=2

  • g1​(x):将元素 x 映射到 {−1,1}

    • g1​(a)=1

    • g1​(b)=−1

    • g1​(c)=1

  • g2​(x):将元素 x 映射到 {−1,1}

    • g2​(a)=−1

    • g2​(b)=1

    • g2​(c)=−1

3. 数据处理流程

元素插入

假设我们有一个数据流,依次出现元素 a,b,a,c,b,a。

  • 插入元素 a

    • 对于 h1​:h1​(a)=1,g1​(a)=1,所以在第1行第1列的位置加1,变为1。

    • 对于 h2​:h2​(a)=3,g2​(a)=−1,所以在第2行第3列的位置减1,变为-1。

    • 此时哈希表为:

    100
    00-1
  • 插入元素 b

    • 对于 h1​:h1​(b)=2,g1​(b)=−1,所以在第1行第2列的位置减1,变为-1。

    • 对于 h2​:h2​(b)=1,g2​(b)=1,所以在第2行第1列的位置加1,变为1。

    • 此时哈希表为:

    1-10
    10-1
  • 插入元素 a

    • 对于 h1​:h1​(a)=1,g1​(a)=1,所以在第1行第1列的位置加1,变为2。

    • 对于 h2​:h2​(a)=3,g2​(a)=−1,所以在第2行第3列的位置减1,变为-2。

    • 此时哈希表为:

    2-10
    10-2
  • 插入元素 c

    • 对于 h1​:h1​(c)=3,g1​(c)=1,所以在第1行第3列的位置加1,变为1。

    • 对于 h2​:h2​(c)=2,g2​(c)=−1,所以在第2行第2列的位置减1,变为-1。

    • 此时哈希表为:

    2-11
    1-1-2
  • 插入元素 b

    • 对于 h1​:h1​(b)=2,g1​(b)=−1,所以在第1行第2列的位置减1,变为-2。

    • 对于 h2​:h2​(b)=1,g2​(b)=1,所以在第2行第1列的位置加1,变为2。

    • 此时哈希表为:

    2-21
    2-1-2
  • 插入元素 a

    • 对于 h1​:h1​(a)=1,g1​(a)=1,所以在第1行第1列的位置加1,变为3。

    • 对于 h2​:h2​(a)=3,g2​(a)=−1,所以在第2行第3列的位置减1,变为-3。

    • 此时哈希表为:

    3-21
    2-1-3
频率估计

现在我们来估计元素 a、b 和 c 的频率。

  • 估计元素 a 的频率

    • 对于 h1​:h1​(a)=1,g1​(a)=1,所以查看第1行第1列的值,为3。

    • 对于 h2​:h2​(a)=3,g2​(a)=−1,所以查看第2行第3列的值,为-3,乘以-1,变为3。

    • 取这两个值的中位数,即 median(3,3)=3。所以估计元素 a 的频率为3,实际频率也为3,估计准确。

  • 估计元素 b 的频率

    • 对于 h1​:h1​(b)=2,g1​(b)=−1,所以查看第1行第2列的值,为-2,乘以-1,变为2。

    • 对于 h2​:h2​(b)=1,g2​(b)=1,所以查看第2行第1列的值,为2。

    • 取这两个值的中位数,即 median(2,2)=2。所以估计元素 b 的频率为2,实际频率也为2,估计准确。

  • 估计元素 c 的频率

    • 对于 h1​:h1​(c)=3,g1​(c)=1,所以查看第1行第3列的值,为1。

    • 对于 h2​:h2​(c)=2,g2​(c)=−1,所以查看第2行第2列的值,为-1,乘以-1,变为1。

    • 取这两个值的中位数,即 median(1,1)=1。所以估计元素 c 的频率为1,实际频率也为1,估计准确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷P4017 最大食物链计数(图的拓扑排序)

题目链接:P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 题目描述 给你一个食物网,你要求出这个食物网中最大食物链的数量。 (这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物…

2025.1.17——三、SQLi regexp正则表达式|

题目来源:buuctf [NCTF2019]SQLi1 目录 一、打开靶机,整理信息 二、解题思路 step 1:正常注入 step 2:弄清关键字黑名单 1.目录扫描 2.bp爆破 step 3:根据过滤名单构造payload step 4:regexp正则注…

【华为OD-E卷 - 字符串加密 100分(python、java、c++、js、c)】

【华为OD-E卷 - 字符串加密 100分(python、java、c、js、c)】 题目 给你一串未加密的字符串str,通过对字符串的每一个字母进行改变来实现加密,加密方式是在每一个字母str[i]偏移特定数组元素a[i]的量,数组a前三位已经…

搭建一个基于Spring Boot的书籍学习平台

搭建一个基于Spring Boot的书籍学习平台可以涵盖多个功能模块,例如用户管理、书籍管理、学习进度跟踪、笔记管理、评论和评分等。以下是一个简化的步骤指南,帮助你快速搭建一个基础的书籍学习平台。 — 1. 项目初始化 使用 Spring Initializr 生成一个…

【Linux 之一 】Linux常用命令汇总

Linux常用命令 ./catcd 命令chmodclearcphistoryhtoplnmkdirmvpwdrmtailunamewcwhoami 我从2021年4月份开始才开始真正意义上接触Linux,最初学习时是一脸蒙圈,啥也不会,啥也不懂,做了很多乱七八糟,没有条理的笔记。不知…

Hexo + NexT + Github搭建个人博客

文章目录 一、 安装二、配置相关项NexT config更新主题主题样式本地实时预览常用命令 三、主题设置1.侧边栏2.页脚3.帖子发布字数统计 4.自定义自定义页面Hexo 的默认页面自定义 404 页自定义样式 5.杂项搜索服务 四、第三方插件NexT 自带插件评论系统阅读和访问人数统计 五、部…

开发神器之cursor

文章目录 cursor简介主要特点 下载cursor页面的简单介绍切换大模型指定ai学习的文件指定特定的代码喂给ai创建项目框架文件 cursor简介 Cursor 是一款专为开发者设计的智能代码编辑器,集成了先进的 AI 技术,旨在提升编程效率。以下是其主要特点和功能&a…

当前目录不是一个git仓库/远程仓库已经有了一些你本地没有的更改

目录 问题1:问题2:解决1解决2 问题1: fatal: not a git repository (or any parent up to mount point /) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). # 初始化 Git 仓库 git init需要到本地目录下先添加…

差异基因富集分析(R语言——GOKEGGGSEA)

接着上次的内容,上篇内容给大家分享了基因表达量怎么做分组差异分析,从而获得差异基因集,想了解的可以去看一下,这篇主要给大家分享一下得到显著差异基因集后怎么做一下通路富集。 1.准备差异基因集 我就直接把上次分享的拿到这…

BGP边界网关协议(Border Gateway Protocol)路由引入、路由反射器

一、路由引入背景 BGP协议本身不发现路由,因此需要将其他协议路由(如IGP路由等)引入到BGP路由表中,从而将这些路由在AS之内和AS之间传播。 BGP协议支持通过以下两种方式引入路由: Import方式:按协议类型将…

使用FFmpeg和Python将短视频转换为GIF的使用指南

使用FFmpeg和Python将短视频转换为GIF的使用指南 在数字时代,GIF动图已成为表达情感和分享幽默的重要媒介。无论是社交媒体上的搞笑片段还是创意项目中的视觉效果,GIF都能迅速抓住观众的注意力。然而,很多人不知道如何将短视频转换为GIF。本…

正则表达式基础知识及grep、sed、awk常用命令

文章目录 前言一、正则表达式元字符和特性1. 字符匹配2. 量词3. 字符类4. 边界匹配5. 分词和捕获6. 特殊字符7. 位置锚定 二、grep常用参数1. -n额外输出行号2. -v 排除匹配的行3. -E 支持扩展正则匹配4. -e进行多规则匹配搜索5. -R 递归匹配目录中的文件内容6. -r递归地搜索目…

工作中redis常用的5种场景

在日常开发工作中,Redis作为一款高性能的内存数据库,凭借其强大的功能特性和卓越的性能表现,已经成为了许多项目中不可或缺的组件。本文将详细介绍Redis在实际工作中最常见的5种应用场景,并附上具体的代码实现。 1. 缓存热点数据…

LLM - 大模型 ScallingLaws 的迁移学习与混合训练(PLM) 教程(3)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145212097 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scalin…

深入浅出 Go语言并发安全字典 sync.Map:原理、使用与优化

深入浅出 Go语言并发安全字典 sync.Map:原理、使用与优化 背景介绍 Go语言作为一种高效的并发编程语言,其标准库中提供了丰富的并发工具,如sync.WaitGroup、sync.Mutex等。然而,在实际开发中,我们经常需要在多个goroutine之间共享数据,这就涉及到并发安全的问题。传统的…

解决leetcode第3418题机器人可以获得的最大金币数

3418.机器人可以获得的最大金币数 难度:中等 问题描述: 给你一个mxn的网格。一个机器人从网格的左上角(0,0)出发,目标是到达网格的右下角(m-1,n-1)。在任意时刻,机器人只能向右或向下移动。 网格中的每个单元格包含一个值coin…

蓝桥杯 Python 组知识点容斥原理

容斥原理 这张图初中或者高中数学课应该画过 也就是通过这个简单的例子引出容斥原理的公式 这张图的面积:s1 s3 s7 - 2 * s2 - 2 * s4 - 2 * s6 3 * s5 通过此引导出容斥原理公式 那么下面来一起看看题目 题目描述 给定 n,m 请求出所有 n 位十进制整数中有多…

GitLab:添加SSH密钥之前,您不能通过SSH来拉取或推送项目代码

1、查看服务器是否配置过 [rootkingbal-ecs-7612 ~]# cd .ssh/ [rootkingbal-ecs-7612 .ssh]# ls authorized_keys id_ed25519 id_ed25519.pub id_rsa id_rsa.pub2、创建密钥 $ ssh-keygen -t rsa -C kingbalkingbal.com # -C 后写你的邮箱 一路回车 3、复制密钥 [rootk…

Rust:指针 `*T` 和引用 `T`的区别

在 Rust 编程语言中,*T 和 &T 是两种不同类型的指针,它们各自代表了不同的内存访问方式和所有权模型。 *T(原始指针或裸指针): *T 是一个原始指针(也称为裸指针或裸引用),它可以…

day10_Structured Steaming

文章目录 Structured Steaming一、结构化流介绍(了解)1、有界和无界数据2、基本介绍3、使用三大步骤(掌握)4.回顾sparkSQL的词频统计案例 二、结构化流的编程模型(掌握)1、数据结构2、读取数据源2.1 File Source2.2 Socket Source…