假设我有两组项目,并且有一个函数来检查两个项目的等价性(不严格相等,这样一个项目可能等同于另一个项目中的多个项目),我想确定是否有一对一的对应关系,使得每个对的等价性成立。
是否有针对此问题的既定/最佳解决方案?
这个问题最初来自于确定两个C联合类型是否兼容,标准需要这样的对应关系,但事情变得棘手,因为联合成员可以是匿名的,因此项目的等效项可以有多种可能性。目前我采用了一种天真的方式,但我想知道是否有任何建立讨论/解决方案。
答案 0 :(得分:1)
一种解决方案是实现具有两个属性的哈希函数:
请注意,完美的哈希函数永远不会为不相等的项生成相同的哈希值。
一旦有了哈希函数,就可以按哈希值对列表进行排序。如果您的哈希是完美的,那么检查一对一的通信是微不足道的。如果散列函数不完美,当你发现n对n的对应关系时,代码将需要回退到那些n
项的强力O(n ^ 2)等价检查。
运行时间是以下任务的总和
因此,对于强力比较,使用完美散列函数的总运行时间为O(NlogN)与O(N ^ 2)的运行时间相比。