微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么是最小计数草图?您什么时候使用它?

如何解决什么是最小计数草图?您什么时候使用它?

什么是count-min sketch?在什么情况下有用?

解决方法

里程最高概述

直观地,您可以将最小计数草图视为一种节省空间的数据结构,用于近似地查看数据流中给定项目的次数。从客户端的角度来看,count-min草图支持两种操作:

  • 增量(x),表示“我已经见过x次了”,并且
  • estimate(x),它表示“请给我一个我看过x次的估计数。”

如果仅查看此界面,您可能会想“这不是哈希表或BST可以做的事情吗?”这是对的-您可以制作一个BST,其键是元素,其值是看到每个项目的次数,或者对哈希表执行相同的操作。如果您有足够的内存来跟踪您遇到的所有键,那么这并不是没有道理的。但是,假设您正在使用Amazon服务器,并且正在跟踪每种产品的视图。突然之间,即使记下所有被访问页面的名称,也要占用 ton 的内存。或假设您是Google,并且想每天查找访问量最高的页面。简单地写下所有搜索查询来获得足够的RAM可能会非常昂贵,而且分页到磁盘的速度太慢。

最小计数草图的亮点在于最小计数草图所需的内存量可由用户调整。如果您给它提供更多的内存,它将产生更好的估算值所见元素的真实频率。如果给它较少的内存,它将产生较低质量的估计,但可以量化地保证这些估计接近真实值的可能性。这意味着,例如,如果您只有1MB专用于此目的,则可以粗略估计频率,而如果有128MB,则可以得到更好的频率估计。

最小计数草图给出的估计值永远不会低估元素的真实频率。例如,如果一个最小计数草图表示某项已出现50次,则该元素可能已出现50次,49次或48次等,但不可能出现100次次。这使得最小计数草图对于查找高频项很有用:低频项的频率可能会被高估一点,但是高频项将始终显得很流行。

内部细节

最小计数草图是要实现的相当简单的数据结构。基本思想如下。想象一下,我们有一个计数器数组,我们想使用该数组来跟踪我们看到的项目的频率。我们将使用哈希函数将每个项目分配给某个计数器(计算其哈希代码并通过表大小对其进行修改)。每当我们增加该项目时,我们都将转到相应的计数器,然后对其进行递增。要提供估算,我们只需转到该计数器并返回存储在其中的值即可。

思考最小计数草图的工作方式的一种方法是将每个计数器想象成一个“桶”,其中装有某种类型的所有物品。然后,我们通过查看其存储桶中有多少项目(不管这些项目是什么)来估算某事物的频繁程度,如下所示:

A collection of items distributed into buckets

如您所见,我们对频繁使用的物品获得了合理的估计,而对不经常使用的物品的频率可能会被严重高估。这也很好地说明了为什么最小计数草图永远不会低估元素的频率。当您在存储桶中查看商品时,您始终至少会数一数。

如果我们对所使用的哈希函数做出一些合理的假设,我们可以正式证明,平均而言,对某项内容的频率给出的估算值最多为实际频率,再加上项目总数除以柜台总数。这很直观。如果您有很多计数器,则每个项目在某个时候都会拥有自己的计数器,并且估算值将非常准确。在另一个极端,如果您几乎没有柜台,那么您会希望所有物品都塞满少量的水桶,而总数将开始减少。

尽管这种方法保证了按预期是正确的,但这并不意味着您有高概率获得良好的估算。考虑这一点的一种方法是考虑“按预期”进行良好的估计意味着什么。直观地讲,这意味着如果您要构建一堆此类数据结构,则估计值的平均值可能会相当不错。但是,任何一个单独的估计不一定都那么好。

最小计数草图将这个想法牢记在心,并且不仅拥有一个计数器数组,还维护了几个独立的计数器数组,每个计数器都有一个不同的哈希函数,这些函数将项目放入存储桶中。这样可以提供一定程度的冗余,这意味着您不太可能因物品以不良方式碰撞而“不幸”。

要获得其总体估算值,最小计数草图的功能要比将估算值平均在一起要聪明得多。请记住,最小计数草图永远不会低估所存储项目的实际频率,而只会高估它们。这意味着,如果您收集了一组不同的估算值,则估算值越大,则估算的效果越差。为什么?因为估算值越大,除我们关注的项目外,其他项目就越多。 (回想一下存储桶-如果存储桶中除了我们关心的其他项目之外还有很多其他项目,我们就不希望使用该存储桶的大小作为估算值​​。)

这是“最小计数草图”的“最小”部分出现的地方。返回估计时,最小计数草图返回所有生成的估计中的最小估计。这是其中噪声最小的估计。直观地讲,这很可能会给您一个很好的估计-失败的唯一方法是每个估计都不好,这是不太可能的。

这意味着整个数据结构以及对其进行操纵的逻辑非常简单:

Image of a 2D grid representing multiple rows of counters,plus pseudocode summarizing how the structure works.

了解更多信息

还有关于计数分钟草图的更多探索。例如,您如何正式分析最小计数草图以确定每行需要多少个计数器或需要多少个独立的结构?您可以使用哪种哈希函数?要了解有关此内容的更多信息,请查看these lecture slides,其中对该主题进行了详细介绍。

如果您想同时支持增量和减量会怎样?如何使用最小计数草图在数据流中查找最频繁的元素? The original paper on the topic是很好的资源。

在没有随机性的情况下,您可以获得与最小计数草图相同的结果吗? Yes,using some clever number theory.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。