簡體   English   中英

有效比較項的算法是成對列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM