我正在寻找以下问题的有效解决方案:
给出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)
任何可以在此问题中使用的已知算法?
答案 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)而不计算它,所以你必须为每一对计算它...