我有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)。
虽然此解决方案占用的空间更大,但速度快了一个数量级。