0

免责声明:我对 iOS 开发比较陌生。我在这个项目中使用 ARC。

我想知道这些操作中哪个更快,为什么?

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

或者

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

1 回答 1

1

让我们分析一下(if包装循环的内容是相同的,所以我将忽略它):

选项1::
-removeAllObjects从数组中删除所有对象,每个对象释放一次 ==> 最少 N 次操作 ==> O(N)
循环进行 N 次迭代,每次迭代:
* 创建一个NSIndexPath==> O(1)
* 将索引路径添加到数组末尾 ==> O(1)
==> O(N) + O(N) + N*O(1) + N*O(1) = 2O(N) + 2*N*O(1) = 4O(N) = O(N)

选项 2:
循环进行 N 次迭代,每次迭代:
* 创建一个NSIndexPath==> O(1)
* 验证数组中是否存在 ==> O(N)(数组必须假定它可能包含重复项)
*if语句将也有它的代价,因为它将被询问 N 次,并且会弄乱循环的分支预测。
** 循环中的加法是一个概率问题(让我们暂时忽略它)
==> N*(O(1) + O(N) + O(1)) = N*O(N) + 2*N *O(1) = O(N^2)

==> 平面分析表明第一个选项更好。

如果您要使用 aNSMutableIndexSet您的代码对于这两个选项将如下所示:

//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)

请随时纠正任何错误的假设或计算

于 2013-04-21T18:18:18.523 回答