如何在Java中实现等价类?
在Java中实现等价类的简单方法是什么?有没有用于此目的的图书馆?如何在Java中实现等价类?
困扰的部分是如何编写一个高效率和非天真的“平等”操作符。
让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
视为相同的等价类。
当集合S的基数变大时,天真的“相等”运算符可能很快变得耗时。
简单的方法是什么?任何想法?
[EDITED]为了澄清,具体问题可如下形式化:
设S是一个非空集。我们用M表示一组从V到整数的部分映射。这是比较容易证明,下面定义的二元关系\ SIM导出上M.
的等价关系对于M1和M2 M的两个部分映射中,m1 \ SIM平方米当且仅当,
- 对于V中的任何一个,定义m1(a)当且仅当m2(a)被定义为
-
对于任意a,b的V,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向量标准化为1的长度。如果两个归一化向量的分量相等,它们的原始(非归一化)向量指向相同的方向(这是我认为你定义为'相等')
x,y,z,w,h会在你的情况是一个5维向量。当同一方向展示时,它们属于同一类,但可能具有任意长度。
另外:我假设集合S实际上是你定义中的集合V.
我认为Uli是在正确的轨道上,尽管我不会认为Set(Set(E))。equals()对于您的目的是有效的。(对不起,我无法获得lt或gt符号)
Set(E).equals()的默认实现可能是O(n log n)或O(n^2)。 Set(E).equals()几乎肯定涉及排序; O(n日志n)一样好。我建议你看看基数排序。它是O(n * log n),但增长非常缓慢。
你在这里定义的等价性是什么? – 2013-02-17 21:53:41
请参阅我的编辑部分。 – zell 2013-02-18 06:06:08
为什么你将元素映射到整数?例如,你能不能用Set>来表示你的等价关系?这样你就可以免费得到equals()的正确实现。 –
2015-07-15 13:08:32