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给你,如果A
A(隐式),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());
}
}