有效比较项的算法是成对列表

时间:2017-04-11 07:39:53

标签: algorithm

我正在寻找以下问题的有效解决方案:

给出1个列表L,每个列表包含对象R。

L = [R1, R2, R3, .., Rn]

对象R可以相似或不相似。这是确定的 通过函数is_similar(R1,R2)返回True,如果它们是 类似,否则就是假。

天真的方法是比较

R1-R2, R1-R3, ..., R1-Rn
R2-R3, R2-R4, ..., R2-Rn
...

我想指出那个

if is_similar(R1, R2) and is_similar(R2, R3)
then is_similar(R1, R3) <=> True
but if is_similar(R1, R2) <=> is_similar(R2, R1)

任何可以在此问题中使用的已知算法?

2 个答案:

答案 0 :(得分:3)

你可以做的元素对之间有n(n-1)/ 2种可能的比较。

假设您已经执行了所有这些比较中的所有比较,并且到目前为止的所有比较都是错误的 - 单个未经测试的元素对可能仍然相似或不相同。

这表明在最坏的情况下,需要检查每个可能的元素对是否相等,因此没有o(n ^ 2)算法。

总的来说,你可以比比较每对元素做得更好。维护到目前为止找到的等价类列表,并仅将新元素与每个元素的代表进行比较。

Python中的类似内容:

E = []
for i in items:
    for e in E:
        if is_similar(i, e[0]):
            e.append(i)
            break
    else:
        E.append([i])

执行此代码后,E将包含项目的等价类列表。

答案 1 :(得分:0)

天真算法的比较次数为(n-1)+(n-2)+...+1 = O(n^2)。你不能做得更好,因为没有传递性或排序,你无法预测is_similar(Ri,Rj)而不计算它,所以你必须为每一对计算它...

相关问题