“距离”或“相似度”可以指这种类型的问题。
正如您所做的那样,简单地计算绝对差的总和应该可以很好地工作。这称为曼哈顿距离。用数学术语来说,它是:.∑<sub>x ∈ (a,b,c,d) Abs(x1 - x2)
尽管最好的衡量标准实际上取决于您想要的行为。
比率可能是一个更好的主意。
考虑类似1000000, 5, 5, 5
vs999995, 5, 5, 5
和1000000, 0, 5, 5
.
根据上面的公式,第一个与第二个和第三个具有相同的相似性。
如果不希望这样做(999995
可以认为非常接近1000000
,而0
可以认为离 很远5
),则在计算每个距离时应除以两者中的最大值。
∑<sub>x ∈ (a,b,c,d) [ Abs(x1 - x2) / max(x1, x2) ]
这会将每个数字置于 0 和 1 之间,这是值之间的百分比差异。
这意味着,对于我们上面的例子,我们会认为1000000, 5, 5, 5
和999995, 5, 5, 5
非常相似(因为上面的总和是|1000000-999995|/1000000 + 0 + 0 + 0 = 0.000005
),并且1000000, 5, 5, 5
和1000000, 0, 5, 5
将被认为更加不同(因为总和是|0+5|/5 + 0 + 0 + 0 = 1
)。
如果可能出现负值,则需要适当更新公式。您需要根据您要解决的问题来决定如何处理它。应该10 to 0
或多或少不同于(或等同于)5 to -5
?
元素是否可以在任何程度上互换?
考虑类似A=1, B=2, C=3, D=4
和A=4, B=1, C=2, D=3
。
虽然每个单独的元素都发生了变化,但集合仍然由每个元素组成,1, 2, 3, 4
并且每个元素仅移动 1 个位置(除了4
)。
对于某些问题,这根本不重要,上面的内容与 from A=1, B=11, C=21, D=31
to没有什么不同A=2, B=12, C=22, D=32
。对于其他问题,它可能非常相关。
对于像 string 或 array 这样的序列,插入、删除或移动元素的想法可能是有意义的。如果是这样,你会想看看编辑距离,其中一个常见的就是Levenshtein distance。您可能还想考虑修改它以考虑单个值有多少差异(但这不是微不足道的)。
对于像 set之类的东西,元素是可以互换的,但元素上并没有严格的顺序({1, 2, 3}
与 相同{3, 1, 2}
)。如果是这种情况,最简单的可能是对值进行排序并仅使用编辑距离。您还可以通过某种方式同时循环遍历两者,这样您就可以更轻松地考虑值之间的差异。