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

时间:2017-05-14 19:09:16

标签: c algorithm set set-theory equivalence-classes

假设我有两组项目,并且有一个函数来检查两个项目的等价性(不严格相等,这样一个项目可能等同于另一个项目中的多个项目),我想确定是否有一对一的对应关系,使得每个对的等价性成立。

是否有针对此问题的既定/最佳解决方案?

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

1 个答案:

答案 0 :(得分:1)

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

  1. 等效项具有相同的哈希值
  2. 等效的项目很少具有相同的哈希值
  3. 请注意,完美的哈希函数永远不会为不相等的项生成相同的哈希值。

    一旦有了哈希函数,就可以按哈希值对列表进行排序。如果您的哈希是完美的,那么检查一对一的通信是微不足道的。如果散列函数不完美,当你发现n对n的对应关系时,代码将需要回退到那些n项的强力O(n ^ 2)等价检查。

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

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

    因此,对于强力比较,使用完美散列函数的总运行时间为O(NlogN)与O(N ^ 2)的运行时间相比。