这是一个相当简单的问题,但我不记得我的所有编码和数据结构,感觉有点空白。
假设我有一个列表/数组(例如结构或对象)。需要在所有这些对象之间保持某种属性(真或假)。检查任何一对对象之间是否违反该属性的最快方法是什么?
答案 0 :(得分:4)
除非您有关于该属性的其他信息(例如,它是可传递的),否则您唯一的解决方案是使用两个嵌套循环检查列表中每对的属性:
for (int i = 0 ; i != N ; i++)
for (int j = 0 ; j != N ; j++)
if (i != j) // This assumes that the property might not be reflexive
// This will check the property both ways, i.e.
// there is no implication that the property is commutative.
checkProperty(list[i], list[j]);
对于交换属性(即当A ? B
暗示B ? A
时),您可以通过在j = i+1
开始第二个循环来完成一半的比较
如果属性具有传递性(即当A ? B
和B ? C
暗示A ? C
,其中?
表示属性检查),则可以构建更快的检查。
答案 1 :(得分:0)
您需要一个双循环来比较每个项目。假设您只需要检查每个2项组合(即顺序无关紧要),您可以循环遍历内循环中的其余项。
for (int i = 0 ; i < N ; i++)
for (int j = i+1 ; j < N ; j++)
checkProperty(list[i], list[j]);