【发布时间】:2012-03-26 18:03:15
【问题描述】:
问题
我想知道如何有效地比较两种集合类型(列表、集合、映射等)。应该注意的是,需要的是结构相等而不是基于引用的相等。
通常必须遍历集合的所有元素并在它们之间进行比较,每次比较的成本为 O(1),产生惊人的 O(n) 比较时间。
这可能会影响使用冲突检查相当昂贵的列表哈希表或使用合同设计(例如,将旧集合与新集合进行比较)。
电流解的方向
虽然我有一些方法可以确定快速解决方案,但它们似乎都是概率性/非确定性的。想法是,是否能够使用可以存储和比较的所有元素的某种唯一哈希。一个好的散列算法应该提供足够的熵,使得碰撞的可能性很小。
这种基于哈希的比较技术可以通过使用某种列表头的恒定时间比较来加强(比如比较前 10 个元素)。在开始时具有相同元素并使用良好哈希算法的两个列表在理论上应该提供一些独特的比较。
问题
是否可以创建一种恒定时间比较(泛化和专门化某个时间,如整数),是否可以通过唯一哈希技术来实现?
更新
为了澄清这个问题,我不需要一个完美的平等检查,而是一个快速的“预先平等”检查,作为一种在之后加快真正平等检查的方法。虽然许多哈希码实现对于集合比较很有用,但我也对列表(有序)比较感兴趣。
【问题讨论】:
-
你关心集合中元素的顺序,还是只关心它是否包含任何顺序的相同对象?
-
等式应该包含集合属性,即一个列表应该是有序的,一个集合应该包含唯一的元素等等。
-
您的集合是否经常包含相同数量的元素,或者它们往往包含大量不同数量的元素?
-
@EricJ。对于不同数量的元素,通常很容易进行长度检查(如果设计正确,对于许多集合)。因此,它更多地是区分我正在寻找的相同数量元素的集合的一种方式。
-
我会说计算集合和 有序 列表的哈希值在组合上没有区别。
标签: performance algorithm