下面我们讨论如何计算独立元素数目。
一、问题定义
如果一个数据流,其中m为数据流的大小,
。我们可以定义每个元素
出现的次数为,其中
为第i个元素出现的次数。假设
,容易得知d为在
数据流中出现的不同元素数目,也就是独立元素数目。
对于这个问题,可以在内存中使用高效的搜索结构(比如平衡BST等)保留当前已经出现的元素。但是如果元素数目实在太
多以致搜索结构无法访问内存时,我们可以使用更多的机器或者将数据结构的一部分放入到外存中。
上述做法是计算流中独立元素的精确解。如果我们仅仅需要对独立元素数目进行估计,则方法要简单的多,空间消耗也很少
(一般确定性算法空间复杂度需要)。
二、具体算法
通过将流中元素哈希到一个足够长的位串,就可以实现独立元素数目的估计。这里要求哈希函数属于2-universal hash family。要求位串必须要足够长,以致哈希函数的可能结果数目要远大于流中独立元素个数。如果在流中看到的不同元素越多,我们看到的不同哈希值也就越多。对于一个元素哈希后的结果p,我们定义zero(p)为p的二进制表示尾部中连续0的个数。也就是如下定义: