在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当且仅当,
对于任何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
感谢。
答案 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),但增长非常缓慢。