如何在Java中实现等价类?

如何在Java中实现等价类?,java,equivalence,Java,Equivalence,在Java中实现等价类的简单方法是什么?有专门的图书馆吗 麻烦的部分是如何编写一个高效且不幼稚的“equal”操作符 设S={x,y,z,w,h}。如果使用映射<代码>x>1,y>1,z>1,w>2,h>2</代码>S的等价类,则必须考虑映射 x>10,Y->10,Z->10,W->20,H-> 20 < /C>作为相同的等价类。< /P> 当集合S的基数变大时,简单的“equal”运算符可能会很快变得耗时 简单的方法是什么?有什么想法吗 [编辑]为了澄清,具体问题可以形式化如下: 让我们成为一

在Java中实现等价类的简单方法是什么?有专门的图书馆吗

麻烦的部分是如何编写一个高效且不幼稚的“equal”操作符

S={x,y,z,w,h}
。如果使用映射<代码>x>1,y>1,z>1,w>2,h>2</代码>S的等价类,则必须考虑映射<代码> x>10,Y->10,Z->10,W->20,H-> 20 < /C>作为相同的等价类。< /P> 当集合S的基数变大时,简单的“equal”运算符可能会很快变得耗时

简单的方法是什么?有什么想法吗

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

让我们成为一个非空集合。我们用M表示一组从V到整数的部分映射。相对容易证明,下面定义的二进制关系\sim在M上派生出等价关系

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

  • 对于V的任何a,定义m1(a)的充要条件是定义了m2(a)
  • 对于V的任何a、b,m1(a)和m1(b)都被定义为相同的 整数值“z1”当且仅当m2(a)和m2(b)都已定义 同一整数值“z2”(可能不同于也可能不同于 ‘z1’)

    例如

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

    但这样说是不对的

    a->5\sim卡b->9


  • 谢谢

    根据我对你的问题的理解,你可以找到一个集合的最大公约数(欧几里德递归算法),然后用它来映射商——如果它们与另一个集合完全相等,那么它就相等,否则就不相等。只有当集合的大小和映射相等时,这才有效

    根据我对你的问题的理解,你可以找到一个集合的最大公约数(欧几里德递归算法),然后用它来映射商——如果它们与另一个集合完全相等,那么它就相等,否则就不相等。只有当集合的大小和映射相等时,这才有效

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


    x、 在你们的例子中,y,z,w,h是一个5维向量。当向同一方向显示时,它们属于同一类,但可能具有任意长度。

    如果我理解您的意思正确,您可以应用向量规范化。例如,通过将3d向量的所有分量分别除以向量长度,将3d向量归一化为1的长度。如果两个标准化向量的分量相等,则它们的原始(非标准化)向量指向相同的方向(我认为您将其定义为“相等”)


    x、 在你们的例子中,y,z,w,h是一个5维向量。当显示方向相同时,它们属于同一类,但可能具有任意长度。

    旁白:我假设集合S实际上是定义中的集合V

    我认为Uli走上了正确的道路,尽管我不认为Set(Set(E)).equals()对于您的目的是有效的。(抱歉,我无法通过lt或gt符号)


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

    放在一边:我假设集合s实际上是定义中的集合V

    我认为Uli走上了正确的道路,尽管我不认为Set(Set(E)).equals()对于您的目的是有效的。(抱歉,我无法通过lt或gt符号)


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

    您对等价性的定义是什么?为什么要将元素映射为整数?例如,你不能用一个集合来表示你的等价关系吗?这样,您就可以免费获得equals()的正确实现。您对等价性的定义是什么?为什么要将元素映射到整数?例如,你不能用一个集合来表示你的等价关系吗?这样,您就可以免费获得equals()的正确实现。