一种快速求集合交集个数上限的方法

简介动机Cardinality FiltersSCF - Single Cardinality FilterSCF的几点性质RCF - Recursive Cardinality FilterRCF的几点性质参考资料简介介绍一个新的数据结构“Cardinality Filter”来快速计算一组交集的大小上限。且期望的时间复杂度为O(|A|+|B|w\frac{|A| + |B|}{w}
摘要由CSDN通过智能技术生成

简介

介绍一个新的数据结构“Cardinality Filter”来快速计算一组交集的大小上限。且期望的时间复杂度为O( |A|+|B|w ),其中w表示字节大小。

动机

很多时候我们求交集并不在意交集的元素是什么,而是在意交集的个数是多少,比如在文本挖掘的top-k查询处理。
top-k示例

在上图中,有多个文档(如”DOOR”,”DRIVING”等),给定一个查询(可能是一个文档,也可能是一串单词集合),求与它交集最多的前K个文档。显然在这里我们并不关注每个文档与它的交集元素是什么,而是关注每个文档与它的交集个数是多少。因此可以应用本文介绍的“Cardinality Filter”方法来加速top-k查询问题。

在该问题中,假设A为某个文档,B为查询文档,threshold为第K大的交集个数,则问题则变为求 |A ∩ B| > threshold,但实际上绝大多数|A ∩ B| ≪ threshold,在测试中有多达80% |A ∩ B| < 0.05 × threshold。
因此我们可以利用求出|A ∩ B|的上限来加速这个问题,即|A ∩ B| ≦ Upper bound of |A ∩ B| ≦ threshold。这样子我们将跳过绝大数的|A ∩ B|的确切计算。

Cardinality Filters

CFs

所谓的Cardinality Filters就是将原有的A,B集合在X的定义域中通过某种映射方法映射成Φ(A)和Φ(B),将 |A ∩ B| 问题转为 |Φ(A) ∩ Φ(B)|。
Cardinality Filters有两种实现,Single Cardinality Filter(SCF)和 Recursive Cardinality Filter(RCF)。

SCF - Single Cardinality Filter

SCF定义Φ(A) = ( h(A), c(A) )
其中h(A)表示hash后的值,而c(A)表示hash冲突里面非最小的值。注意这里h(A)是一个长度为⌈ |X| / N ⌉ 的bit序列,c(A)为int数组。下面用个例子来说明。
SCF示例

如图N=3,hash到[0,4]。
A集合里有元素{7,8,10,12,14},通过hash分别映射到{2,0,2,4,4},显然发生了冲突,即2(7,10),4(12,14),故按照定义,这里h(A)={0,2,4},Φ(A)={10,14}。
同样的在B集合里有元素{0,2,3,5,7,10,11,14},通过相同的hash分别映射到{1,2,4,0,2,2,1,4},这里的冲突为1(0,11),2(2,7,10),4(3,14),所以这里h(B)={0,1,2,4},Φ(A)={7,10,11,14}。
故这里 |Φ(A) ∩ Φ(B)|= |h(A) ∩ h(B)| + |c(A) ∩ c(B)| = 3 + 2 = 5 。
而 |A ∩ B| = 3 , 故 Φ(A) ∩ Φ(B) 符合 A ∩ B 的上限。

直观上,之所以Φ(A) ∩ Φ(B)会是A ∩ B的上限,有如下两点:

  • 当不同的元素hash到同一值且未值上最小时(如图A中的8和B中的5都被hash到0),交集会额外多算;
  • 图中14被重复计算了2次,|h(A) ∩h(B)| 和 |c(A) ∩ c(B)| 都加了一次。

下面给出SCF的严格定义:
设X为全域(A, B ⊂ X),设H为hash值空间 H={ 0, 1,…,N, ⌈ |X| / N ⌉ - 1}。
有 Φ: 2X>(2H,2X) : Φ(A) = (h(A), c(A)) (A ⊂ X)
其中 h(A) = { h(x) | x ∈ A },值域为{0, ⌈ |X| / N ⌉ - 1 }.
c(A) = { y∈A | (∃x∈A) (h(x) = h(y), x < y) }。
得: |A∩B| ≦ |Φ(A)∩Φ(B)| := |h(A)∩h(B)| + |c(A)∩c(B)|

其中 |h(A)∩h(B)|的计算可以通过Bit-wise AND操作(hash后为bit序列),而|c(A)∩c(B)|的计算可以通过简单的方法来计算,如linear merge algorithm或者hash或者二分。

SCF的几点性质

  • 对于任意 A, B ⊆ X, |A ∩ B| ≤ |Φ(A) ∩Φ(B)|.

    证明:
    |A ∩ B| = |A ∩ B ∩ c(A) ∩ c(B)| + |(A ∩ B) \ (c(A) ∩ c(B))|,
    |Φ(A) ∩ Φ(B)| = |c(A) ∩ c(B)| + |h(A) ∩ h(B)|.
    所以要证 |A ∩ B| ≤ |Φ(A) ∩Φ(B)| 等价于证明:
    |A ∩ B ∩ c(A) ∩ c(B)| + |(A ∩ B) \ (c(A) ∩ c(B))| < |c(A) ∩ c(B)| + |h(A) ∩ h(B)|.
    显然有 |A ∩ B ∩ c(A) ∩ c(B)| ≤ |c(A) ∩ c(B)|,
    因此现在只需证明 |(A ∩ B) \ (c(A) ∩ c(B))| < |h(A) ∩ h(B)|.
    x ∈ (A ∩ B) \ (c(A) ∩ c(B))
    ⇒ x ∈ A ∧ x ∈ B
    ⇒ h(x) ∈ h(A) ∧ h(x) ∈ h(B)
    ⇒ h(x) ∈ h(A) ∩ h(B).
    且假设x < y 且 y c(A) ∩ c(B), 所以 y c(A) 或者 y c(B).
    若 y c(A),说明y是在hash(y)里最小的数,即不存在z ∈ A,使得 z < y and h(z) = h(y).
    若 y c(B),同理,则不存在z ∈ B, 使得 z < y and h(z) = h(y).
    因此,在 (A ∩ B) \ (c(A) ∩ c(B))里的任意两数x,y, 有 h(x) h(y).
    通过上述分析,对于 x ∈ (A ∩ B) \ (c(A) ∩ c(B)),都有唯一值h(x)与之对应,即说明了 |(A ∩ B) \ (c(A) ∩ c(B))| = |h((A ∩ B) \ (c(A) ∩ c(B)))|,
    而又有且 h(x) ∈ h(A) ∩ h(B), 所以h符合内射性(injectivity),固 h( (A ∩ B) \ (c(A) ∩ c(B)) )是 h(A) ∩ h(B)的子集。
    所以, | h( (A ∩ B) \ (c(A) ∩ c(B)) ) | |h(A) ∩ h(B)|
    所以, | (A ∩ B) \ (c(A) ∩ c(B)) | | h(A) ∩ h(B)|.
    而 |A ∩ B ∩ c(A) ∩ c(B)| ≤ |c(A) ∩ c(B)|, 得出结论:
    |(A ∩ B)| = |A ∩ B ∩ c(A) ∩ c(B)| + |(A ∩ B) \ (c(A) ∩ c(B))|
    |c(A) ∩ c(B)| + |h(A) ∩ h(B)| = |Φ(A) ∩Φ(B)|. 得证。

  • c(A)的期望size最多为 : N|A|22|X|

    证明:
    令 β 是对应于h(A)的比特数组,其长度为|H| = ⌈|X|/N⌉。
    hash函数将任意数x hash到任意bit位上的概率为 1|H|
    某一位bit上没有数的概率为: (11|H|)|A|
    因此 β 上bit上的有效位数为: |H|(1(11|H|)|A|)
    所以c(A)的期望size为:
    |A| − |h(A)|
    =|A|

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值