2013-12-16 37 views
0

我有兩種類型的對象。基於與另一個NSSet中不同對象的相等性過濾NSSet

A類是NSManagedObject的子類。 B類是NSObject的一個子類。

S(A)是含有類A. S(B)爲含有類B的對象的NSSet中的對象的NSSet中

我對類A的自定義比較找出如果它匹配的B的對象。

我需要過濾S(A),使得在過濾操作後,只有那些對象保留在S(A)中,它們在S(B)中有一個有效的匹配。 (A),並且每個對象在時間複雜度爲O(mn)的S(B)上迭代(m是S(A)的大小,n是大小的S(B))。

這裏最大的約束是A是NSManagedObject的子類,因此我無法重寫-isEqual:和-hash方法以利用NSMutableSet上的-intersectSet:方法。

我正在尋找比O(mn)更好的解決方案。任何線索將不勝感激。

+0

有什麼辦法來訂購這兩套,以便找到一個匹配比O(n)更快? –

+0

什麼構成等價?一個鍵/值對?你能利用它嗎?作爲一個集合,你可以刪除匹配的項目,因爲你知道它們不能再被看到。 – Wain

+0

等效性基於1個字符串比較和1個整數相等。 –

回答

0

我能夠通過使用以下方法找到此問題的O(m + n)解決方案。

A類和B類之間的自定義比較依賴於字符串比較和整數相等。

比方說這些性質

  • 的NSString * S
  • NSInteger的我

我創建一個NSMutableDictionary與類A和密鑰的對象作爲字符串s的散列和整數i 。這個過程是O(m),因爲它涉及對S(A)的迭代。

之後我迭代S(B),並使用類B的對象中的字符串s和整數i創建相同的散列,並在上面的創建NSMutableDictionary中查找對象。如果存在匹配,我執行所需的操作。這個過程是O(n)。

儘管此解決方案需要更大的空間,但速度要快一個數量級。

+0

或者你可以應用類似的技術從這:http://stackoverflow.com/questions/20624429/compare-2-nsarrays-in-objective-c/20624929#20624929 – user523234

+0

@ user523234這將無法正常工作,因爲在我的情況下我不能使用-containsObject或其他任何依賴於-isEqual屬性的東西。我在上面提到的問題陳述中提到過。 –

+0

對,使用你的「自定義比較器」....並在塊中返回YES或NO。 – user523234