在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当且仅当,
谢谢。
发布于 2013-02-17 22:04:47
根据我从你的问题中了解到的,你可以找到一个集合的最大公因子(欧几里得算法)一次,然后用它来映射商--如果它们和另一个集合完全相等,它是相等的,否则就不是。只有当集合大小和映射相等时,这才能工作。
发布于 2013-02-17 22:25:23
如果我理解你的正确,你可以应用向量归一化。例如,通过将三维矢量的所有分量与矢量长度分开,将其归一化为1的长度。如果两个归一化向量的分量相等,它们的原始(非归一化)向量指向同一个方向(我认为这就是你定义的“相等”)。
在你的例子中,x,y,z,w,h是一个5维向量。它们属于同一类时,显示方向相同,但可能有任意长度。
发布于 2016-10-22 04:06:17
旁白:我假设集合S实际上是定义中的集合V。
我认为Uli在正确的轨道上,尽管我不认为Set(Set(E)).equals()对您的目的是有效的。(对不起,我不能让它或gt符号通过)
Set(E).equals()的默认实现可能是O(n_log n)或O(n^2)。Set(E).equals()几乎肯定涉及排序;O(n_log n)尽可能好。我建议你看看基数。它是O(n*log n),但生长非常缓慢。
https://stackoverflow.com/questions/14926490
复制相似问题