[英]Algorithm to efficient compare items is a list pairwise
我正在尋找以下問題的有效解決方案:
給定1個列表L,每個列表包含對象R.
L = [R1, R2, R3, .., Rn]
對象R可以相似或不相似。 這由函數is_similar(R1,R2)確定,如果它們相似則返回True,否則返回False。
天真的方法是比較
R1-R2, R1-R3, ..., R1-Rn
R2-R3, R2-R4, ..., R2-Rn
...
我想指出這一點
if is_similar(R1, R2) and is_similar(R2, R3)
then is_similar(R1, R3) <=> True
but if is_similar(R1, R2) <=> is_similar(R2, R1)
任何可以在這個問題中使用的已知算法?
你可以做的元素對之間有n(n-1)/ 2種可能的比較。
假設您執行了除了其中一個比較之外的所有比較,並且到目前為止的所有比較都是錯誤的 - 單個未經測試的元素對可能仍然相似或不相似。
這表明在最壞的情況下,需要檢查每個可能的元素對是否相等,因此沒有o(n ^ 2)算法。
但總的來說,你可以比比較每對元素做得更好。 維護到目前為止找到的等價類列表,並僅將新元素與每個元素的代表進行比較。
Python中的這樣的東西:
E = []
for i in items:
for e in E:
if is_similar(i, e[0]):
e.append(i)
break
else:
E.append([i])
執行此代碼后, E
將包含項目的等價類列表。
朴素算法在比較次數中是(n-1)+(n-2)+...+1 = O(n^2)
。 你不能做得更好,因為沒有傳遞性或排序,你無法預測is_similar(Ri,Rj)而不計算它,所以你必須為每一對計算它...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.