根据与另一个 NSSet 中的不同对象的相等性过滤 NSSet



我有2种类型的对象。

类 A 是 NSManagedObject 的一个子类。B类是NSObject的一个子类。

S(A) 是包含类 A 对象的 NSSet。S(B) 是包含 B 类对象的 NSSet。

我在 A 类上有一个自定义比较器,以确定它是否与 B 类的对象匹配。

我需要过滤 S(A),以便在过滤操作后,只有那些在 S(B) 中具有有效匹配的对象保留在 S(A) 中。

我目前的朴素解决方案迭代 S(A),并且对于每个对象迭代 S(B),其时间复杂度为 O(mn)(m 是 S(A) 的大小,n 是 S(B) 的大小)。

这里最大的限制是 A 是 NSManagedObject 的子类,因此我不能覆盖 -isEqual: 和 -hash 方法来利用 NSMutableSet 上的 -intersectSet: 方法。

我正在寻找比 O(mn) 更好的解决方案。任何线索将不胜感激。

我能够使用以下方法找到这个问题的 O(m+n) 解决方案。

类 A 和 B 之间的自定义比较器依赖于字符串比较和整数相等。

假设这些属性是

  • NSString *s
  • NSInteger i

我创建了一个 NSMutableDictionary,其中包含类 A 和键的对象作为字符串 s 和整数 i 的哈希。这个过程是O(m),因为它涉及对S(A)的迭代。

在此之后,我迭代 S(B),并使用字符串 s 和整数 i 从类 B 的对象创建相同的哈希,并在上面的创建 NSMutableDictionary 中查找对象。如果存在匹配项,则执行所需的操作。此过程为 O(n)。

虽然此解决方案占用的空间更大,但速度快了一个数量级。

最新更新