假设两组(无序,无重复元素):
A = set(["z", "x", "c"])
B = set(["x", "z", "d", "e"])
这些集合有两个共同的元素:“z”和“x”,以及一些特定于集合的元素:c、d、e。
你怎么能给每组一个分数,就像字符串距离一样,而
- 不考虑元素的顺序和
- 对每个孤立集施加无重复约束
?
正如您在示例中看到的,每组的大小可以不同。
该算法的非关键要求是:
- 如果可能,插入 > 删除(缺少元素的集合意味着成本高于具有太多元素的集合),或者只是 INS = DEL
- 交换:0(无成本,因为排序对距离没有影响)
现在我一直在计算一个设定的距离分数:
score_A = len(common(a,b)) / len(a) # common(...) calculates intersection
score_B = len(common(a,b)) / len(b)
quadratic_score = sqrt(score_A * score_B)
你会如何建议解决这个问题或改进我的解决方案?
有没有允许指定成本的算法?
现在我要为集合修改定义一个简单的代数:
def calculate_distance( a, b, insertion_cost=1, deletion_cost=1 ):
"""
Virtually, a programmer-friendly set-minus.
@return the distance from A to B, mind that this is not
a commutative operation.
"""
score = 0
for e in a:
if e not in b: # implies deletion from A
score += deletion_cost
for e in b:
if e not in a: # implies insertion into A
score += insertion_cost
return score
我怎样才能规范这个值和反对什么?