算法:如何检查两组是否不冲突

时间:2015-12-05 23:12:41

标签: java algorithm data-structures set

写一个函数:

输入:两组,一组反映平等关系,如->make(true);,另一组反映不平等关系,如{A = B, B = C}

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

{A != C}

3 个答案:

答案 0 :(得分:0)

根据您的数据创建图表。每个变量都是一个节点,每个equal是相应节点之间的无向边。之后,每个连接的组件表示其所有节点之间的相等性。为了找到矛盾,您可以简单地检查not equal关系中的两个节点是否在同一个组件中。如果这是一个矛盾。

您可以使用dfsbfs查找已连接的组件。但如果您的数据是动态的,最好使用disjoint-set数据结构。

答案 1 :(得分:0)

你完成了一半的工作:

  • 你的一套平等关系=>保持它像Set<对<字符串,字符串> > ,对于不平等的关系也是一样的
  • 创建一组相等的实体,如Map:any symbol =>减少符号等于。例如:如果A A(隐式),B => A,并且如果A => C,则B => C.你必须再次迭代以减少一切。使用它,您将每个相等的符号映射到唯一的符号(在我的示例中最少);
  • 最后,遍历你的非等号组,并检查每对(X,Y)=>减少(X)=减少(Y),这意味着X = Y:那里有冲突

如果您想保留Pair<>,请使用此功能,礼貌: A Java collection of value pairs? (tuples?)

/Users/[name]/anaconda/bin/

答案 2 :(得分:0)

Vogel612非常合适。基本算法是:完成相等关系,然后测试列表中的每个不等式,看是否有任何冲突。但是,你通常不会对不平等做任何完成。

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

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

在任何情况下,您总是希望x≠x失败,并以您存储它们的相同规范形式查找元组。