Java 算法:如何检查两个集合是否不';t冲突

Java 算法:如何检查两个集合是否不';t冲突,java,algorithm,data-structures,set,Java,Algorithm,Data Structures,Set,编写一个函数: 输入:两组,一组反映相等关系,如{A=B,B=C},另一组反映不相等关系,如{A!=C} 输出:检查两个集合是否冲突,返回布尔类型 public boolean isConflict(List<String> equalRelation, List<String> notEqualRelation) { //...... } public boolean冲突(列表相等关系、列表注释相等关系){ //...... } 根据数据创建一个图形。每个变量

编写一个函数:

输入:两组,一组反映相等关系,如
{A=B,B=C}
,另一组反映不相等关系,如
{A!=C}

输出:检查两个集合是否冲突,返回布尔类型

public boolean isConflict(List<String> equalRelation, List<String> notEqualRelation) {
    //......
}
public boolean冲突(列表相等关系、列表注释相等关系){
//......
}

根据数据创建一个图形。每个变量都是一个节点,每个
equal
都是相应节点之间的无向边。之后,每个连接的组件表示其所有节点之间的相等。要查找矛盾,只需检查
不相等关系中的两个节点是否位于同一组件中。如果是这样,这就是矛盾


您可以使用
dfs
bfs
查找连接的组件。但是,如果您的数据是动态的,则最好使用数据结构。

您已经完成了一半的工作:

  • 您的set-equal-relationship=>将其保持为set>,对于not-equal-relationship,保持相同的内容
  • 创建一组相等的实体,如映射:any symbol=>reduced symbol equals。例如:A=B给你,如果AA(隐式),B=>A,如果A=>C,那么B=>C。你必须再迭代一次以减少所有内容。这样,您就可以将每个相等的符号映射到一个唯一的符号(在我的示例中是最小的)
  • 最后,遍历一组非相等项,检查每一对(X,Y)=>是否减少(X)=减少(Y),这意味着X=Y:这里存在冲突
如果您想保持配对,请使用此选项,由以下人员提供:

公共类对实现java.io.Serializable{
二等兵,我走了;
私权;
公共对(左左,右){
this.left=左;
这个。右=右;
}
public L getLeft(){return left;}
public R getRight(){return right;}
@凌驾
public int hashCode(){返回left.hashCode()^right.hashCode();}
@凌驾
公共布尔等于(对象o){
如果(o==null)返回false;
如果(!(o instanceof Pair))返回false;
对pairo=(对)o;
返回this.left.equals(pairo.getLeft())&&
this.right.equals(pairo.getRight());
}
}

Vogel612非常正确。基本算法是:完成等式关系,然后测试列表中的每个不等式,看看是否有冲突。然而,通常不会对不等式进行任何补全

我会提到等价是可传递的(a=b=c意味着a=c),但不等式不是(1)≠ 1+1和2≠ 1,但1+1=2)。虽然两者都是对称的(如果a=b,b=a),但等价性也是自反的(每个元素本身必须相等)

要使用的确切数据结构可能取决于我们是否事先有所有元素的列表,有多少元素,以及关系的真值表可能有多稀疏。如果将真值表存储为二维数组所需的内存量合理,我们可以这样做。Vogel612将表存储为行集合的方法,每一行包含与其索引等效的元素集,是一种很好的存储真理表的方法,该真理表只包含几个元素,每个元素都等效。(如果保证每一行本身至少包含一个元素,那么这应该成为一个数组或
arrayList
)另一种方法是对元素名称创建任意的总排序,例如我们将它们添加到
arrayList
的顺序、它们名称的哈希值或字典排序。此顺序与这些元素的值或提供的相等关系无关,但可用于将每一对放入标准形式。也就是说,当我们比较它们的名称时,我们的元素被列为a、b、c和ahashSet
),这样在这个顺序中“a”在“b”之前,并且它们的内容是相等的,让a=a、b=b和b=a的事实是隐式的。当很少有其他元素对是等效的时,这将是有效的。还有一些不在标准库中


无论如何,你总是想要x≠ 失败,并以存储元组的相同规范形式查找元组。

是否编写了一些代码来将其形式化?或者你能精确地说出你的要求吗?只有相等吗,及物性,还有什么?欢迎收看Stackoverflow。我建议你在问问题之前先打个电话。你会发现SO不是一个做作业的服务,对不起。@skypjack这不是一个作业,而是一个面试问题,我没有solve@jyuan嗯,你还会发现,SO不是解决面试问题的服务这是一道相对简单的数学题。您需要将集合中的元素视为元组。从这两个集合中,您可以得出结论,因为所描述的关系是可传递的。这基本上是一个检查,你完成了集(因为他们显然不完整),然后相交的元组。。。这里的基础是等价类,基本上是来自M²->B的函数
public class Pair<L,R> implements java.io.Serializable  {

  private final L left;
  private final R right;

  public Pair(L left, R right) {
    this.left = left;
    this.right = right;
  }

  public L getLeft() { return left; }
  public R getRight() { return right; }

  @Override
  public int hashCode() { return left.hashCode() ^ right.hashCode(); }

  @Override
  public boolean equals(Object o) {
    if (o == null) return false;
    if (!(o instanceof Pair)) return false;
    Pair pairo = (Pair) o;
    return this.left.equals(pairo.getLeft()) &&
           this.right.equals(pairo.getRight());
  }

}