C 确定与等价函数一一对应的算法

C 确定与等价函数一一对应的算法,c,algorithm,set,set-theory,equivalence-classes,C,Algorithm,Set,Set Theory,Equivalence Classes,假设我有两组项目,以及一个检查两个项目等价性的函数(不是严格相等,因此一个项目可能等价于另一组中的多个项目),我想确定是否存在一对一的对应关系,从而使每一对项目保持等价性 这个问题有没有既定的/最佳的解决方案 这个问题最初来自于确定两个C联合类型是否兼容,对于这两个C联合类型,标准要求这样的对应,但是事情变得棘手,因为联合成员可以是匿名的,因此一个项目的等效项目可以有多种可能性。目前我采用的是一种简单的方法,但我想知道是否有任何关于它的讨论/解决方案。一种解决方案是实现一个具有两个属性的哈希函

假设我有两组项目,以及一个检查两个项目等价性的函数(不是严格相等,因此一个项目可能等价于另一组中的多个项目),我想确定是否存在一对一的对应关系,从而使每一对项目保持等价性

这个问题有没有既定的/最佳的解决方案



这个问题最初来自于确定两个C联合类型是否兼容,对于这两个C联合类型,标准要求这样的对应,但是事情变得棘手,因为联合成员可以是匿名的,因此一个项目的等效项目可以有多种可能性。目前我采用的是一种简单的方法,但我想知道是否有任何关于它的讨论/解决方案。

一种解决方案是实现一个具有两个属性的哈希函数:

  • 相等的项具有相同的哈希值
  • 不相等的项很少具有相同的哈希值
  • 请注意,完美哈希函数永远不会为不等价的项生成相同的哈希值

    一旦有了散列函数,就可以按散列值对列表进行排序。如果您的散列是完美的,那么检查一对一的对应关系就很简单了。如果哈希函数不够完美,当您找到一个n对n的对应关系时,代码将需要对那些
    n
    项进行强制O(n^2)等价性检查

    运行时间是以下任务的总和

    • O(N)生成散列值
    • O(NlogN)对列表进行排序
    • M*O(n^2)用于暴力检查(如果哈希函数不完美)

    因此,与蛮力比较的运行时间O(N^2)相比,完美哈希函数的总运行时间为O(NlogN)。

    我们可以假设等价(由say定义)≡") 是可传递的,即如果
    a≡ b
    b≡ c
    然后
    a≡ c
    ?@Dukeling在这种情况下,很遗憾,不是。因为类型A、B、c可能用相同的标记声明,如果A和c是完整类型,但B不是,transive属性被破坏了。但我仍然想知道它是否真的是,是否有任何关于它的既定讨论?如果它是传递的,到目前为止发布的答案应该可以很好地解决问题(我不知道任何“已建立的讨论”)。如果它不是可传递的,我很确定它是NP完全的(即,假设对于一般情况来说,求解速度非常非常慢),尽管我目前还没有这方面的证据。只有在OP的“等价性”下,这样的哈希函数才有可能“概念确实是一种等价关系;但从他/她的后续评论来看,显然不是。此外,即使它是一种等价关系,也可能无法在其上计算有意义的哈希代码;请参阅。