我想基于共享值的数量在Ruby中找到两个序列的相似性。值的顺序位置应该是无关紧要的。什么也应该是无关紧要的是一个序列是否具有另一个序列不具有的任何值。我建议使用Levenshtein距离,但它会计算使序列相同所需的编辑次数。这是一个关于缺陷存在的简单例子:
[1,2,3,4,5]
[2,3,4,5,6,7,8,9]
#Lev distance is 5
[1,2,3,4,5]
[6,7,8,9,10]
#Lev distance is 5
在一个完美的世界中,第一组与第二组相比具有更大的相似性。原始的,显而易见的解决方案是使用嵌套循环来检查第一个序列的每个值与第二个序列的每个值。有更有效的方法吗?
答案 0 :(得分:4)
您可以使用&
像这样对一对数组进行交集:
a = [1,2,3,4,5]
b = [2,3,4,5,6,7,8,9]
common = a & b # => [2, 3, 4, 5]
common.size # => 4
这是你在找什么?
答案 1 :(得分:0)
如果对序列进行排序(或者对它们进行排序),您所要做的就是向下走两个列表,递增相似性计数器并在两个值匹配时弹出它们。如果它们不匹配,则弹出较小的值,然后继续,直到一个列表为空。其复杂性为排序的O(n log n)加上步行的O(n),其中n是两个列表的长度之和。
您还可以遍历每个列表,计算每个数字的发生率(因此您最终会得到每个值的计数列表)。然后你可以比较这些数量,将相似度计数器增加每个值的较小计数。