我有一个包含8个项目的主列表,然后是一些列表,其中包含与主列表相同的项目,但项目以不同的顺序显示。如何在每个列表与主列表之间找到百分比相似度?
例如,主列表可能是:
[8,7,6,5,4,3,2,1];
我想与之比较的一个列表可能是:
[8,6,4,2,7,5,3,1];
我知道我可以循环浏览主列表并检查匹配项,但有没有一种优雅的方法来计算列表中每个数字与主列表中相同数字的接近程度?
例如:
位置0:位置0的'8'匹配; 0个职位差异(100%) 位置1:位置4的'7'匹配; 3个职位差异(57.1%) 位置2:位置1的'6'匹配; 2个职位差异(71.4%)
等
最终结果将是两个列表之间的百分比相似度。
答案 0 :(得分:1)
您可以使用数组map
和reduce
函数:
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;
});
}
如果不保证列表具有相同的值,则需要为其添加处理。
另请注意,将参数a
和b
传递给getSimilarity
函数的顺序会影响结果。不清楚这是否适合您的申请。