2013-04-21 60 views
0

聲明:我對iOS開發比較陌生。我爲這個項目使用ARC。NSMutable對象:removeAllObjects與containsObject速度

我想知道哪些操作更快,爲什麼?

if([selectedIndexes containsObject:indexPath]) { 
    [selectedIndexes removeAllObjects]; 
    for(int i=0; i<self.options.count; i++) { 
     [selectedIndexes addObject:[NSIndexPath indexPathForItem:i inSection:0]]; 
    } 
} 

OR

NSIndexPath *indexPath; 
if([selectedIndexes containsObject:indexPath]) { 
    for(int i=0; i<self.options.count; i++) { 
     indexPath = [NSIndexPath indexPathForItem:i inSection:0]; 
     if(![selectedIndexes containsObject:indexPath]) 
      [selectedIndexes addObject:indexPath]; 
    } 
} 

編輯1

真正的問題是這是否做removeAllObjecs,然後加回來的東西會工作得更快或者必須檢查的項目是已經不在那裏,把它添加到集合?

+4

你不能只使用[NSMutableIndexSet](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMuta bleIndexSet_Class /參考/的reference.html)? – 2013-04-21 13:51:15

+2

這真的是你的應用程序的時間關鍵部分?如果沒有,我會把它留給編譯器來產生一個合理的代碼。 – 2013-04-21 13:52:53

+0

你想做什麼?你能解釋一下你的代碼中self.options的作用嗎? – Anupdas 2013-04-21 14:02:34

回答

1

允許分析此(即包裹迴路if是相同的,所以我會忽略它):

選項1:
-removeAllObjects:所有對象都從陣列中移除,每個被釋放一次= =>在最小個運算==> O(N)
環路使得N次迭代的每一個:
*創建NSIndexPath ==> O(1)
*添加索引路徑的端部(1)+ N * O(1)= 2O(N)+ 2 * N * O(1)O(1)O(1)
==> O(N)+ O(N)+ N * = 4O(N) = O(N)

選項2:
環路使得N次迭代的每一個:
*創建NSIndexPath ==> O(1)
*驗證存在陣列中==> O( N)(一個數組必須假定它可能包含重複數據)
* if語句也會有問題,因爲它會被詢問N次,並且會擾亂循環的分支預測。 (O(1)+ O(N)+ O(1))= N * O(N)這個循環中的加法是一個概率問題(現在讓我們忽略它)
** N * + 2 * N * O(1)= O(N^2)

==>扁平化分析表明第一個選項更好。

如果你使用一個NSMutableIndexSet你的代碼是這樣的兩個選項:

//Not tested 
//Assume that selectedIndexes is a NSMutableIndexSet 
if ([selectedIndexes containsIndex:indexPath.row]) { 
    if (self.options.count) {//This could probably be optimised depend on your goal 
     [selectedIndexes addIndexesInRange:NSMakeRange(0,self.options.count-1)]; 
    } else { 
     [selectedIndexes removeAllIndexes]; 
    } 
} 

==>這裏的最壞情況下的複雜性很可能是O(N)

請隨時糾正任何錯誤的假設或計算