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,一经查实,立即删除!

相关文章

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

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

搭建一个基于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。本…

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

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

解决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…

day10_Structured Steaming

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

【设计模式】 单例模式(单例模式哪几种实现,如何保证线程安全,反射破坏单例模式)

单例模式 作用:单例模式的核心是保证一个类只有一个实例,并且提供一个访问实例的全局访问点。 实现方式优缺点饿汉式线程安全,调用效率高 ,但是不能延迟加载懒汉式线程安全,调用效率不高,能延迟加载双重检…

无公网IP 实现外网访问本地 Docker 部署 Navidrome

Navidrome 是一款可以在 macOS、Linux、Windows以及 Docker 等平台上运行的跨平台开源音乐服务器应用,它支持传输常见的 MP3、FLAC、WAV等音频格式。允许用户通过 Web 界面或 API 进行音乐库的管理和访问。本文就介绍如何快速在 Linux 系统使用 Docker 进行本地部署…

解决conda create速度过慢的问题

问题 构建了docker容器 想在容器中创建conda环境,但是conda create的时候速度一直很慢 解决办法 宿主机安装的是anaconda 能正常conda create,容器里安装的是miniforge conda create的时候速度一直很慢,因为容器和宿主机共享网络了,宿主机…

【Hive】新增字段(column)后,旧分区无法更新数据问题

TOC 【一】问题描述 Hive修改数据表结构的需求,比如:增加一个新字段。 如果使用如下语句新增列,可以成功添加列col1。但如果数据表tb已经有旧的分区(例如:dt20190101),则该旧分区中的col1将为…

【Python】Selenium根据网页页面长度,模拟向下滚动鼠标,直到网页底部的操作

最近在弄selenium的爬取的过程中,我发现一些网站上的表格,是需要手动拉到底部才能加载完成的。 如果没有拉到底部,那么在获取网页表格的时候,表格就会只有显示的一部分,页面就不完整。 所以我就整理了一些模拟滚动鼠…

openharmony电源管理子系统

电源管理子系统 简介目录使用说明相关仓 简介 电源管理子系统提供如下功能: 重启服务:系统重启和下电。系统电源管理服务:系统电源状态管理和休眠运行锁管理。显示相关的能耗调节:包括根据环境光调节背光亮度,和根…