2016-02-19 68 views
-1

我有一個主列表,其中包含8個項目,然後是一些列表,其中包含與主列表相同的項目,但項目以不同的順序出現。如何找到每個列表與主列表之間的百分比相似度?如何計算JavaScript中兩個列表的相似度

例如,主列表可能是:

[8,7,6,5,4,3,2,1];

一個我想它比對可能是列表:

[8,6,4,2,7,5,3,1]

我知道我可以循環遍歷主列表並檢查匹配,但有沒有一種優雅的方法可以計算列表中的每個數字與主列表中的相同數字有多接近?

例如:

位置0: '8' 匹配位置0; 0位置差異(100%) 位置1:'7'匹配位置4; 3位置差異(57.1%) 位置2:'6'匹配位置1; 2個位置差(71.4%)

最終的結果將是在兩個列表之間的百分比相似性。

+0

聽起來你想找到[編輯距離](https://en.wikipedia.org/wiki/Edit_distance)。 – DaoWen

回答

1

你可以使用Array mapreduce功能:

function getSimilaritry(a, b) { 
    return a.map(function(val, index) { 
    //calculate the position offset and divide by the length to get each 
    //values similarity score 
    var posOffset = Math.abs(b.indexOf(val) - index); 
    return posOffset/a.length 
    }).reduce(function(curr, prev) { 
    //divide the current value by the length and subtract from 
    //one to get the contribution to similarity 
    return (1 - curr/a.length) + prev; 
    }); 
} 

如果列表不保證具有相同的價值觀,你將需要添加處理了點。

另請注意,將參數ab傳遞給getSimilarity函數的順序將影響結果。不清楚這是否是您的應用程序的問題。 PS:我認爲你的問題因不包括你已經試圖解決這個問題的代碼而被否決。

相關問題