Fagin算法和Threshold算法都是Top-K排序領域的經典算法(K代表只要對前K個值排序值),不同于傳統Top-k對一維數組前K個值排序,Fargin和Threshhold算法適用于參考多個排序指標時對前k個物品排序。
**舉例 **
你想買個手機,問了兩個對電子產品比較在行的朋友,朋友1給出了這份推薦列表:
而朋友2卻給了這份推薦列表:
假如你對兩個朋友都同樣信任,你該聽誰的建議呢?
方法1--平均兩個列表的推薦指數
根據原來兩個推薦列表每項的推薦指數,重新生成一個列表,新列表的每項參考原來列表的值來重新計算;譬如:
V(iphone 5s)=(V1(iphone 5s)+V2(iphone 5s))/2=(10+7)/2=8.5
V(小米3)=(V1(小米3)+V2(小米3))/2=(9+9)/2=9
...............
然后每個型號來比較,這種方法簡單暴力,感覺上不高效,因為你只要買一個手機,卻要把每個手機權重都計算出來;感覺上只要每個列表比較前面幾個就夠了,但具體要比較幾個呢?卻又說不清,這時候就該的Fagin和Threshold算法出馬了!
Fagin算法
1.兩個列表都選擇各自的第一行的某項,生成新列表
2.兩個列表再取第二行的每項,放到新列表中
3.兩個列表再取第三行的每項,放到新列表中
........
(直到新列表有一項的值在原先兩個列表都取到過;可以看到其實第二步就可以停了,因為新列表的小米3的兩個值都取到了)
4.補全每項在其他列表中的值
5.就從已獲取項里找最推薦的手機,列表其他值沒必要看了
所以小米3是最值得入手的!
疑問1:這里總共只取了三個手機來作比較,原先兩個列表其他項都沒再比較,真的就可以了?
回答:當小米3從原先兩個列表都取到了值,這說明原先兩個列表再也找不到一個手機品牌推薦指數能比小米3再高了(因為如果有,它至少在原先某個推薦列表排名比小米3高,會已經出現在新列表中了)
疑問2:小米是第一個原先兩個列表都獲取到值的,所以平均分最高?
回答:就算小米3首先"出線",也不能說小米3是最值得入手的,還需要把iphone 5s和Find 7在其他列表的推薦指數也找出來,將三個一一比較才能知道最后鹿死誰手~(當然第5步比較了發現還是小米3高)
Threshold算法
1.兩個列表都選擇各自的第一行的項,生成新列表(這一步和Fargin算法相同)
2.算出兩列表取出的第一行的平均值
(V(iphone 5s)+V(小米3))/2=(10+9)/2=9.5
3.補全每項在其他列表中的值
4.看新列表的各手機推薦指數平均值是否大于第2步算出的9.5
8.5和9都比9.5小,重復1~4步
5.兩個列表都選擇各自的第二行的項,添加到新列表
6.算出兩列表取出的第二行的平均值
(V(小米3)+V(Find7))/2=(9+8)/2=8.5
7.補全每項在其他列表中的值
4.看新列表的各手機推薦指數平均值是否大于第6步算出的8.5
這一步可以看出iphone 5s和小米3都已經大于(等于)第6步算出的8.5,因而沒必要再找了(原先兩列表剩下的各項最大平均分也不會超過8.5);對比ihone 5s和小米3的平均分,還是選擇了小米3.
最后
以上例子雖然只是K=1簡單情況下的比較,但Fagin和Threshold算法的基本原理也就大體這樣,想要準確而全面了解Fagin和Threshold算法的同學可以看嚴(rong)謹(chang)的論文Optimal aggregation algorithms for middleware.