【问题标题】:Algorithm to determine one-to-one correspondence with an equivalence function确定与等价函数一一对应的算法
【发布时间】:2017-05-14 19:09:16
【问题描述】:

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

对于这个问题是否有任何既定/最佳的解决方案?


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

【问题讨论】:

  • 我们可以假设等价(由say“≡”定义)是可传递的,即如果a ≡ bb ≡ c然后a ≡ c
  • @Dukeling 在这个 C 案例中,遗憾的是,没有。因为类型 A、B、C 可以用相同的标签声明,并且如果 A 和 C 是完整类型但 B 不是,则传递属性被破坏。但我仍然想知道它是否真的是,是否有任何既定的讨论?
  • 如果它是可传递的,那么到目前为止发布的答案应该可以很好地解决问题(我不知道任何“既定讨论”)。如果它不是可传递的,我很确定它是 NP 完全的(即假设解决一般情况真的非常慢),尽管我目前还没有证据证明这一点。

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


【解决方案1】:

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

  1. 等价的项目具有相同的哈希值
  2. 等价的项目很少有相同的哈希值

请注意,完美的哈希函数永远不会为不等价的项目生成相同的哈希值。

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

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

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

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

【讨论】:

  • 只有当 OP 的“等价”概念是真正的等价关系时,这样的哈希函数才有可能;但从他/她的后续评论来看,显然不是。此外,即使它等价关系,也可能难以在其上计算出有意义的哈希码;见cstheory.stackexchange.com/questions/10702
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2017-02-21
  • 2023-03-13
  • 2010-09-18
相关资源
最近更新 更多