如何在Java中实现等价类?

时间:2013-02-17 21:50:26

标签: java equivalence

在Java中实现等价类的简单方法是什么?那个目的有没有图书馆?

困扰的部分是如何编写一个高效且非天真的“平等”运算符。

S = {x,y,z,w,h}。如果我们对S的等价类使用映射x->1, y->1, z->1, w->2, h->2,则必须将映射x->10, y->10, z->10, w->20, h->20视为相同的等价类。

当集合S的基数变大时,天真的“相等”运算符会很快变得耗时。

简单的方法是什么?任何的想法?

[编辑]澄清一下,具体问题可以形式化如下:

设S为非空集。我们用M表示从V到整数的一组部分映射。相对容易证明下面定义的二元关系\ sim在M上导出等价关系

对于m1和m2两个部分映射M,m1 \ sim m2当且仅当,

  1. 对于任何一个V,当且仅当m2(a)被定义时才定义m1(a)
  2. 对于任何a,b的V,m1(a)和m1(b)都定义为相同     当且仅当m2(a)和m2(b)都被定义时,整数值'z1'     相同的整数值'z2'(可能与也可能不同     'Z1')

    实施例。

    a-> 9,b-> 9,w-> 1 \ sim a-> 10,b-> 10,w-> 0

    正确无法说出

    a-> 5 \ sim b-> 9

  3. 感谢。

3 个答案:

答案 0 :(得分:2)

根据我对你的问题的理解,你可以找到一个集合的最大公约数(Euclid算法递归),然后用它来映射商数 - 如果它们与另一个集合完全相等则不相同。这仅在集合大小和映射相同时才有效。

答案 1 :(得分:2)

如果我理解你是正确的,你可以应用矢量标准化。例如,通过将所有其分量与矢量长度分开,将3d矢量归一化为长度1。如果两个归一化向量的分量相等,则它们的原始(非归一化)向量指向相同的方向(我认为你定义为'相等')

x,y,z,w,h在你的情况下是一个5维向量。当表演朝同一方向时,它们属于同一类,但可能具有任意长度。

答案 2 :(得分:0)

除此之外:我假设集合S实际上是你定义中的集合V.

我认为Uli是在正确的轨道上,虽然我不会假设Set(Set(E))。equals()对你的目的是有效的。 (对不起,我无法得到lt或gt符号)

Set(E).equals()的默认实现可能是O(n log n)或O(n ^ 2)。 Set(E).equals()几乎肯定涉及排序; O(n log n)和它一样好。我建议你看看基数排序。它是O(n * log n),但增长非常缓慢。