计算2个整数列表的增量

时间:2014-08-07 10:54:59

标签: algorithm

我有2张地图:map1和map2。 其中字符串是键,值是该键的出现次数。

我想比较地图之间的'delta',即。我想知道一张桌子与另一张桌子有多远,但我不确定计算这种差异的正确函数是什么。

例如:

MAP1: ABBA 100 美国10

MAP2: ABBA 300 美国210

地图1和2中ABBA之间出现的差异是200,以及地图1和2中美国之间出现的差异,但显然不同于10/210 <&lt; 100/300。 所以它无法帮助我对绝对差异做一个平均值。

另一方面,使用除法也不对,因为0/100 == 0/1000。 我知道我需要结合两种方法,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

如果您将地图视为向量,则在数学意义上,您可以通过减去匹配元素来计算所有常用距离(度量)。

假设你想要Manhattan (L1) distance。这是两个向量中匹配元素之间绝对差异的总和:

d = 0
for key in map1:
    if key in map2:
        d += abs(map1[key] - map2[key])
    else:
        d += abs(map1[key])  # implicit zero in the other map

for key in map2:
    if key not in map1:
        d += abs(map2[key])

同样,你可以计算Euclidean distance,它是平方差之和的平方根:

d = 0
for key in map1:
    for key in map2:
        d += (map1[key] - map2[key]) ^ 2
    else:
        d += map2[key] ^ 2

for key in map2:
    if key not in map1:
        d += abs(map2[key])

d = sqrt(d)

如果地图查找为O(1),则可以在线性时间内计算这两个,因此可以有许多其他距离。