介紹乙個新的資料結構「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 時的目錄是有技巧的,特別是處在乙...