一種快速求集合交集個數上限的方法

2021-08-11 20:48:38 字數 3134 閱讀 7635

介紹乙個新的資料結構「cardinality filter」來快速計算一組交集的大小上限。且期望的時間複雜度為o(|a

|+|b

|w),其中w表示位元組大小。

很多時候我們求交集並不在意交集的元素是什麼,而是在意交集的個數是多少,比如在文字挖掘的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就是將原有的a,b集合在x的定義域中通過某種對映方法對映成φ(a)和φ(b),將 |a ∩ b| 問題轉為 |φ(a) ∩ φ(b)|。

cardinality filters有兩種實現,single cardinality filter(scf)和 recursive cardinality filter(rcf)。

scf定義φ(a) = ( h(a), c(a) )

其中h(a)表示hash後的值,而c(a)表示hash衝突裡面非最小的值。注意這裡h(a)是乙個長度為⌈ |x| / n ⌉ 的bit序列,c(a)為int陣列。下面用個例子來說明。

如圖n=3,hash到[0,4]。

a集合裡有元素,通過hash分別對映到,顯然發生了衝突,即2(7,10),4(12,14),故按照定義,這裡h(a)=,φ(a)=。

同樣的在b集合裡有元素,通過相同的hash分別對映到,這裡的衝突為1(0,11),2(2,7,10),4(3,14),所以這裡h(b)=,φ(a)=。

故這裡 |φ(a) ∩ φ(b)|= |h(a) ∩ h(b)| + |c(a) ∩ c(b)| = 3 + 2 = 5 。

而 |a ∩ b| = 3 , 故 φ(a) ∩ φ(b) 符合 a ∩ b 的上限。

直觀上,之所以φ(a) ∩ φ(b)會是a ∩ b的上限,有如下兩點:

下面給出scf的嚴格定義:

設x為全域(a, b ⊂ x),設h為hash值空間 h=。

有 φ: 2x

−>(2

h,2x

) : φ(a) = (h(a), c(a)) (a ⊂ x)

其中 h(a) = ,值域為.

c(a) = 。

得:|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或者二分。

recursive意為遞迴,故rcf顧名思義就是遞迴版本的scf,遞迴的地方就是c(a),在scf中我們可以得到 (h1

(a), c1

(a)),這裡我們繼續對得到的c1(a)應用scf,則可以得到(h2

(a), c2

(a)),繼續遞迴下去….

定義遞迴層次為l,這樣就可以得到 (h1

(a), c1

(a)), (h2

(a),c2

(a))… (hl

(a),cl

(a))

所求集合上限則為: |φ

下面給出rcf的嚴格定義:

對於l層遞迴,有: φ(

a)=(

h1(a

),h2

(a),

...,

hl(a

),cl

(a))

,其中 hi

(a)=

hi(c

i−1(

ci−2

(...

c1(a

)...

))) , ci

(a)=

ci(c

i−1(

...c

1(a)

...)

) , for i = 1, 2, … , l.φ(

a)∩φ

(b)=

(h1(

a)∩h

1(b)

,h2(

a)∩h

2(b)

...,

hl(a

)∩hl

(b),

cl(a

)∩cl

(b))

|φ(a)|=

∑li=

1|hi

(a)|

+|cl

(a)|

**《faster upper bounding of intersection sizes》,文中部分結論證明見**。

一種快速求fibonacci第n個數的演算法

利用動態規則的思路,摒棄傳統的遞迴做法,可以得到一種快速的求fibonacci第n個數的演算法 求第n 從1開始 位fibonacci數 fibonacci數列前兩位為0,1.後面每一位數字等於前兩位數字之和 def fibonacci n if n 2 return n 1f 0 g 1 whil...

一種快速求組合數的方法

介紹一種快速求 dbinom 的方法。其實就是根據定義來做的做法 我們知道 dbinom mod 1e9 7 frac mod 1e9 7 為方便表達,我們設 x n times n 1 times dots times n m 1 即右邊的分子 y 1 times 2 times dots tim...

linux環境下的一種退出後快速返回的方法

在做專案開發的時候,shell 環境是很重要的,一旦汙染了環境 如,改變了某個關鍵路徑,或修改了配置指令碼,就需要校正,一般的做法就是 exit 當前環境,重新登入,再 source 環境重來。重新利用source 來設定環境這些都是必須的,如何返回到退出 exit 時的目錄是有技巧的,特別是處在乙...