基于与另一个NSSet中的不同对象的相等性来过滤NSSet

时间:2013-12-16 20:36:23

标签: ios objective-c core-data nspredicate nsset

我有两种类型的对象。

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)更好的解决方案。任何线索都会非常感激。

1 个答案:

答案 0 :(得分:0)

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

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

让我们说这些属性是

  • NSString * s
  • NSInteger i

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

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

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